Rabbit Note

技術的な事柄をメモしていきます.

ESP32 の ULP を活用したワイヤレス雨量計

ESP32 の ULP を活用したワイヤレス雨量計の作り方を紹介します.

はじめに

下のような本格的な機材が安く手にはいったので,これに ESP32 を接続して Fluentd に計測結果を送り,Grafana でモニタリングできるようにします.

回路設計

今回使用する雨量計は,転倒ます型といって 0.5mm の雨が溜まる度に信号ラインが 0.1~0.2秒間ショートするようになっています.構造としては,鹿威しをベースにして磁石によってON/OFFするリードスイッチを組み合わせた作りです.

回路としては,端子の片方を 3.3V,他方を 10kΩ を介して GND に接続し,雨が溜まる度に一瞬 H を出力するようにしておきき,ESP32 の GPIO に接続します.

ちなみに,最初はこの逆,すなわち雨が溜まる度に一瞬 L になるような回路にしていたのですが,Wifi 接続時の電圧降下での誤カウント等が発生したので,前述の構成に変更しました.

乾電池から 3.3V を生成する電源と組み合わせて仕立てるとこんな感じ.

ソフト設計

ESP32 のソフトは,端子のレベルを監視し,L→H になった回数のカウントを行います.

消費電力を抑えたいので,定期的に ULP を動作させて端子の電圧レベルを監視することにしました.ULP は消費電力が少ないといっても 150uA 程度消費してしまうのに対し,Deep Sleep 状態では 5uA 程度なので,ULP を間欠動作させると電池のもちが全然違ってきています.

雨量計の最小パルス幅は 0.1秒なので,余裕をみてULP は 30ms 毎に動作させることにします.

ソフト実装

コード全体は github にあげてあります.

ULP 側

ULP は動作する度に雨量計の出力をモニタし,L → H のエッジのカウントを行います.センサのチャタリング除去のため,次のようなステートマシンを組むことにします.

コード全体は下記のような感じです.上の図と照らしながら見てもらえば,やっていることは分かるかと思います.

CPU 側

CPU は 1分ごとに起きて,ULP がカウントした値を取得します.そして,必要に応じて WiFi を有効化し,値を Fluentd に送信します.

コード全体は下記のようになっています.Fluentd への送信コードがあるのでやや長くなっていますが,やっていることは目を通していただければ分かると思います.

以下の点を工夫しています.

雨の降り始めはすぐに通知
WiFi 通信頻度と電池の持ちはトレードオフの関係にありますが,雨の降り始めはなるべく早く知りたいので,降り始めを検出した場合はすぐに WiFi 通信を行うようにしました.雨が降っていない場合は通信回数は1時間に1回です.
エラー時にリセットしない
これまで,ESP32 を使って屋外のセンシングをしていると,時々データの歯抜けが生じていました.原因としては何らかのエラーでデバイスがリセットしていることが推測されます.そこで,エラーチェックについては,エラー時にリセットを行ってしまう ESP_ERROR_CHECK を使わず,独自に ERROR_RETURN というマクロを定義して使っています.
Fluentd への送信リトライ
WiFi 接続を含め,Fluentd への送信時にエラーが起こった場合,データは保持して次回の送信タイミングに再送をこころみるようにしてあります.前項とセットで適用することで,データの歯抜けがなくなりました.
電波強度やリトライ回数の送信
実際に運用する場合,エラーの兆候がつかめる仕組みがないと安定稼働させるのが困難です.そこで,WiFi 接続にかかった時間,電波強度(RSSI),リトライ回数等を Fluentd に送るようにしてあります.

組み上げ

雨量計とソフトを組み込んだ回路を接続すれば完成.

しばらく時間がたつと Grafana にデータが溜まり始めます.

LINEで送る
Pocket

, , ,

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です