われがわログ

最適化アルゴリズムとかプログラミングについて書きたい

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_COMPLETEDSNTP_SYNC_STATUS_IN_PROGRESSである)ことを確認すればよさげだ。

github.com

つまり、以下のコードとすればよい。

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なのでコピペしても安心である。