見出し画像

LINEでぴんぽ~ん

なんだかしらんけど、noteを始めてみる…情報を記録しておくのも悪くない

今の時代、公開されている情報を組み合わせることで自分が感じている不便を解消することができる(事がある)

さて、これなんだけれど

どうやって実現しているかとのコメントが数件ありました
私自身も公開されている情報からこの機能を実現しているだけです

やることは以下
【前提条件】

  • 呼び鈴の改造に関する知識がない場合は、絶対に実施しないでくだい
    ⚠場合によっては感電のリスクがありますので、絶対に禁止⚠

  • ネットワークアクセスが可能なマイコンが用意できること(ESP32とか、Arduino uno LANシールドとか)

  • 上記マイコンに対する開発環境があること(Arduino IDEなど)

  • Hardwareの知識があること

  • Software開発の知識または簡単なコードが読めること

  • HTMLの構文が少し理解できること

  • LINEのアカウントがあること

【手順】

  1. LINE Notify APIのアクセストークンの取得

  2. 呼び鈴にHardwere的な改造(呼び鈴の仕様による)

  3. マイコンのハードウェア作成(ここではESP32 DevKit(⇦秋月電子へリンク)を使用 )

  4. コーディングしてマイコンへの書き込み

  5. LINE通知の試験

1.LINE Notify APIのアクセストークンの取得

上記リンクなど、WEBを検索すると「LINE Notify APIのアクセストークンの取得」方法がいろいろなところに記載されています
LINEの設定に色々と条件があるので、内容をよく確認してからトークンの取得をします

2.呼び鈴にHardwere的な改造

呼び鈴の仕様によるので、最適な方法を自身で考える必要があります
呼び鈴によっては高電圧が流れているものもありますので、その知識がない場合は実施しないことをおすすめします
私の場合は、簡素化のためにリレーによって外部に接点信号を出してあります
なので、呼び鈴の本体とはアイソレーション(絶縁)されている状態です

3.マイコンのハードウェア作成

ここでは、ユニバーサル基板にESP32 DevKitを取り付けていますが、目的はDCコネクタの設置と入力信号線のコネクタ設置だけなので、素のESP32 DevKitをUSB給電で使ってもいいと思います

4.コーディングしてマイコンへの書き込み

取得したLINE Notify APIのアクセストークンを使って、以下のようにコーディング
自分の環境に合わせて、Wi-Fi SSID / Password を適宜設定してください

【サンプルコード】
このコードでは、スイッチが押されたことを割り込みを使って検知しています
時間をntpで取得しています
場合によっては不要なコードも入っていると思うので、適宜修正してくださいね

/*
  2022/11/12 ピンポ~ンのLINE通知
*/
#define DEBUG	// デバッグ情報が欲しい場合は任意で

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <time.h>

// WiFi設定
const char* ssid     = "Your_SSID";	// SSIDを設定
const char* password = "Your_Wi-Fi_Password";	// Wi-Fiパスワードを設定

// LINE Notify設定
const char* host = "notify-api.line.me";
const char* token = "LINE_Notify_API_Token";	// 取得したLINE notify APIトークンを設定
const char* message = "ピンポ~ン 玄関呼び鈴が押されました";	// 通知に表示するメッセージ

// NTP Settings
#define TIMEZONE_JST	(3600 * 9)		// 日本標準時は、UTC(世界標準時)よりも9時間進んでいる。
#define DAYLIGHTOFFSET_JST	(0)		// 日本は、サマータイム(夏時間)はない。
#define NTP_SERVER1		"ntp.nict.jp"	// NTPサーバー
#define NTP_SERVER2		"ntp.jst.mfeed.ad.jp"		// NTPサーバー
static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"}; // week

// スイッチに使用するPinの設定
int sw_pin = 34;	// 呼び鈴の接点を接続するピン番号を設定

// スイッチの変数宣言
int interrrupt_flag = 0;

// 連続呼び鈴押し抑止変数
int state_counter = 0;
const int delay_timer = 100; // ms loop
const int timer = (10 * 1000) / delay_timer; // sec * 1000(ms) / delay

void setup()
{
  // スイッチPinを入力に設定
  pinMode(sw_pin,INPUT_PULLUP);

  // Pinを割り込み設定
  attachInterrupt(sw_pin, sw_interrupt, FALLING);

  #if DEBUG
  // シリアルモニタの通信速度
  Serial.begin(11520);

  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  #endif

  // WiFi接続
  WiFi.begin(ssid, password);

  // NTP同期
  configTime( TIMEZONE_JST, DAYLIGHTOFFSET_JST, NTP_SERVER1, NTP_SERVER2 );

  // WiFiの接続状態を確認
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }

  #if DEBUG
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  #endif
}

// line通知
void send_line() {
  char time_date[28];

  // HTTPSへアクセス(SSL通信)するためのライブラリ
  WiFiClientSecure client;

  // サーバー証明書の検証を行わずに接続する場合に必要
  client.setInsecure();
  
  Serial.println("Try");
  
  //LineのAPIサーバにSSL接続(ポート443:https)
  if (!client.connect(host, 443)) {
    Serial.println("Connection failed");
    return;
  }
  Serial.println("Connected");

  // 現在時刻の取得
  time_t timeNow = time(NULL);
  struct tm* tmNow = localtime(&timeNow);
  sprintf(&time_date[0], "%04d/%02d/%02d(%s) %02d:%02d:%02d : ",
        tmNow->tm_year+1900, tmNow->tm_mon+1, tmNow->tm_mday,
        wd[tmNow->tm_wday],
        tmNow->tm_hour, tmNow->tm_min, tmNow->tm_sec);

  // リクエスト送信
  String query = String("message=") + String(time_date) + String(message);
  String request = String("") +
               "POST /api/notify HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Authorization: Bearer " + token + "\r\n" +
               "Content-Length: " + String(query.length()) +  "\r\n" + 
               "Content-Type: application/x-www-form-urlencoded\r\n\r\n" +
                query + "\r\n";
  client.print(request);
  #if DEBUG
  Serial.println(request);
  #endif
 
  // 受信完了まで待機 
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      break;
    }
  }
  
  #if DEBUG
  String line = client.readStringUntil('\n');
  Serial.println(line);
  #endif
}

void sw_interrupt()
{
  interrrupt_flag = 1;
}

void loop(){
  if (state_counter < timer) interrrupt_flag = 0;

  if ( interrrupt_flag == 1)
  {
    delay(50); // 50ms wait to avoid noise.
    if (digitalRead(sw_pin) == LOW)
    {
      send_line();
      interrrupt_flag = 0;
      state_counter = 0;
    }
  }
  delay(delay_timer);
  state_counter++;
  if (state_counter >= timer) state_counter = timer;
}

4.LINE通知の試験

設定部分の変更・追加を行いコードをマイコンに書き込み
入力PinをGNDに接触させ、LINE通知が来るかどうかを確認
動作したら、呼び鈴の接点に接続して完成

以上ですが、細かいところで動きを確認していないので、動かなかったら自己解決でお願いいたします

この記事が気に入ったらサポートをしてみませんか?