LINEを通じて植物と会話できるようになる魔法の植木鉢を、ESP8266とGoogle AppsScriptを用いて製作します。
概要
植木鉢に組み込んだESP8266から、GAS (GoogleAppsScript)へ気温や湿度などのセンサデータを数秒毎にPOSTします。
受け取ったデータをGAS上で処理、格納して、そのデータをもとにLINEbotを通じてユーザーとメッセージをやり取りします。
ESP8266から直接LINE MessagingAPIを利用してユーザーにメッセージを送ることもできるのですが、今回はGASを経由しました。
GASを使うメリットとしては
- メッセージの応答処理を編集するのに毎回マイコンをいじらなくて済み、web上で完結する
- 植木鉢が消滅してもgoogleのサーバーが爆発しない限り何らかの応答が可能
- スプレッドシートや各種googleのサービスと連携が容易
などがあげられると思います。
完成したもの
以下が実際に作ったものです。
[su_youtube url=”https://youtu.be/FyzfFPuQbuM” height=”240″ autoplay=”yes”]
用意したもの
- ESP8266 モジュールでも単体でも、使えるのならOK
- 温湿度センサ (DHT11温湿度センサモジュール)
- 土壌水分センサ (単芯導線)
- 配線類
- 植木鉢
- 育てたい植物
土の水分量をセンシングする土壌水分センサについてはちゃんとした製品を使っても構いません。
しかし、一般的な土壌センサの仕組みは電極間の抵抗値が土中の水分で変化することを利用したもので、簡単に自作できるため今回は自分で作成したものを使用します。
土壌水分センサの作成
センサの電極として、ホームセンターで1mあたり70円で購入した単芯のケーブルを使います。多芯のものより、単芯のほうが形状の維持で有利なのでこちらを使います。
センサの作成といっても、することはほとんどありません。
以下のように配線を植木鉢に取り付けます。
このとき、コードの先端の被膜を剥いて電気が通りやすくするのですが、剥きすぎると導電しすぎて水分の変化を感知できなくなります。
回路の作成
温湿度センサーと土壌水分センサーをESP8266とつなぎます。
温湿度センサーについては、公式の解説通りに接続すれば全く問題ありません。
土壌の水分センサーは、ESP8266のADCを利用して使います。
ESP8266にはTOUTピンに10bitのADCが搭載されています。
これは本来電池の残量などを測定するためのもののようで、今回のような使い方は邪道なのかもしれませんが、土壌の水分変化を検知する程度の用途なら十分に使用できます。
注意点として、TOUTピンの定格電圧は1Vとなっているので、1V以上の電圧をかけないようにします。
具体的なセンサーとTOUTピンの接続は以下のようにしました。
スケッチ
以下にソースコードを載せます。
Wi-FiのSSIDとパスワード、GASのID、DHT11センサモジュールを接続したピンを編集します。
GASのIDは、次回作成するGASのWebAPIにアクセスするためのIDで、WebAPIを作成した後この部分にコピペします。
#include <ESP8266WiFi.h> #include <HTTPSRedirect.h> #include <dht11.h> dht11 DHT; #define DHT11_PIN 14 //wifi関係 const char* ssid = "Wi-FiのSSID"; const char* password = "Wi-Fiのパスワード"; int count; const char* host = "script.google.com"; const int httpsPort = 443; const char *GScriptId = "GASのID"; //送信テキスト const String url = String("/macros/s/") + GScriptId+ "/exec?value=esp"; const String payload_base_cell = "{\"command\": \"Update\", \"Humidity\": \""; const String payload_base_Temperture = "\",\"Temperture\": \""; const String payload_base_Moisture = "\",\"Moisture\": \""; const String payload_base_terminate = "\"}"; String payload = ""; String body; HTTPSRedirect* client = nullptr; void setup() { Serial.begin(115200); pinMode(KEY_PIN, INPUT); Serial.print("wifi connected. ssid : "); Serial.println(ssid) Serial.flush(); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void loop() { DHT.read(DHT11_PIN); int Humidity_value = DHT.humidity; int Temperture_value = DHT.temperature; int Moisture_value = analogRead(A0); bool flag; char stringCount[10]; sprintf( stringCount, "%d", count); client = new HTTPSRedirect(httpsPort); client->setInsecure(); client->setPrintResponseBody(true); client->setContentTypeHeader("application/json"); Serial.print("Connecting to "); Serial.println(host); // 5回接続試行 flag = false; for (int i=0; i<5; i++){ int retval = client->connect(host, httpsPort); if (retval == 1) { flag = true; break; } else Serial.println("Connection failed. Retrying..."); } if (!flag){ Serial.print("Could not connect to server: "); Serial.println(host); Serial.println("Exiting..."); return; } // データ送信 payload = payload_base_cell + Humidity_value; payload = payload + payload_base_Temperture + Temperture_value; payload = payload + payload_base_Moisture + Moisture_value + payload_base_terminate; Serial.println("post"); Serial.println( payload ); client->POST(url, host, payload, false); delete client; client = nullptr; delay(6000); }
プログラムの簡単な説明
使用しているライブラリは3つです。
GASはhttpsでないといけないのでHTTPSRedirect.hをつかって443ポートで通信しています。
ライブラリの公式ドキュメントにもちらっと書いてありますが、現在フィンガープリントの検証がうまくいっておらず無効にされているようです。
フィンガープリントは無くても通信できるのですが、setInsecure関数なんかが使われているとエラーを吐きます。
ESP8266 GAS なんかで検索して出てくるサイトにはこの辺の解説があまり見当たらなかったので注意です。
全体的な動作としては、Wi-Fiに接続した後センサデータを取得し、JSON形式でGASで公開したWebAPIにPOST
その後Wi-Fiを切断し数秒間スリープ
この動作を繰り返します。
次回はGASにおけるセンサデータの取り扱いとLINEbot、メッセージのやり取りの部分について解説します。
コメント