M5StickCからスマートフォンへ通知 ~ LINE Notifyを使って防犯装置を作る

2022年9月17日

今までM5Stack系でセンサーの計測結果を他のデバイスへ通知するのにUDPソケット通信を使っていましたが、通信の受け側を常時待機させて確実に通知させることが難しいという問題がありました。

そこで、何か良い方法はないものかと探していたところ、以下のサイト様の記事が目に留まりました。

なるほど、LINEに結果を通知すれば良いのですね。これであれば、通知が来たことが分かりやすいです。そこで、以前作った、PIRモーションセンサーを使って人を検知するプログラムにLINEへ通知する仕組みを加えてみました。

※LINE Notifyのサービスが、2025年3月31日に終了します。残念です。

これは、昨今の事件を防ぐのに有効だと思います。しかし、あくまでも仕組みの検証であって、実用的にするには更なる検知方法とプログラムを作り込む必要があります。ここで紹介するシステムを、安易に実用では使わないでください、(当方は一切の責任を負いません)

1.LINE Notify でアクセストークンを発行する

LINE Notifyのサイトへ移動します。そして、LINEのアカウントでログインします。私はLINE公式しかやっていないのですが、LINE公式のアカウントは使えませんでした。そのため、通常LINEアカウントを使用してください。(仮のLINEカウントを作りました)

さて、サイト内を見渡してもアクセストークンの発行が見つかりません。最初にメニューの「マイページ」を選択します。

すると、アクセストークンの発行が表示されます。「トークンを発行する」を押します。

ポップアップウインドウが表示されます(ノートの低解像度では画面に入りきらない)。トークン名を入力して、「1:1でLINE Notifyから通知を受け取る」を選択します。

そして、「発行する」を押します。

トークンが発行されます。このトークンを使ってM5StickCからスマートフォンLINEアプリへメッセージを送ります。

2.M5StickC側プログラム

PIRモーションセンサーのプログラムに、LINE Notify処理のロジックを追加します。「CRAFT GoGo」さんのロジックを参考にさせて頂いています。

#include <M5StickC.h>
#include <WiFiClientSecure.h>

// Wi-Fi環境
const char* ssid = "XXXXXXXXXX";
const char* password = "XXXXXXXXXX";

// Line Notify環境
const char* host = "notify-api.line.me";
const char* token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // トークン

WiFiClientSecure client; // https接続

bool isActive = false ; // trueの時だけ通知する

// LINE Notify処理関数
void Line_Notify(String msg) {
  client.setInsecure();
  if (!client.connect(host, 443)) {
    delay(2000);
    M5.Lcd.print("Line Notify disconnect");
    return;
  }

  String query = String("message=") + msg;
  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);
  client.stop();

  delay(2000);
}

void setup() {
  // put your setup code here, to run once:
  M5.begin();
  M5.Lcd.setRotation(3);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.println("PIR LINE Notify");

  pinMode(GPIO_NUM_36,INPUT_PULLUP); // PIR
  pinMode(GPIO_NUM_10, OUTPUT); // 内蔵LED
    digitalWrite(GPIO_NUM_10, HIGH);

  // Wi-Fiの接続
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED){
    M5.Lcd.print('.');
    delay(500);
  }
  M5.Lcd.print("\r\nWiFi connected\r\nIP address: ");
  M5.Lcd.println(WiFi.localIP());

  delay(2000);
}

void loop() {
  // put your main code here, to run repeatedly:
  M5.update();

  if (M5.BtnA.wasPressed()) {
    if (!isActive) {
      isActive = true ;
      M5.Lcd.println("\r\nPlease leave within 60 seconds.");
      delay(60000); // 60秒以内に離れてください
      M5.Lcd.fillScreen(BLACK);
    }
  }

  if (isActive) {
    if (digitalRead(GPIO_NUM_36)) {  
      digitalWrite(GPIO_NUM_10, LOW);
      Line_Notify("人を検出しました!");
      delay(30000); 
    } else {
      digitalWrite(GPIO_NUM_10, HIGH);
    }
  }  

}

プログラムを起動したら、Aボタンを押してください。Line Notifyへの通知が始まります。そして、60秒以内M5StickCから離れてください。Aボタン押下60秒後から検出が始まります。

人を検出すると、Line Notifyへメッセージが送られます。

アラームと共に、スマートフォンLINEアプリにメッセージが届きます。これは確実な通知方法ですね。

M5StickC Plus
スイッチサイエンス

3.LINE Notifyはいろいろな実用システムで活用できそう!

LINE Notifyを利用することで、とても簡単に通知システムが出来ました。これであれば、いろいろな実用システムで活用できそうです。例えば、病室にあるような呼び出しボタンなら、Atom Liteを使って激安で構築できるのではと思いました。きっと、従来の通知システムを置き換えるのに最適なのではないでしょうか。

今後、もっと実用的なLINE Notifyのシステムを作ろうと思います。