|
| RTC(Real Time Clock) |
WiFiを使って日付と時刻の取得の記事で取得したデータをRTC(Real Time Clock)に適用します。
/*
*******************************************************************************
* M5Stack prototype
* date:2022/7/27
* Author Sadajejeje
*******************************************************************************
*/
#include <M5Core2.h>
#include <WiFi.h>
#define JST (3600L * 9)
const char* ssid = "your_ssid";
const char* password = "your_password";
bool conected = true;
RTC_TimeTypeDef rtcTime;
RTC_DateTypeDef rtcDate;
void setup(){
M5.begin(); //Init M5Core2
M5.Lcd.setTextSize(2);
int connectCnt = 0;
WiFi.begin(ssid, password);
M5.Rtc.begin(); //Initialize the RTC clock.
while (WiFi.status() != WL_CONNECTED){
delay(500);
M5.Lcd.print('*');
connectCnt++;
if(connectCnt >=10){
conected = false;
break;
}
}
if(conected == true){
M5.Lcd.print("\n\nIP Address ");
M5.Lcd.println(WiFi.localIP());
delay(1000);
configTime(JST,0,"ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp");
}
M5.Lcd.setTextSize(3);
}
void loop(){
struct tm tm;
char buf[32];
if(conected == true){
if(getLocalTime(&tm)){
M5.Lcd.setTextDatum(TC_DATUM);
sprintf(buf, "%d/%d/%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
M5.Lcd.drawString(buf, 160, 80, 2);
sprintf(buf, "%02d:%02d:%02d\n", tm.tm_hour, tm.tm_min, tm.tm_sec);
M5.Lcd.drawString(buf, 160, 140, 2);
rtcDate.Year = tm.tm_year + 1900;
rtcDate.Month = tm.tm_mon + 1;
rtcDate.Date = tm.tm_mday;
M5.Rtc.SetDate(&rtcDate);
rtcTime.Hours = tm.tm_hour;
rtcTime.Minutes = tm.tm_min;
rtcTime.Seconds = tm.tm_sec;
M5.Rtc.SetTime(&rtcTime);
}
}
else{
M5.Lcd.setTextDatum(TC_DATUM);
M5.Rtc.GetDate(&rtcDate);
sprintf(buf, "%d/%d/%d\n", rtcDate.Year, rtcDate.Month, rtcDate.Date);
M5.Lcd.drawString(buf, 160, 80, 2);
M5.Rtc.GetTime(&rtcTime);
sprintf(buf, "%02d:%02d:%02d\n", rtcTime.Hours, rtcTime.Minutes, rtcTime.Seconds);
M5.Lcd.drawString(buf, 160, 140, 2);
}
delay(1000);
}
ssidとpasswordはご自分の機器に合わせてください。 M5.Rtc.SetDate(&rtcDate); M5.Rtc.SetTime(&rtcTime); RTCに日付と時間のデータをセットします。 M5.Rtc.GetDate(&rtcDate); M5.Rtc.GetTime(&rtcTime); RTCからのデータを読みだします。 I2Cだとちょっと面倒ですが、簡単なAPIです。 WiFiが使えるときはNPTからのデータを表示します。 WiFiが使えないときはRTCからのデータを表示します。 RTCは製品により1日で1秒狂ったり、1カ月で1秒しか狂わないなど製品の精度が異なります。 |