esp8266/ArduinoのRTC

f161108a1ESP-WROOM-02等で使用するesp8266/Arduinoでは、サンプロプログラムにNTPClienttが含まれていることもあり、現在の時刻を取得するRTC(Real Time Clock)は自分で作成するものだと思い込んでいた。

時刻を取得するたびにntpパケットを飛ばすのもどうかと思うので、ntpパケットは適当な間隔で飛ばして、millis()関数とのオフセットでも管理することになるのかな。ntpサーバ1つだけだと嫌だな、とか色々考えているうち、偶然 esp8266/Arduinoの中にtime.cというファイルを発見。configTime()関数で、サーバーやタイムゾーン等を設定してやれば、time()関数でUNIX時間を取得できそう。

中身は、sntp.cの各関数を呼び出しているらしい…って、sntp組み込まれてる。 time()関数を呼び出すと,そのまま sntp_get_current_timestamp()関数が呼び出されるのだが、そのたびにntpパケット投げられるといやだなと sntp_get_current_timestamp()のソースプログラムを見ると、realtime_stampという変数の値を返すだけだ。sntp.cのソースを眺めると、デフォルトでは1時間に1回パケットを投げるみたい。

最後に気になったのがtime.hにconfigTime()の宣言が無いこと。それじゃ使えないじゃんと思ったがArduino.hにあった。

で、以下のサンプルプログラムを試すと、無事動作した。

動作させると、シリアルモニターに以下のように出力された。

sc161108a1

最初の1回目はntpでの同期が間に合っていないが、2回目以降は同期している。
ということで、esp8266/ArduinoではRTCをお手軽に使用できる。

以上の説明では、esp8266/ArduinoのgitHub上のソースにリンクを張っているが、これは最新版で、多くの人が使っているstable版とは若干違う。わたしもstable版を使用していて、プログラムのコンパイル・動作はstable版で行っている。

Comment

  1. YOU より:

    こんにちは。
    現在Arduino IDE 1.8.4で、ESP8266.hを用いてWiFi接続をし、NTPサーバーに問い合わせて現在時刻を取得するプログラムを作っております。

    WiFiの接続はうまくできたのですが、configTime関数を使うと
    ‘configTime’ was not declared in this scope
    とエラーになってしまいます。

    configTimeはArduino.hに含まれているのでArduino.hをインクルードしましたがやはりエラーになります。

    原因は何でしょうか。
    よろしくお願いします。

Leave a Reply

メールアドレスが公開されることはありません。