雨量計システムの課題と考え方について
[この記事は,2019年3月1日に公開したものです]
前回は,雨量計システムの全体概要についてご紹介しました.今回はその中で,特に2つの課題に対する考え方をご紹介したいと思います.
まず1点目は,Wio LTE(Arduino)で,雨量をカウントする方法です.雨量計内部の「ます」が転倒すると,パルス波が発生することは前回述べた通りです.一方,当然ですが雨量計は屋外に設置するため,様々な要因でノイズが入る可能性があります.事前にオシロスコープを使って実験したところ,雨量計内部の「ます」が転倒した際には,120〜130ms程度のパルス(矩形波)が発生することがわかりました.そこで,この範囲(実際にはもう少し広く許容している)のパルス波を正常,この範囲外ならノイズとみなすことにします.
パルス波は外部割り込み処理として検出するために,Arduinoの attachInterrupt関数を使います.attachInterruptは割り込み処理を定義する関数で,引数には「割り込みを検出するピン番号(今回は38)」「割り込み検出時に呼び出す関数」「割り込みを検出するトリガ(状態変化)」を与えます.今回の用途だと,ピンの値が上昇してから下降するまでの時間が一定の範囲に含まれるかを判定すれば良いので,上昇した際の時刻をグローバル変数に記憶し,下降した際はそれとの差分をとって判定するような実装にしました.
次は2点目の,サーバやネットワークの問題で雨量データ(単位時間あたりのパルス波のカウント数)の送信に失敗した場合の再送という課題です.まず,送信に失敗した場合,失敗したことを検知しつつ,Wio LTEでデータを何らか保持しておく仕組みが必要です.幸い,SDカードが使えるので,データの保持はそちらを利用します.
また,データはHTTP PostでSORACOM Beamのエンドポイントに送信するのですが,Wio LTEのライブラリでは,Postリクエストが成功するまで60秒待つ実装になっていました.今回は,データの送信単位を1分として,1分ごとのデータはなるべく遅延なく送信するため,その箇所を修正すると共に,次のような方式にしました.
- Post送信時に,SDカードからデータを読み出し(無ければスキップ),当該時点のデータと合わせて送信.
- 送信失敗したらデータをSDカードに保存.
- SDカードは適当な条件でクリア.
Wio LTEにデータを保持しておく理由がないため,データは適宜消去します.もちろんSDカードにも容量の上限があるので,長期のトラブルがあればどうしようもないのですが,そこは仕様として割り切っています.
今回はここまでです.実装のポイントは別途公開したいと思います.次回は,実際の雨量計の設置を通して得られた知見をご紹介したいと思います.