編集履歴一覧に戻る
s51517765のアイコン画像

s51517765 が 2021年01月15日17時29分24秒 に編集

初版

タイトルの変更

+

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

タグの変更

+

秋葉原2021

本文の変更

+

# きっかけ WifiにつながるESP32で何か作りたい。 部屋にこもっている旦那やムスコを呼んでもなかなか出てこない、とお困りのお母さんは多い。 これをスマートに解決するIOTを作ろう。 # 技術的解説 ## 入力側 なるべく簡単に操作できることを考えました。 世のお母さんはスマホは使えても、とても複雑なIOT機器は(必ずしも)操作できません。 そこで、ボタン一つで操作するだけ、という超割り切りUIとしました。 ・呼び出しの種類 呼び出される側も何で呼び出されたのかがわかったほうが対応しやすいと思うので、3種類を用意しました。 ①ごはんですよ ごはんが出来たときはすぐに食卓に集合! ②宅急便 自分のものは自分で。 ③ちょっと来て 結局要件を言ってくれない。これはお母さんはよくやりがちです。 ## 出力側 LINEのメッセージAPIが簡単なのでこれを使いました。 WebhookをたたくだけなのでESP32で実現するのにもっとも適当だと思いました。 また、今時は小学生でも自分のスマホを持っていますし、LINEも使っています。 同様な機能を持ったものとしてはSlackなどもありますが、Slackはエンジニア以外にはあまりなじみがありません。 ## 回路 ボタンを入力として扱いたいので、digitalReadを使いますが、当初は外部でプルアップをしようと思いましたが、うまくいきません。 ![キャプションを入力できます](https://camo.elchika.com/146be2734424b858950563ebf1ef7bdf35a2b408/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62336539306561662d376461642d343165332d386363662d6164313030626336316330652f66616262303164372d303235392d343537322d383831302d306130336231633166666261/) ボタン3つを使いたいですが、これではOR回路になってしまいますし、すべてのGPIOがLOWになってしまいます。 そこで内部プルアップを使いました。 ESP32にもArduino同様に内部プルアップ機能があります。 ``` pinMode(18, INPUT_PULLUP); ``` ピンアサインで第二引数をINPUT_PULLUPとします。 簡単ですね。 そして回路図は以下になります。 ![キャプションを入力できます](https://camo.elchika.com/686c38a439abb6f7b44b192c5fdfe61bf2b89498/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62336539306561662d376461642d343165332d386363662d6164313030626336316330652f64636632393439382d363531632d343038342d626234622d376463333862316466623432/) 回路も簡単になりました。 # 動作しているところ ![キャプションを入力できます](https://camo.elchika.com/a5a226678018fa8ee3ec09ec4e86f6c0abc5dd1d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f62336539306561662d376461642d343165332d386363662d6164313030626336316330652f37393534636432612d323137622d343832652d383665332d646537363735393737623532/) https://twitter.com/s51517765/status/1349990771600986112 # ソース ```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); } ```