obniz

obnizのdeepsleep機能を試してみた

この記事はobniz Advent Calendar 2020の12/7の記事です。

外気温を測定するシステムをobnizで作ろうと思い立ち、実装方法を検討する過程でobnizでのdeepsleepのやり方を調べてみたので、わかったことを記載します。

発端

10年ぐらい前に購入した温度計をずっと愛用していました。この温度計は室内に置く親機と屋外に置く子機から構成されてます。おやきには液晶ディスプレイが付いていて室内温度と外気温度を表示してくれます。下の写真の左側が親機で右側が子機です。親機と子機の間は無線で通信します。

この子機は一応防滴構造になっているのですが、長年風雨にさらされたため雨水が染み込むようになって部品や基板が劣化し、電池を交換しても1ヶ月もしないうちに電池がなくなるようになってしまいました。修理は不可能な状況なのでこの温度計は引退させることにしました。そしてこれに代わる温度計を自作してみようと思いました。

技術的課題

子機は電源コンセントがないベランダで動作させるので、電池駆動が必須条件です。電池を長持ちさせたいので、温度を測定して親機に送信する時だけ動作させ、次の測定時刻までは寝ている状態にして電池消費を低く抑えたいです。

obnizに搭載されているCPUであるESP32にはdeepsleep機能があり、これを使えば電池消費を抑えられます。

obniz 1Yでのdeepsleep

obnizの公式デバイスは複数あり、この中でスリープ機能に対応しているのはobniz Board 1Yだけです。

 

スリープ機能の使い方は、obnizサイトのこちらに詳しく記載されています。

obniz Docs > ガイド > 電池での長期動作

このガイドには「1日に1度だけ温度を計測する」という例題があり、プログラム例はこうなっています。

スリープ状態に入りたいところで、obniz.sleepMinute( ) を呼び出せばよいことがわかります。

手元にあるobniz Board 1Yでこの関数を試してみたところ、ちゃんと動作しました。

お財布問題

obniz Board 1Yを使えば、やりたい事が実現できることは確認できました。しかし、obniz Board 1Yを子機として使うには、大きな心理的障壁があります。

6,300円も出して買ったボードを温度測定のためだけに使うのはもったいない!

そこで別の方法を検討してみることにしました。

obnizOSを調べてみた

obnizにはobnizOSというソフトウェア製品があり、ESP32開発ボードやM5StickCなどで動作させることができます。これらのハードウェアは安価に販売されていて、obnizOSも1ライセンスであれば無料で使えるので、こちらの方がトータルコストをかなり低くできます。

obnizのドキュメントを調べてみたところ、obniz Board 1Yはスリープ機能に対応していますが、obnizOSでは対応していないように思えました。実は対応しているのかもしれませんが明確な記述はありませんでした。

obnizOS単独ではスリープできなさそうなので回避策を探ってみました。

obnizOS + プラグイン でdeepsleepを試してみた

obnizOSにはプラグイン機能があり、自分で好きな機能を追加できるようになっています。詳しくは公式ドキュメントのこちらに記載されています。

obniz Docs > ガイド > プラグインでOSを拡張

このドキュメントを読んでわかったことを自分なりにまとめた資料がこちらにあります。ご興味があれば読んでみてください。

obnizOSのプラグインはすごく簡単に言うと「arduinoのプログラムの中でobnizOSをサブタスクで起動できる」というものです。したがってメインのプログラムにはarduinoのプログラムをなんでも書けることになります。

メインのプログラムの中にdeepsleepを起動するコードを書いてみて、ちゃんと動作するか試してみました。deepsleepのやり方はこれらの記事を参考にしました。

M5StickC非公式日本語リファレンス スリープ

M5StickCで腕時計

2つ目の資料に記載されているコードの主要部分をコピペして動かしてみました。deepsleepに関係する部分は2箇所です。

1つ目はsetup()関数内で、deepsleepから目を覚ます条件を指定している部分です。

2つ目はloop()関数内で実際にdeepsleepを呼び出す部分です。

プログラムを実行してみると、obnizOSとdeepsleep機能が共存していることが確かめられました。

今後の課題

obnizOSが動作しているM5StickCでdeepsleepを呼び出せることがわかりました。しかし、非常に単純なプログラムなので、obnizOSの機能を駆使するプログラムを書いた場合にdeepsleep機能と干渉する可能性があります。

obnizOSプラグインのドキュメントには、プラグインのプログラムが守るべき制約に関して何も記載されていないので、やっていいことといけないことがわかりません。obnizの中の人に聞いてみて、ちゃんと動作させるための条件を明らかにしたいと思います。