s51517765のアイコン画像
s51517765 2021年01月15日作成 (2021年02月26日更新)
製作品 製作品 閲覧数 920
s51517765 2021年01月15日作成 (2021年02月26日更新) 製作品 製作品 閲覧数 920

旦那(ムスコ)呼び出しシステム

きっかけ

WifiにつながるESP32で何か作りたい。

部屋にこもっている旦那やムスコを呼んでもなかなか出てこない、とお困りのお母さんは多い。
これをスマートに解決するIOTを作ろう。

技術的解説

入力側

なるべく簡単に操作できることを考えました。
世のお母さんはスマホは使えても、とても複雑なIOT機器は(必ずしも)操作できません。
そこで、ボタン一つで操作するだけ、という超割り切りUIとしました。

・呼び出しの種類
呼び出される側も何で呼び出されたのかがわかったほうが対応しやすいと思うので、3種類を用意しました。
①ごはんですよ
ごはんが出来たときはすぐに食卓に集合!
②宅急便
自分のものは自分で。
③ちょっと来て
結局要件を言ってくれない。これはお母さんはよくやりがちです。

出力側

LINEのメッセージAPIが簡単なのでこれを使いました。
WebhookをたたくだけなのでESP32で実現するのにもっとも適当だと思いました。
また、今時は小学生でも自分のスマホを持っていますし、LINEも使っています。
同様な機能を持ったものとしてはSlackなどもありますが、Slackはエンジニア以外にはあまりなじみがありません。

回路

ボタンを入力として扱いたいので、digitalReadを使いますが、当初は外部でプルアップをしようと思いましたが、うまくいきません。
キャプションを入力できます
ボタン3つを使いたいですが、これではOR回路になってしまいますし、すべてのGPIOがLOWになってしまいます。

そこで内部プルアップを使いました。
ESP32にもArduino同様に内部プルアップ機能があります。

pinMode(18, INPUT_PULLUP);

ピンアサインで第二引数をINPUT_PULLUPとします。
簡単ですね。
そして回路図は以下になります。
キャプションを入力できます
回路も簡単になりました。
あとは配線するだけですが、ここではブレッドボードとジャンパーワイヤーで仕上げます。

全体構成図

動作しているところ

ソース

gohandesuyo.ino

#include <WiFi.h> #include <WiFiClientSecure.h> const char* ssid = "********"; const char* password = "********"; const char* token = "*********"; void wifiConnect() { int tryCount = 0; WiFi.disconnect(); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); // Wi-Fi接続 while (WiFi.status() != WL_CONNECTED) { // Wi-Fi 接続待ち delay(100); Serial.printf("."); tryCount += 1; if (tryCount > 30) { Serial.println("\nwifi connect NG"); return; }; } Serial.println("\nwifi connect OK"); } void sendLine(String message) { const char* host = "notify-api.line.me"; WiFiClientSecure client; Serial.println("Try"); //LineのAPIサーバに接続 if (!client.connect(host, 443)) { Serial.println("Connection failed"); return; } Serial.println("Connected"); //リクエストを送信 String query = String("message=") + 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'); Serial.println(line); if (line == "\r") { break; } } String line = client.readStringUntil('\n'); Serial.println(line); delay(5000); } void setup() { Serial.begin(115200); wifiConnect(); pinMode(18, INPUT_PULLUP); pinMode(19, INPUT_PULLUP); pinMode(21, INPUT_PULLUP); } void loop() { if (digitalRead(18) == LOW) { Serial.print("Button pushed.\n"); sendLine("御飯ですよ!"); } else if (digitalRead(19) == LOW) { sendLine("宅急便!"); } else if (digitalRead(21) == LOW) { sendLine("ちょっと来て!"); } delay(100); }
s51517765のアイコン画像
https://s51517765.hatenadiary.jp/
ログインしてコメントを投稿する