说明: 这是学习笔记,仅做分享用途, 其中会引用其他博文的内容,时间关系不能一一将引用的文章都列举出来,如有冒犯,还请见谅
目录
1. 使用ESP32和OLED显示屏的互联网时钟 - 乐鑫ESP32 - 一板网电子技术论坛 (yiboard.com)
2.公共 NTP 网络时间服务器地址大全 Public NTP Server - DNS.iCoA.CNhttps://dns.icoa.cn/ntp/
3.
之前看到一些博文通过ESP32做了一个通过NTC服务器+RTC获得授时时钟,于是也想试一下做一个.
1. 需要知道如何将ESP32连接到互联网;
2. NTP(网络时间协议)和UDP(用户数据报协议)通过Wi-Fi从互联网获取时间.
NTP,Network Time Protocol (网络时间协议)是一种网络协议,用于系统和数据网络之间的时间同步。 NTP服务器可以通过UDP端口号123将时钟发送到客户端计算机的软件。
在这里我打算使用阿里云公共 NTP 服务器:
time.pool.aliyun.com
下面这篇博文提供的步骤已经非常清晰了, 直接参考:使用Arduino开发ESP32(19):获取网络时间_Naisu Xu的博客-CSDN博客_arduino获取网络时间https://blog.csdn.net/Naisu_kun/article/details/115627629
也引用上面博文的代码,这里我只是修改了想要使用的NTP服务器的IP,
- #include
-
- const char *ssid = "********"; //你的网络名称
- const char *password = "********"; //你的网络密码
-
- const char *ntpServer = "time.pool.aliyun.com";
- const long gmtOffset_sec = 8 * 3600;
- const int daylightOffset_sec = 0;
-
- void printLocalTime()
- {
- struct tm timeinfo;
- if (!getLocalTime(&timeinfo))
- {
- Serial.println("Failed to obtain time");
- return;
- }
- Serial.println(&timeinfo, "%F %T %A"); // 格式化输出
- }
-
- void setup()
- {
- Serial.begin(115200);
- Serial.println();
-
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED)
- {
- delay(500);
- Serial.print(".");
- }
- Serial.println("WiFi connected!");
-
- // 从网络时间服务器上获取并设置时间
- // 获取成功后芯片会使用RTC时钟保持时间的更新
- configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
- printLocalTime();
-
- WiFi.disconnect(true);
- WiFi.mode(WIFI_OFF);
- Serial.println("WiFi disconnected!");
- }
-
- void loop()
- {
- delay(1000);
- printLocalTime();
- }
实验现象:
代码解析:一开始我以为在整个过程中使用的都是NTP上的时间,但是我发现是我误解了, 从代码可以看出,在连接上服务器获取了时间之后连接就可以断开,此时获取的时间被更新到ESP32的RTC中,后面获取的都是RTC时钟的时间.
思考
在loop中通过delay的方式将时间输出,如果程序稍微复杂一点,输出的时间就是非常不准确,是否有STM32 RTC的秒中断或者ALARM中断的接口?
查找了一下,并没有发现有RTC中断的接口, 如果遇到类似的问题或者可以通过定时器的方式使得输出的时间不会被其他执行函数所延迟吧.