連続稼働時間が伸びない
前回、SORACOMさんのIoTレシピ通りに、距離センサーで缶ビールが持ち去られたことを検知し、メール通知するところまで出来ました。
さて、ここからは実際に父の墓からビールが持ち去られた際にメール通知できるように実装してみます。
前回までは、M5StackをPCに接続しながら動作検証していたので、バッテリーについては全く気にしていませんでしたが、電源の無い場所で動作させようとすると、自前で電源を用意する必要があります。
そこで、今回は以下のモバイルバッテリーを購入してみました。
cheero Canvas 3200mAh
一応、IoT機器対応ということでこちらのモバイルバッテリーにしました。
ひとまず、このモバイルバッテリーで動作検証してみましたが、どうやらIoTレシピのサンプルソースのままで動かすと、だいたい12時間ほどでバッテリー切れとなってしまいました。
いくら何でも、お供えのビールを監視するのに、半日では短すぎる。。。
せめて、2~3日は監視し続けられるようにしたいと思います。
バッテリー残量有るのに動作停止
とにかく、消費電力を減らせば連続稼働時間が延びるだろうという大雑把な推測から、様々なことを試してみました。
- モニターの明るさ調整(できるだけ暗く)
- クラウドへの通知間隔を伸ばす(30分、1時間おき)
- deepsleep, lightsleepの実装
しかし、いずれも稼働時間を確実に伸ばすことはできていません。
実は、消費電力以前の問題が出てきてしまいました。
上記のいかなる対策をしても、バッテリーの残量がまだ残っているのにもかかわらず、動作を停止するケースが多発したからです。
消費電力が少なすぎて、モバイルバッテリーが給電を停止するパターンかと予想していました。
とりあえず、どのようなタイミングで動作を停止するのか知りたくて、
コードのあちこちでシリアルモニタにログを吐き出すようにしておいて、ログの検証をしてみました。
クラウドへの送信時に応答が無い
まだ確証は持てませんが、以下のsend_to_cloud関数でセンサーデータの送信を行っていて、以下のhttp.postの直前で出力されたログを最後に動作を停止しているように見受けられます。
template<typename T, typename U> void send_to_cloud(const char *upstream_payload, T socket, U *serialMon) {
serialMon->println(upstream_payload);
HttpClient http = HttpClient(socket, "uni.soracom.io", 80);
http.post("/", "application/json", upstream_payload); // ←ここの応答が無い?
serialMon->print(F("responseStatusCode(): "));
serialMon->println(http.responseStatusCode());
http.stop();
}
もうしばらく検証が必要そうですが、可能性としてはhttp.postの応答に時間を要している間に、消費電力が落ちてバッテリーからの電力供給が止まっているのではないか、と推測しています。
仮に上記の推測通りだとした場合、取りうる対策としては一定時間応答が無い場合に、強制的にM5Stackを再起動する必要があるのかもしれません。
ただ、いずれにしても調査の継続と、対応の検討に時間がかかりそうです。
いつになるか分かりませんが、この現象の解決に進展があればまた本ブログでご紹介したいと思います。
しばしお待ちを。