M5PaperでNTPサーバの時刻をRTCに正しく設定する
M5Paper開発の際、NTPで取得してRTCに設定した時刻がたまにズレて困っていたが、configTzTime()
を呼んだ後にsntp_get_sync_status()
で同期状態を確認するようにしたら直った。sntp_get_sync_status()
を紹介している日本語記事は見当たらなかったので、短いが記事にしておく。
最初は以下のようなコードを書いていたが、分・秒の値が狂うことがあり気になっていた。
configTzTime(tz, server1, server2, server3); struct tm datetime; if (!getLocalTime(&datetime)) return 1; //error //以下でRTCに時刻を設定
ググッてみたところ、esp-idfの公式リポジトリに答えがあった。sntp_get_sync_status()
の戻り値が、SNTP_SYNC_STATUS_RESET
でない(SNTP_SYNC_STATUS_COMPLETED
かSNTP_SYNC_STATUS_IN_PROGRESS
である)ことを確認すればよさげだ。
つまり、以下のコードとすればよい。
configTzTime(tz, server1, server2, server3); struct tm datetime; int retry = 0; constexpr int retry_count = 50; while (sntp_get_sync_status() == SNTP_SYNC_STATUS_RESET && ++retry < retry_count) { delay(100); } if (retry == retry_count) { return 1; //error } if (!getLocalTime(&datetime)) return 1; //error //以下でRTCに時刻を設定
ちなみに、上記のesp-idfレポジトリのコードはPublic Domainなのでコピペしても安心である。