知的好奇心 for IoT

IoT関連の知的好奇心を探求するブログです

ベランダの温湿度計測時の時刻が、あの"1970/01/01"になることがあったので対策を講じた

最近引っ越ししたこともあってブログの更新が全然できていなかったので、ちょっと気になっていたことを書いてみます。

 

はい、みなさん一度は見たことがあるのではないでしょうか?あの、謎の日付”1970/01/01"が、ベランダに設置している温湿度計の計測日時としてちょくちょく表示されるようになっていたんです。

スクリーンキャプチャはこちら。

f:id:IntellectualCuriosity:20191213173505j:plain

時刻が"00:00"ではなく"08:00"になっているのは、UTC(世界協定時)にJST(日本標準時)のオフセットを追加しているせいですが、"09:00"になっていないことの深追いはしていません。

コードではこんな風になっています。(該当部分のみの抜粋)

#define NTP_SERVER "ntp.nict.jp" // National Institute of Information and Communications Technology
#define TIME_OFFSET 9*60*60 // UTC+9h (JST)

configTime(TIME_OFFSET, 0, NTP_SERVER);

時間の取得先は日本の時間を決めている情報通信研究機構のNTPサーバーです。

現在時刻の取得は次のコードだけで取れていたのですが、情報通信機構のNTPサーバーが重くなっているのか、時刻が取得できないことが多くなっているみたいです。

now = time(nullptr);

それで、時間が取得できるまでループするように修正しました。

最初はnowが0だとループするようにしていましたが、それだとNTPサーバーから時間が取れなかった場合でも内部の時間経過でループから抜けてしまうことがあるようだったので、今の時間が取れているか"2019-01-01 00:00:00"のエポックタイムと比較するようにしています。

time_t now = 0;
while (now < 1546268400L) { // 2019-01-01 00:00:00
  now = time(nullptr);
  delay(500);
}

あと、以前に載せていたNTPの取得コードより簡潔なコードになっています。

以前のコードはWiFiUDPとNTPClientを使用していましたが、configTimeで時間を取得できることが分かったんです。

以前のコードはこんな感じです。

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_SERVER, TIME_OFFSET);
timeClient.begin();
while (!timeClient.update()) {
  delay(500);
}
setTime(timeClient.getEpochTime());

でも、以前のコードはNTPの更新をチェックしていたので、問題が発生するように改悪してしまっていただけのような気もしています...。

 

おしまい