pdf-icon

Arduino 上手教程

2. 设备开发 & 案例程序

DinMeter 实时时钟

DinMeter RTC时钟相关API与案例程序。

  • 打开示例程序rtc,上传代码

案例程序

#define WIFI_SSID "YOUR WIFI SSID NAME"
#define WIFI_PASSWORD "YOUR WIFI PASSWORD"
在此两行输入Wi-Fi名称和密码,以获取实时时钟

cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
/**
* @file rtc.ino
* @author SeanKwok (shaoxiang@m5stack.com)
* @brief M5DinMeter RTC SNTP Test
* @version 0.1
* @date 2024-03-07
*
*
* @Hardwares: M5DinMeter
* @Platform Version: Arduino M5Stack Board Manager v2.1.1
* @Dependent Library:
* M5GFX: https://github.com/m5stack/M5GFX
* M5Unified: https://github.com/m5stack/M5Unified
*/
#if defined(ARDUINO)
#define WIFI_SSID "YOUR WIFI SSID NAME"
#define WIFI_PASSWORD "YOUR WIFI PASSWORD"
#define NTP_TIMEZONE "UTC-8"
#define NTP_SERVER1 "0.pool.ntp.org"
#define NTP_SERVER2 "1.pool.ntp.org"
#define NTP_SERVER3 "2.pool.ntp.org"
#include <WiFi.h>
// Different versions of the framework have different SNTP header file names and
// availability.
#if __has_include(<esp_sntp.h>)
#include <esp_sntp.h>
#define SNTP_ENABLED 1
#elif __has_include(<sntp.h>)
#include <sntp.h>
#define SNTP_ENABLED 1
#endif
#endif
#ifndef SNTP_ENABLED
#define SNTP_ENABLED 0
#endif
#include <M5DinMeter.h>
void setup(void) {
DinMeter.begin();
if (!DinMeter.Rtc.isEnabled()) {
Serial.println("RTC not found.");
DinMeter.Display.println("RTC not found.");
for (;;) {
vTaskDelay(500);
}
}
Serial.println("RTC found.");
// It is recommended to set UTC for the RTC and ESP32 internal clocks.
/* /// setup RTC ( direct setting )
// YYYY MM DD hh mm ss
DinMeter.Rtc.setDateTime( { { 2021, 12, 31 }, { 12, 34, 56 } } );
//*/
/// setup RTC ( NTP auto setting )
DinMeter.Display.print("WiFi:");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(500);
}
Serial.println("\r\n WiFi Connected.");
DinMeter.Display.print("Connected.");
configTzTime(NTP_TIMEZONE, NTP_SERVER1, NTP_SERVER2, NTP_SERVER3);
#if SNTP_ENABLED
while (sntp_get_sync_status() != SNTP_SYNC_STATUS_COMPLETED) {
Serial.print('.');
delay(1000);
}
#else
delay(1600);
struct tm timeInfo;
while (!getLocalTime(&timeInfo, 1000)) {
Serial.print('.');
};
#endif
Serial.println("\r\n NTP Connected.");
time_t t = time(nullptr) + 1; // Advance one second.
while (t > time(nullptr))
; /// Synchronization in seconds
DinMeter.Rtc.setDateTime(gmtime(&t));
}
void loop(void) {
static constexpr const char* const wd[7] = {"Sun", "Mon", "Tue", "Wed",
"Thr", "Fri", "Sat"};
delay(500);
auto dt = DinMeter.Rtc.getDateTime();
Serial.printf("RTC UTC :%04d/%02d/%02d (%s) %02d:%02d:%02d\r\n",
dt.date.year, dt.date.month, dt.date.date,
wd[dt.date.weekDay], dt.time.hours, dt.time.minutes,
dt.time.seconds);
DinMeter.Display.setCursor(0, 0);
DinMeter.Display.printf("RTC UTC :%04d/%02d/%02d (%s) %02d:%02d:%02d",
dt.date.year, dt.date.month, dt.date.date,
wd[dt.date.weekDay], dt.time.hours, dt.time.minutes,
dt.time.seconds);
/// ESP32 internal timer
auto t = time(nullptr);
{
auto tm = gmtime(&t); // for UTC.
Serial.printf("ESP32 UTC :%04d/%02d/%02d (%s) %02d:%02d:%02d\r\n",
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
wd[tm->tm_wday], tm->tm_hour, tm->tm_min, tm->tm_sec);
DinMeter.Display.setCursor(0, 20);
DinMeter.Display.printf("ESP32 UTC :%04d/%02d/%02d (%s) %02d:%02d:%02d",
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
wd[tm->tm_wday], tm->tm_hour, tm->tm_min,
tm->tm_sec);
}
{
auto tm = localtime(&t); // for local timezone.
Serial.printf("ESP32 %s:%04d/%02d/%02d (%s) %02d:%02d:%02d\r\n",
NTP_TIMEZONE, tm->tm_year + 1900, tm->tm_mon + 1,
tm->tm_mday, wd[tm->tm_wday], tm->tm_hour, tm->tm_min,
tm->tm_sec);
DinMeter.Display.setCursor(0, 40);
DinMeter.Display.printf("ESP32 %s:%04d/%02d/%02d (%s) %02d:%02d:%02d",
NTP_TIMEZONE, tm->tm_year + 1900, tm->tm_mon + 1,
tm->tm_mday, wd[tm->tm_wday], tm->tm_hour,
tm->tm_min, tm->tm_sec);
}
}

上传完成就可以看到下面的效果了

On This Page