M5Stack Basic | インターホンをLINEに通知する

インターホンの音がとても苦手です。
来ると分かっていてもビックリする。

ということでインターホンの音はオフにして、来客をLINEに通知する仕組みを作ります!

LINEの着信音なら聞きなれているのでビックリしない!はず

スポンサーリンク

M5Stackで光センサーを使って来客をLINEに通知する

コード全文は最後に載せています!

システム図

仕組みはとてもシンプルです。
インターホンが押されるとインターホンの画面が点くので
その光をセンサーで検出してM5StackがWi-FiでLINEに通知を飛ばします。

光センサーの調整

光センサーはこちらを使います
光センサーの使い方はこちらで解説しています
インターホン用センサー

こんな感じでセロハンテープでペタッと貼り付けました。
画面が点いていないときはデジタル出力が「1
画面が点いたときは「0」となるように半固定抵抗を回して調節します。

センサーの出力をアナログ/デジタル両方の値で確認しながら
半固定抵抗をドライバで回していくと調整しやすいです

Wi-FiでLINEに通知を送るコードを追加

LINE Notifyを使って通知を送ります。

LINE Notifyに通知を送る方法はこちらで解説しています

光センサーとLINE Notifyのコードを組み合わせればもう完成です!

実際に使ってみる

インターホンとM5Stackの接続

とりあえず設置してみました。
※ 実際に使うときはUSB Type-CケーブルをM5Stackに接続して電源を取ってください。

LINEトーク画面

試しにインターホンの画面を点けてみると・・・通知がきました!

M5Stackをtypoしてるのは見逃してください・・・

今回のサンプルコード

以下のコードでは光センサーの出力をM5StackのGPIO35, GPIO36に繋いでいます。

#include <M5Stack.h>
#include <WiFiClientSecure.h>
#include <ssl_client.h>

void l_notify(String msg);

const char* ssid = "YOUR SSID";
const char* password = "YOUR PASSWORD";

// int analogRead_value = 0;
int digitalRead_value = 0;
int push_count = 0;

void setup() {
  M5.begin();
  M5.Speaker.begin();
  M5.Speaker.mute(); // to reduce noise sound
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextColor(WHITE, BLACK);
  M5.Lcd.setTextSize(2);
  pinMode(36, INPUT_PULLUP); // for digital read
  WiFi.disconnect();
  M5.Lcd.setCursor(10, 10);
  M5.Lcd.printf("WiFi setup ... ");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED){
    delay(500);
  }
  M5.Lcd.printf("Done.");
  M5.Lcd.setCursor(10, 50);
  M5.Lcd.printf("STANDBY .......... ");
  delay(1000);
}

void loop() {
  delay(3000);
//   analogRead_value = analogRead(35);
  digitalRead_value = digitalRead(36);
  
  M5.Lcd.setCursor(10, 30);
//  M5.Lcd.printf("light level = %4d (%d)", analogRead_value, digitalRead_value);
  M5.Lcd.printf("light_value = %d", digitalRead_value);

  if (!digitalRead_value) {
    M5.Lcd.setCursor(10, 50);
    M5.Lcd.printf("TRIGGERD ... ");
    l_notify("ding dong");
    M5.Lcd.printf("Done.");
    push_count += 1;
    delay(30000);
    M5.Lcd.setCursor(10, 50);
    M5.Lcd.printf("STANDBY .......... ");
    M5.Lcd.setCursor(10, 70);
    M5.Lcd.printf("count = %d", push_count);
  }
}

void l_notify(String msg) {
  const char* host = "notify-api.line.me";
  const char* token = "YOUR TOKEN";
  WiFiClientSecure client;
  if (!client.connect(host, 443)) {
    delay(2000);
    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);

  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      break;
    }
  }
  String line = client.readStringUntil('\n');
  delay(2000);
}

LCDにWi-Fiの接続状況やセンサーの読み取り値、
通知を送った回数などを表示するようにしました。

M5Stack画面

最終的にはデジタルのセンサー出力のみ使用しています。
GPIOはアナログ入力ができる35番、36番を使っていますが
デジタルのセンサー出力はアナログピンじゃなくてもOKです。

このコードでは3秒に一回センサーの値をReadして、
通知を送ったあとは30秒のdelayを入れています。

システム設置のその後

ちゃんと通知が来ています。
宅配便が届く予定の日だけ電源を入れています。
インターホンが押されてから通知まで多少のタイムラグはありますが仕方なし。

コメント

タイトルとURLをコピーしました