M5stampを使ってLINEにメッセージを送信するlotデバイスを作ろう。
これは何か?
先ずはこちらの動画を見てください。
タイトルにありますが開発モジュール【M5Stamp C3 Mate】を使ってボタンを押したときだけLINEに通知を出せるデバイスになります。
作るに至った経緯
私は親や祖母と暮らしているのですが、90超えた祖母が最近転んで起き上がれないという事がありました。その時は偶々私がいたから良かったのですが、家に祖母以外誰もいない場合も多々。祖母はタブレットは持っているがスマホは所持しておらず、不要なスマホを持たせても良いのですが使い方が覚えきれるか分からない、いざというときに持ち歩いてない、電池が切れてしまっているという事では意味がないので今回のデバイスを作ることにしました。
そこでボタンが押されたらLINEにメッセージ送信してくれればよいのでLINE Notifyを利用することにしました。2000円くらいで作れるので挑戦してみてはいかがでしょうか
※真似をして作成する場合は自己責任でお願いします。
必要な部品
M5Stamp C3 Mate
単4電池ボックス
https://akizukidenshi.com/catalog/g/g102245/
タクトスイッチ(電源用)
https://akizukidenshi.com/catalog/g/g103649/
タクトスイッチ12㎜(送信用)
3.3vDCDCコンバータ
配線 太くなければ何でも良し
トークンの取得
送信したいLINEグループを予め作成、LINENotifyにアクセスしログイン、マイページからトークンを発行するを押し先ほど作成したグループを選択し発行してください。発行したトークンは一度しか表示されないので控えておくように。
ファームウェア
ネットに落ちてたFWをM5StampC3用にChatGPTを使って改造しました。
ArduinoIDEにM5stackのライブラリを追加し以下をコピペ編集してM5StampC3にアップロードしてください。
ご自身で入力する箇所は以下の部分です。
"あなたのWiFi2.4GhzのSSID"; WiFiのSSIDを入力(2.4Ghzに限る)
"WiFiのパスワード"; WiFiのパスワードを入力
"発行したトークン" LINENotifyで発行したトークンを張り付け
"助けてください" 送信するメッセージを入力
M5StampC3本体のスイッチIO3も利用できるので乾電池から分圧抵抗を使ってIO4にADC入力した値を送信できるようにしてみました。(電池残量確認用)実際の配線には乾電池⇒抵抗⇒ADC(IO4)⇒抵抗⇒GNDと接続が必要です。今回は計算が面倒なのでIO5の送信機能だけ利用します。
#include <WiFi.h>
#include <WiFiClientSecure.h>
// WiFi設定
const char* ssid = "あなたのWiFi2.4GhzのSSID";
const char* password = "WiFiのパスワード";
// LINE Notify設定
const char* host = "notify-api.line.me";
const char* token = "発行したトークン";
// スイッチに使用するPinの設定
int sw_pin = 3;
int sw_pin2 = 5; // 5番ピンを追加
int adc_pin = 4; // ADC用のピンを追加
void setup() {
// スイッチPinを入力に設定
pinMode(sw_pin, INPUT_PULLUP);
pinMode(sw_pin2, INPUT); // 5番ピンを入力に設定(プルアップ不要)
pinMode(adc_pin, INPUT); // ADC用ピンを入力に設定
// シリアルモニタの通信速度
Serial.begin(115200);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
// WiFi接続
WiFi.begin(ssid, password);
// WiFiの接続状態を確認
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
// line通知
void send_line(const char* message) {
WiFiClientSecure client;
client.setInsecure();
Serial.println("Try");
if (!client.connect(host, 443)) {
Serial.println("Connection failed");
return;
}
Serial.println("Connected");
String query = String("message=") + 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);
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
break;
}
}
String line = client.readStringUntil('\n');
Serial.println(line);
}
void loop() {
// 3番ピンのスイッチの状態を読み取る
if (digitalRead(sw_pin) == LOW) {
int voltage = analogRead(adc_pin); // IO4ピンから電圧を読み取る
char buffer[50];
snprintf(buffer, sizeof(buffer), "乾電池の電圧: %d", voltage);
send_line(buffer); // 測定した電圧をメッセージとして送信
}
// 5番ピンのスイッチの状態を読み取る
if (digitalRead(sw_pin2) == HIGH) { // スイッチが押されるとHIGHになる
send_line("助けてください"); // 5番ピンのメッセージを指定
}
delay(100);
}
回路図
シンプルな回路になってます。お好みで調整してください。
電源ボタン(青)を押している間だけWIFIに接続され送信ボタン(赤)が押されるとメッセージが送信されます。
ケース
専用ケースを設計しました。握りやすく穴が開いてるので紐を通して首に掛けることが出来ます。電池も蓋をスライドして交換できます。
3Dプリンターや印刷サービスで印刷を行ってください。
ダウンロードはBoothから
組み立て
配線はぎりぎりの長さでも構いませんが、ケースに収めるとき少し余裕あったほうが楽かもしれません。電源スイッチをはめてから送信スイッチをはめて電池ボックスとM5StampC3斜めに入れるイメージです。この時電源スイッチは電池ボックスに押される感じになります。電池ボックスと送信スイッチの間はクッションテープで隙間を埋めてます。送信スイッチの足は長ければカットします。
実際の動作確認
青いボタンを3秒以上長押しした状態で赤いボタンを押してLINEに通知が来ればOKです。
感想
今回初めてlot機器を作ってみましたが面白く、日常のヒントからこういった製品が生まれるんだなーって思いました。是非作ってみて祖母や祖父に渡してみてはいかがでしょうか