2022年4月22日金曜日

ESP32 DeepSleepしたときRTCのタイムゾーンの設定がリセットされる問題

ESP32のRTCモジュールは、DeepSleepを実行しても動き続け、復帰したときに正しく時間をカウントしている筈なのだが、実際に実行してみるとどうやらタイムゾーンの設定がリセットされているようだ。

テスト用スケッチ

テストのために次のスケッチを実行する



実行結果は次の通りで、パワーオンリセット直後は正しくNTPによるRTCの設定ができているものの、DeepSleepReset後のRTCの値は、ちょうど9時間ズレている。つまり、RTCタイマーだけは正しく動作しているが、タイムゾーンの設定だけはDeepSleepによりリセットされてしまう。

対策

対策としては3つ
1:DeepSleep復帰後にタイムゾーンだけ再設定する
2:RTCの設定を最初からGMTではなくJSTで設定する
3:DeepSleep復帰ごとに毎回NTPの設定をする

このうち3については、DeepSleepの周期を10秒のように短く設定した場合、毎回WiFi接続するため電池の負担が増え、またNTPサーバにも負担をかけてしまうのでやらない。

DeepSleep復帰後にタイムゾーンだけ再設定する

スケッチは次の通りで、
setTimeZone()関数を追加し、DeepSleep復帰後にだけ呼び出している


実行結果は以下のとおり。正しくRTCの数値が表示されるようになった。

setTimeZone()関数はesp32-hal-time.cに記述されているのだが、スケッチから実行できなかったので、この関数のみスケッチに追加することにした。

応用

RTC_DATA_ATTR int bootCount = 0;

などを追加して、スローメモリに復帰した回数を記憶しておけば、NTPの設定を1日ごとに実行できる。

DeepSleep復帰時のRTCを見て、決まった時間にだけNTPの更新を行うのもアリ。





0 件のコメント:

コメントを投稿