きっかけ
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
さんが
2021/01/15
に
編集
をしました。
(メッセージ: 初版)
-
s51517765
さんが
2021/01/15
に
編集
をしました。
-
s51517765
さんが
2021/02/26
に
編集
をしました。
ログインしてコメントを投稿する