M5Stackは時計にするにはちょうど良い大きさですね。 時刻合わせにNTPサーバーを使う記事も多くあって参考になりました。
「明日の天気」では決まった時刻に天気情報を取ってくるために時刻合わせをしました。 指定時刻になったかどうか調べる関数も一緒にクラスにしたので紹介します。
LocalClock.h
class LocalClock { public: LocalClock() {} // NTPサーバーで時刻合わせ void configNtpTime(); // 時刻の初期化 void initTime(); // 時間更新処理 void tick(); // 現在の時刻を取得 struct tm getNowTime() const { return now_time; } // 指定時刻をまたいだかどうか bool checkTime(struct tm time) const; // 時刻の差分を求める double diffTime(struct tm t0, struct tm t1) const; private: // NTPサーバー const char* ntpServer = "ntp.jst.mfeed.ad.jp"; const long gmtOffset_sec = 9 * 3600; const int daylightOffset_sec = 0; struct tm pre_time; struct tm now_time; };
LocalClock.cpp
#include <M5Stack.h> #include <WiFi.h> #include "time.h" #include "LocalClock.h" // NTPサーバーで時刻合わせ void LocalClock::configNtpTime() { configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); // 取得した時間を表示 struct tm timeinfo; getLocalTime(&timeinfo); Serial.printf("%02d:%02d:%02d\n", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec); } // 時刻の初期化 void LocalClock::initTime() { getLocalTime(&now_time); } // 時間更新処理 void LocalClock::tick() { // 前回の時刻を保存して、現在の時刻を取得する pre_time = now_time; getLocalTime(&now_time); } // 指定時刻をまたいだかどうか bool LocalClock::checkTime(struct tm time) const { if((diffTime(now_time, time) >= 0.0) && (diffTime(time, pre_time) >= 0.0)) return true; return false; } // 時刻の差分を求める double LocalClock::diffTime(struct tm t0, struct tm t1) const { // struct tm をtime_tに変換 time_t time0 = mktime(&t0); time_t time1 = mktime(&t1); // 差分を求める time0 - time1 return difftime(time0, time1); }
LocalClock local_clock;
などとしてクラスの実体を生成したあと、
local_clock.configNtpTime(); local_clock.initTime();
でNTPで時刻設定して取得します。
あとは、指定時刻をまたいだかどうかをcheckTime()で調べられます。
bool checkTime(struct tm time) const;
これを使って指定時刻に天気情報を取得するようにしています。