【Arduino】 ESP32で雨をLINEでお知らせしてくれるデバイスの製作

外で雨が降り始めても、案外気づきづらいものですよね。私も何度かそれで洗濯物を濡らしてしまいました。そこで、今回は雨が降り始めたらLINEでお知らせしてくれるデバイスを製作しました。
2025/1追記 LINE Notifyは2025年3月31日にサービス終了します。LINE Messaging APIなど代替サービスをご利用ください。
完成イメージ↓
いつもの:万が一事故や故障等発生しても、責任は負いかねます。ご了承ください。
必要なもの
- ESP32-WROOM(Amazonまたは秋月電子通商)
- 雨検知センサー(Amazon)
- ブレッドボード(Amazonまたは秋月電子通商)
- ジャンパーワイヤーオス-メス、オス-オス(Amazon)
- LINEアカウント
実用的に使用する場合はユニバーサル基盤を使用すると思いますが、試作段階ではブレッドボードを使います。
LINE Notifyからトークン発行
LINE Notifyは、外部WebサービスからLINEメッセージを送信できるようにする、LINE公式のサービスです。
ここでESP32からLINEへメッセージを送信できるようにする、「トークン」と呼ばれるものを発行します。
1.LINE Notifyにアクセス(スマホ不可)
2.ログインする

3.ログインできたら、ページ右上ユーザーネーム>「マイページ」へ進む

4.「トークンを発行する」をクリック

5.トークン名を記入

トークン名ではありますが、メッセージに表示されるので、それっぽいものを記入
6.送信するトークルームを選択

今回は自分に送信するので、「1:1で~」を選びました。家族LINEとかでも大丈夫です
7.「発行する」をクリック
8.発行されたトークンをコピー

以上でLINE側の準備は完了です。
回路
回路は下図のとおりです。

ESP32の5番ピンに雨検知センサーのデジタル出力を差しています。
雨検知センサーの感度は、センサーを接続している長方形のパーツの可変抵抗で調節します。緑のランプがギリギリ2つ点灯しない場所に調整します。(最後にやっても良い)

ソースコード
Arduino IDEを使用します。私と同じものを使用した場合、ボードは「ESP32 Dev Module」です。

ソースコードは以下の通りです。Wi-FiのSSID、パスワードは各自設定してください。
LINE Notifyで発行したトークンは、10行目に記入してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
#include <WiFi.h> #include <WiFiClientSecure.h> // WiFi設定 const char* ssid = "xxxxxxxx"; //接続するWi-FiのSSID const char* password = "xxxxxxxx"; //接続するWi-Fiのパスワード // LINE Notify設定 const char* host = "notify-api.line.me"; const char* token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";//トークン const char* message = "洗濯物は大丈夫ですか?";//追加のメッセージ int flag; void setup() { // ポート設定 pinMode( 5, INPUT ); // センサからのデジタル入力 // シリアルモニタ設定 Serial.begin( 9600 ); flag = 0; 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() { // HTTPSへアクセスするためのライブラリ WiFiClientSecure client; // サーバー証明書の検証を行わずに接続 client.setInsecure(); Serial.println("Try"); //LineのAPIサーバにSSL接続(ポート443:https) 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() { // 感雨確認 if(digitalRead(5) == LOW && flag == 0){ // 感雨あり flag = 1; send_line(); // Lineにリクエストを送信する Serial.println(flug); } else if(digitalRead(5) == HIGH){ flag = 0; } delay(1000); //誤作動しないよう調整 } |
一応void loopのところだけ解説します。
簡単に言うと、雨検知 → LINE送信 をやっています。ただ、これだけだと、雨が降っている間、永遠に通知を送り続けます。なので、雨を検知したときにflag = 0だったものを flag = 1にします。LINE送信の動作に入る条件として 87行 if(digitalRead(5)) == LOW && flag == 0) と書いているように、このflagが1の時は、送信の条件に入りません。そして、雨を検知しなくなったら、91行 else ifに入り、flag = 0になります。これでリセットになるわけです。
もっとスマートなやり方があるかもしれませんが、とりあえずこれで対処しました。
95行目 delay(1000)は、センサーのノイズ等で一回切れちゃう事があるので長めにしています。今回は1000msec(=1秒)ですが、10秒とか30秒でも良いと思います。
検証
センサーに霧吹きを掛けてみたところ、ちゃんと通知が届きました。

今回はこんなところです。気になったところは、雨検知センサーの銅の部分が剥げやすいところです。実用する場合は他の製品で代用したいところですが、今のところ良さそうなものが見つかっていません。そのうち反応しなくなりそうな気がしますが、取り合えず壊れるまではこのままでやってみます。