インターホンの音がとても苦手です。
来ると分かっていてもビックリする。
ということでインターホンの音はオフにして、来客をLINEに通知する仕組みを作ります!
LINEの着信音なら聞きなれているのでビックリしない!はず
M5Stackで光センサーを使って来客をLINEに通知する
コード全文は最後に載せています!
システム図
仕組みはとてもシンプルです。
インターホンが押されるとインターホンの画面が点くので
その光をセンサーで検出してM5StackがWi-FiでLINEに通知を飛ばします。
光センサーの調整
こんな感じでセロハンテープでペタッと貼り付けました。
画面が点いていないときはデジタル出力が「1」、
画面が点いたときは「0」となるように半固定抵抗を回して調節します。
センサーの出力をアナログ/デジタル両方の値で確認しながら
半固定抵抗をドライバで回していくと調整しやすいです
Wi-FiでLINEに通知を送るコードを追加
LINE Notifyを使って通知を送ります。
光センサーとLINE Notifyのコードを組み合わせればもう完成です!
実際に使ってみる
とりあえず設置してみました。
※ 実際に使うときはUSB Type-CケーブルをM5Stackに接続して電源を取ってください。
試しにインターホンの画面を点けてみると・・・通知がきました!
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の接続状況やセンサーの読み取り値、
通知を送った回数などを表示するようにしました。
最終的にはデジタルのセンサー出力のみ使用しています。
GPIOはアナログ入力ができる35番、36番を使っていますが
デジタルのセンサー出力はアナログピンじゃなくてもOKです。
このコードでは3秒に一回センサーの値をReadして、
通知を送ったあとは30秒のdelayを入れています。
システム設置のその後
ちゃんとLINEきた!まあ宅配ボックスに入れていただくんですが…。 pic.twitter.com/JTH9HXbime
— えだまめ (@edamame2kuri) December 2, 2020
ちゃんと通知が来ています。
宅配便が届く予定の日だけ電源を入れています。
インターホンが押されてから通知まで多少のタイムラグはありますが仕方なし。
コメント