iikagenlabo

興味のあることを良い加減で研究していきます

M5Stack NTPで時刻合わせ

f:id:iikagenlabo:20190707150412j:plain

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;

これを使って指定時刻に天気情報を取得するようにしています。