#はじめに
ESP32 のバッテリー駆動のときに良く使うdeepsleepですが、実際にどのくらいの誤差があるのか調べてみた。
キッカケは、12時間ほど寝かせたら数分の差が出たので、もうちょっとだけ正確な方がいいかなと思った。
元ネタとなり、参考とさせて頂いた ESP8266版がこちらになります。
ESP8266ですとおよそ、2.3% ほど早く指定時間より早くWakeupするそうです。
#ESP32
実際に使用したESP32。上2つは開発ボード。スイッチサイエンス版はDIP化して使用。
ESP32 | 購入先 |
---|---|
ESP32-DevKitC ESP-WROOM-32開発ボード | 秋月電子通商 |
HiLetgo ESP32 ESP-32S NodeMCU開発ボード | HiLetgo |
ESP32-WROOM-32D Wi-Fi + BLEモジュール | スイッチサイエンス |
#調査方法
元ネタは、RTCモジュールを使っているのですが、面倒なのでAmbientサーバの時刻の差で簡単に測ってみることにしました。3時間を3回連続で。
Ambientは受信時刻を記録しているので、他に、Ambientに送信してから寝るまでの時間(AS)と起きてから送信するまでの時間(WA)をデータとしてAmbientに送っておきます。よって、
実際に寝ていた時間SW2 = AA - (AS2 + WA2)
ということになります。
起きてから送信するまでの時間(WA)は、Ambient に送信する前に millis() で起動からの時間を使いました。
WA = millis();
ambient.send(WA, AS);
送信してから寝るまでの時間(AS)は、DeepSeep 直前で、
AS = millis() - WA;
esp_deep_sleep_start();
※3時間で1分ぐらいの差が出る想定ですので、Ambientへの送受信時間は無視しました。許容範囲かと。
※結果的には、WA,ASも無視してよい時間でした。WiFi接続に掛かる時間も1秒ぐらいでしたし。
#結果
###Ambient データ
2019-10-05T09:57:40.541Z,0,1169,,,,,,
2019-10-05T12:56:56.192Z,89,1076,,,,,,
2019-10-05T15:55:50.333Z,86,1123,,,,,,
2019-10-05T18:54:56.422Z,91,1100,,,,,,
2019-10-05T21:53:31.936Z,83,1176,,,,,,
2019-10-06T00:52:39.708Z,82,1125,,,,,,
2019-10-06T03:51:34.157Z,85,1101,,,,,,
2019-10-05T09:57:33.102Z,0,1131,,,,,,
2019-10-05T12:56:23.105Z,85,1071,,,,,,
2019-10-05T15:55:10.675Z,82,1106,,,,,,
2019-10-05T18:54:11.482Z,84,1071,,,,,,
2019-10-05T21:52:43.656Z,91,1108,,,,,,
2019-10-06T00:51:52.953Z,82,1082,,,,,,
2019-10-06T03:50:46.230Z,89,1871,,,,,,
2019-10-05T12:24:26.746Z,0,1229,,,,,,
2019-10-05T15:22:40.139Z,90,1874,,,,,,
2019-10-05T18:21:44.531Z,85,1118,,,,,,
2019-10-05T21:20:28.176Z,92,1081,,,,,,
2019-10-06T00:19:33.532Z,91,1074,,,,,,
2019-10-06T03:18:36.512Z,82,1117,,,,,,
以下が集計結果です。1~6回計測。
見方は、-45.5 というのは3時間のDeepSleep指定で45.5秒早く起きたということです。
誤差は、3時間のDeepSleep指定で平均-0.58%の誤差があったということです。
1回目 | 2回目 | 3回目 | 4回目 | 5回目 | 6回目 | 平均 | 誤差% | |
---|---|---|---|---|---|---|---|---|
秋月電子通商 | -45.5 | -67.0 | -55.1 | -85.7 | -53.4 | -66.7 | -62.2 | -0.58 |
HiLetgo | -71.1 | -73.6 | -60.3 | -89.0 | -51.8 | -68.6 | -69.1 | -0.64 |
スイッチサイエンス | -108.5 | -56.8 | -77.5 | -55.8 | -58.2 | - | -71.3 | -0.66 |
#まとめ
上記の結果を踏まえると、3時間のDeepSleepで約1~2分早く目覚めるということが分かりました。
なので、例えば12時間のDeepSleepさせたいときは、誤差-0.6%発生することを加味して、
set_sleep_sec = 12 * 60 * 60; // sec
esp_sleep_enable_timer_wakeup(set_sleep_sec * 1000000LL * 1.006);
esp_deep_sleep_start();
のようにしておけば大体よろしいかと。まぁそれでも12時間だと1,2分の差は覚悟が必要ですね。