はじめに
M5StackでWiFiに接続してNFTサーバーで時刻同期してみます.
開発環境
- Windows11
- M5Stack
- Arduino IDE
- M5StackでWiFi接続ができること
プログラムの書き込み
WiFiからNTPサーバーに接続して,それをLEDに表示するプログラムの書き込みをしています.
// ---------------------------------------------------------------
/*
ntp_adjust.ino
Sep/02/2021
*/
// ---------------------------------------------------------------
#include <M5Core2.h>
#include <time.h>
#include <WiFiMulti.h>
#include <WiFi.h>
// --------------------------
// for WiFi Param
//
char ssid[] = "yyyyyy";
char password[] = "xxxxxxxx";
WiFiMulti wifiMulti;
// --------------------------
// for Time Param
//
// ntp server
const char* ntpServer = "ntp.jst.mfeed.ad.jp";
// time difference
const long gmtOffset_sec = 9 * 3600;
// offset
const int daylightOffset_sec = 0;
// date and time obj
RTC_DateTypeDef RTC_DateStruct; // Data
RTC_TimeTypeDef RTC_TimeStruct; // Time
// day of the week list
static const char* wd[7] = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };
struct tm timeinfo;
String dateStr;
String timeStr;
char buf[60];
int connect_count = 0;
// ---------------------------------------------------------------
void getTimeFromNTP() {
// To get Time from NTP server
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
while (!getLocalTime(&timeinfo)) {
Serial.print("NTP : "); // シリアルモニターに表示
Serial.println(ntpServer); // シリアルモニターに表示
sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d\n", // 表示内容の編集
timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday,
timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
Serial.println(buf); // シリアルモニターに表示
delay(1000);
}
}
// ---------------------------------------------------------------
void setNTP2RTC() {
// timeSet
getTimeFromNTP();
getLocalTime(&timeinfo);
//
// read RTC
M5.Rtc.GetTime(&RTC_TimeStruct);
M5.Rtc.GetDate(&RTC_DateStruct);
// setting Date
RTC_DateStruct.Year = timeinfo.tm_year + 1900;
RTC_DateStruct.Month = timeinfo.tm_mon + 1;
RTC_DateStruct.Date = timeinfo.tm_mday;
RTC_DateStruct.WeekDay = timeinfo.tm_wday;
M5.Rtc.SetDate(&RTC_DateStruct);
// setting Time
RTC_TimeStruct.Hours = timeinfo.tm_hour;
RTC_TimeStruct.Minutes = timeinfo.tm_min;
RTC_TimeStruct.Seconds = timeinfo.tm_sec;
M5.Rtc.SetTime(&RTC_TimeStruct);
}
// ---------------------------------------------------------------
void setup() {
M5.begin();
Serial.begin(115200);
// ------------------------
// LED setting
//
// 背景黒リセット
M5.Lcd.fillScreen(BLACK);
// 文字色設定
M5.Lcd.setTextColor(WHITE, BLACK);
// ------------------------
// WiFi setting
//
// adding AP
wifiMulti.addAP(ssid, password);
//wifiMulti.addAP("TP-Link_53ED2.4", "58802717");
//WiFi.begin(ssid, pass);
// detect WiFi
while (WiFi.status() != WL_CONNECTED) {
wifiMulti.run();
Serial.println(connect_count); // シリアルモニターに表示
delay(500);
M5.Lcd.print(".");
connect_count++;
Serial.println(connect_count); // シリアルモニターに表示
if (connect_count > 20) {
M5.Lcd.print("connect!");
Serial.println(connect_count); // シリアルモニターに表示
break;
}
}
Serial.println(connect_count); // シリアルモニターに表示
if (connect_count < 20) {
// WiFi 接続成功
M5.Lcd.print("\nWiFi connected.");
// 時刻同期開始
setNTP2RTC();
} else {
// WiFi 接続失敗
M5.Lcd.print("\nWiFi did not connect.");
}
Serial.println("*** setup *** end ***");
}
// ---------------------------------------------------------------
void loop() {
// get data &time
M5.Rtc.GetDate(&RTC_DateStruct);
M5.Rtc.GetTime(&RTC_TimeStruct);
// setting text
M5.Lcd.setTextSize(3);
M5.Lcd.setCursor(10, 60, 1);
// LED print
M5.Lcd.printf("%04d.%02d.%02d %s\n", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date, wd[RTC_DateStruct.WeekDay]);
M5.Lcd.setTextSize(5);
M5.Lcd.setCursor(30, 140, 1);
M5.Lcd.printf("%02d:%02d:%02d", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds);
delay(500);
}
// ---------------------------------------------------------------
検証して書き込みます.
無事に接続して時刻同期ができました.

【Arduino】M5StackでNTP時刻同期してみる
M5StackでWiFiに接続してNFTサーバーで時刻同期してみます
結論
無事にWiFi経由でNTPサーバーに接続して時刻同期ができました.
WiFiMulti
では,wifiMulti.run();
をする必要があることを知らずに使っており,WiFiに接続できなくて困っておりました.
皆さんはきちんと記載して実行してくだださい.
参考文献
- 【Arduino】M5StickCをセットアップしてLEDを点滅させてみる
- M5Stack Core2: NTP で時刻を合わせる
- 【Arduino】「M5Stack」時刻同期しよう!(RTC非搭載)
- Study:M5Stack Core2 / RTC & touch
- NTPサーバーから時間取得、WiFiMultiで接続先 複数登録
- 【Arduino】M5StickCをセットアップしてLEDを点滅させてみる
- 【Arduino】M5StackでWiFiのセットアップしてみる
コメント