esp8266/ArduinoのRTC
ESP-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にあった。
で、以下のサンプルプログラムを試すと、無事動作した。
動作させると、シリアルモニターに以下のように出力された。
最初の1回目はntpでの同期が間に合っていないが、2回目以降は同期している。
ということで、esp8266/ArduinoではRTCをお手軽に使用できる。
以上の説明では、esp8266/ArduinoのgitHub上のソースにリンクを張っているが、これは最新版で、多くの人が使っているstable版とは若干違う。わたしもstable版を使用していて、プログラムのコンパイル・動作はstable版で行っている。
Comment-
YOU より:
2017年12月10日日曜日 17:11
-
nari より:
2017年12月10日日曜日 19:10
こんにちは。
現在Arduino IDE 1.8.4で、ESP8266.hを用いてWiFi接続をし、NTPサーバーに問い合わせて現在時刻を取得するプログラムを作っております。
WiFiの接続はうまくできたのですが、configTime関数を使うと
‘configTime’ was not declared in this scope
とエラーになってしまいます。
configTimeはArduino.hに含まれているのでArduino.hをインクルードしましたがやはりエラーになります。
原因は何でしょうか。
よろしくお願いします。
返事はQiitaの方に書きました。
https://qiita.com/h_nari/items/d0374d1e1e36b9d988c0