概要
前回に引き続き、マイコンソフトの製作を行い、システム全体が完成した。
背景と目的
詳細
1.主な仕様
やりたいことは以下。
- 一定時間ごとに起動し、それ以外の時間はできるだけ消費電力を下げるためスリープする
- 土壌水分センサ、BME280、水瓶の水位センサでそれぞれ計測を行う
- 土壌水分センサの値が一定値を上回る=乾燥している場合、ポンプを動かす
- ポンプを動かした場合には、IFTTTを使ってLINEに通知する
- 水位センサで水瓶の水切れを検出した場合は、IFTTTを使って通知する
- 起動ごとに、センサの計測値をIFTTTを使ってGoogleスプレッドシートに記録する
2.実装
具体的なコードは割愛するが、方法を大まかにメモ。
2.1 一定時間ごとに起動、動作完了後スリープ
この動きは、過去に作ったリモート水位センサと同じなのでそれに倣って、一定期間のディープスリープをすればOK。
2.2 土壌水分センサ、BME280、水位センサの計測
土壌水分センサはアナログ入力、BME280はI2C、水位センサはGPIOを読み取ればよい。BME280だけちょっと困ったのは、BME280があまりにもいろいろなところで使われているせいか、Arduino用のライブラリだけでやたらと数があること。何が決め手ということもないが、今回はスイッチサイエンスが公開しているものを使用した。
基本的に、サンプルコードと同じ流れなので特に変わった部分はないが、最初ちょっと違うサンプルを見ていてうまく動かず躓いた。I2Cをbeginして、bme280の初期設定をして、readTrimメソッドを呼ぶという手順を忘れない。
// BME280初期化 Wire.begin(); bme280.setMode( BME280_ADDRESS, //I2C Address 1, //Temperature oversampling x 1 1, //Pressure oversampling x 1 1, //Humidity oversampling x 1 3, //Normal mode 5, //Tstandby 1000ms 0, //Filter off 0 //3-wire SPI Disable ); bme280.readTrim();
2.3 土壌水分センサの値が一定値を上回る=乾燥している場合、ポンプを動かす
アナログ入力の値を読み取って、基準よりも大きければ乾燥している。その基準をどこにするかだが、以下が販売元が公開している空気中と水中での値で校正する方法。まあ、とはいえ毎回校正できるわけではないので、生の値で適当に1つ基準を決めた。その値より大きい値であれば乾燥していると判断して、ポンプを動かす。ポンプは、GPIO出力を一定時間HIGHにするだけ。
2.4 ポンプを動かした場合には、IFTTTを使ってLINEに通知する
給水したら、LINEで通知を受ければちゃんと IFTTTを使ってLINEに通知するには、thisにWebhookチャンネルのRecieve a web requestトリガー、thatにLINEのsend a messageアクションを選択。ESP32からは、JSONボディを作ってWebhooksチャンネルのエンドポイントに投げればよい。WiFiだとか、HTTPSリクエストについては、Arduino-esp32のWiFiClientSecureライブラリのサンプルの通りやればよい。 通知内容は、
2.5 水位センサで水瓶の水切れを検出した場合は、IFTTTを使って通知する
水切れについても、同様に通知すれば水瓶自体に給水するタイミングを知ることができて便利。 やり方は、2.4と同じ。
2.6 起動ごとに、センサの計測値、電池電圧などをIFTTTを使ってGoogleスプレッドシートに記録する
電池電圧は、アナログ入力を読む。AD変換値と電圧の対応は回路構成から決まる。 これもIFTTTを使って、thisにWebhooksチャンネルのRecieve a web requestトリガー、thatにGoogleスプレッドシートチャンネルのAdd row to spreadsheetアクション。IFTTT連携の注意点として、Googleドライブ内のパスに日本語が入っているとうまくいかないので、日本語の入らないパスにシートを置く。シート名も日本語が入らないように。
以下のような感じで溜まっていく。センサ値がたくさんあるが、IFTTTのWebhooksチャンネルは一度に3種類までしか送れないので、センサ計測値、水やり実施有無、電池電圧に分けて記録。
ここまでで全体が完成した。ソーラー充電を含めてちゃんと動くか、しばらく試運転していこうと思う。
まとめと今後の課題
自動水やり器が完成した。