【Arduino】M5StackでNTP時刻同期してみる

IoT

はじめに

M5StackでWiFiに接続してNFTサーバーで時刻同期してみます.

開発環境

プログラムの書き込み

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に接続できなくて困っておりました.
皆さんはきちんと記載して実行してくだださい.

参考文献

コメント

タイトルとURLをコピーしました