M5Unified を使ったRTC同期のソースコードが見つからなかったので書きました。
ソースコード
#include "M5StickCPlus2.h"
#include <WiFi.h>
#include "time.h"
const char* ssid = "wifiiiii";
const char* password = "passssss";
void setup()
{
// put your setup code here, to run once:
M5.begin();
M5.Lcd.setRotation(3);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setTextSize(1);
M5.Lcd.setCursor(40, 0, 2);
M5.Lcd.println("RTC NTP TEST");
// connect to WiFi
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
// Set ntp time to local
configTime(3600L * 9, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
// 起動ごとに時刻同期するために同期タイミングを一時的に変更
auto default_interval = sntp_get_sync_interval(); // ミリ秒単位
sntp_set_system_time(1, 0); // 1秒
// Set RTC
struct tm timeInfo;
if (getLocalTime(&timeInfo))
{
M5.Rtc.setDateTime(timeInfo);
}
sntp_set_system_time(default_interval * 1000, 0); // 同期タイミングを戻す
// disconnect WiFi
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
}
void loop()
{
M5.Lcd.setCursor(0, 30);
M5.Lcd.printf("Data: %04d-%02d-%02d\n", M5.Rtc.getDate().year, M5.Rtc.getDate().month, M5.Rtc.getDate().date);
M5.Lcd.printf("Time: %02d : %02d : %02d\n", M5.Rtc.getTime().hours, M5.Rtc.getTime().minutes, M5.Rtc.getTime().seconds);
delay(500);
}
処理内容の説明
- setup()
- WiFiに接続する
- NTPの同期タイミングを変更する(デフォルトで3時間?)
- NTPサーバーに接続し、ローカルの時刻を更新する
- ローカルの時刻をもとにRTCの時刻を更新する
- NTPの同期タイミングを戻す
- loop()
- RTC から取得した日時を、500ミリ秒ごとに表示する
はまりポイント
同期タイミングを変更せずに時刻更新を行うと、Wifiが常時接続されていない&常時起動しておくための装置ではないため、時刻同期が全然行われない。
時刻同期が行われないままgetLoclTime()をすると、M5Stickを起動するたびに、時差分の9時間ずつ時計がずれていく。
そのため起動時には必ず時刻同期を行うようにする。
参考にさせていただいたサイト
- https://lang-ship.com/blog/work/m5stickc-rtc-ntp/#google_vignette
- https://rikoubou.hatenablog.com/entry/2021/04/09/181612
- https://lang-ship.com/blog/work/m5stickc-rtc-ntp/
- https://take4-blue.com/program/arduino%EF%BC%8Desp32%E3%81%AEntp%E6%8E%A5%E7%B6%9A%E3%81%A7%E6%99%82%E5%88%BB%E8%A8%AD%E5%AE%9A/