obnizOSにはCPUの動作を停止させ消費電力を最小限に抑えるスリープ機能が搭載されています。
電源に接続できない屋外などの環境で、電池や太陽光パネルと一緒に動かすのにスリープ機能が利用できます。
スリープの種類と挙動
obnizOSのスリープには以下の種類があります。
| 種類 | 対応OSバージョン | 挙動 |
|---|---|---|
| ディープスリープ+外部モデムスリープ | 7.0.0以降 | 完全停止されスリープ後再起動が行われる。外部モデムのスリープも行う |
| ディープスリープ+外部モデムスリープなし | 7.0.0以降 | 完全停止されスリープ後再起動が行われる。外部モデムのスリープは実施しない |
| ライトスリープ+外部モデムスリープ | 7.0.0以降 | 再起動無しで一時的な停止を行う。外部モデムのスリープも行う |
| ライトスリープ+外部モデムスリープなし | 7.0.0以降 | 再起動無しで一時的な停止を行う。外部モデムのスリープは実施しない |
| obniz Board 1Yスリープ | 2.0.0以降 | 外部電源モジュールを利用した3.3v系統の給電停止によるスリープを行う |
obniz Board 1Yのスリープは機種に依存した最も消費電力が小さくなるもので、それ以外のスリープはobnizOSを搭載したESP32単体で行うことができるスリープとなっています。
外部モデムは外側に接続されたLTEモデムを意味します。
モデムのスリープをする場合、Intelligent Edgeシリーズでは内部で接続されているnRF91モデムがスリープ状態となります。
スリープの復帰トリガー
スリープは開始時に以下のいずれか復帰方法を指定して開始することになります。
| 種類 | 対応OSバージョン | 挙動 |
|---|---|---|
| 時間 | 2.0.0以降 | 指定した時間だけスリープする |
| IO0のHigh/Low変更 | 2.0.0以降 | obniz Board 1Yのみ。ピンの状態変更でWakeup |
時間についてはESP32内部または電源モジュールのクロックを利用します。
正確ではなく温度の影響も受ける点に注意してください。
また、スリープ復帰後はすぐにオンラインになるわけではありません。例えば60秒のスリープが終わったあとは、そこからインターネット接続が再開されることになるので、オンラインになるまでの時間はそこからさらに時間がかかります。
JavascriptSDKを利用したクラウドからの活用方法
javascriptやクラウド経由では以下のどちらかのみが利用可能です。
- ディープスリープ+外部モデムスリープ
- obniz Board 1Yスリープ ( obniz Board 1Yの場合はこちらになります )
// Javascript Example
obniz.sleepSeconds(60); //60 sec = 1min
クラウドからの指示で任意のスリープが可能となります。
任意のタイミングでスリープを行えるため、以下のような活用がありますが主に定期観測をするような活用に便利です。
- 必要なデータが取得できたときに次にほしいときまでの時間を決めてスリープさせる
- 定期的に5分毎などでスリープさせ、バッテリー電圧に応じて時間を変更する
Lua Pluginを利用したスリープ
端末の中にインストールしたLua Pluginからのスリープではライト・ディープのスリープが利用可能です。
各スリープはミリ秒単位で指定することが可能です。
os.sleep(5 * 1000, 0); -- deep sleep + external module sleep.
os.sleep(5 * 1000, 1); -- deep sleep + without external module sleep.
os.sleep(5 * 1000, 2); -- light sleep + external module sleep.
os.sleep(5 * 1000, 3); -- light sleep + without external module
端末のスリープではインターネットに接続をする前から判断とスリープが可能です。
そのため、値をチェックし、データを送るべきときはインターネットに繋ぎ、そうでないときはスリープするといった動きでバッテリー消費を最小限にすることが可能です。
例えばIO1の電圧が2を超えたときだけインターネットに繋ぐには以下のようなLuaスクリプトとなります。
ただし、場合によっては永遠にインターネットに繋がらない可能性があります。
インターネット接続前のスリープの利用には十分なケアが必要です。
io.retain(1, true);
if ad.get(1) < 2.0 then
os.sleep(60 * 1000, 0); -- sleep 1 minutes. and check the voltage again
end
スリープ時の消費電力
スリープ時の消費電力は製品によって異なります。詳しくは製品ごとのリファレンスを確認してください。