Arduino ESP32 获取网络时间并同步本地RTC时钟
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino ESP32 获取网络时间并同步本地RTC时钟相关的知识,希望对你有一定的参考价值。
Arduino ESP32 获取网络时间并同步本地RTC时钟
在 ArduinoESP32核心支持库当中已经包含相关的获取时间的库,获取网络时间后,就可以不依赖网络,重复去获取时间,如果长时间运行,可以设置间隔时间同步NTP时间,只要访问本地时间的相关函数能正常调用,就没有问题。
使用读取本地时间,好处就是不需要频繁去获取NTP时间,占用网络资源,最大节省资源,适合低功耗下运行,保证时间运行准确。只要开机运行获取一次网络时间后,就可以关闭网络,后面读取本地时间,可以最大限度的不依赖网络来获取时间。
- 调试了一天,掉坑里去了,在访问本地时间的时候,有些看似不重要的细节,往往很容易掉到坑里去。
最容易掉坑的地方!
在获取本地时间的时候,一定要先判断一下
getLocalTime()
布尔类型函数的返回值:
struct tm timeInfo; //声明一个结构体
if (!getLocalTime(&timeInfo))
{ //一定要加这个条件判断,否则内存溢出
Serial.println("Failed to obtain time");
return;
}
这一点不像ESP8266库那样,只要申请了时间结构体的变量,就随便可以直接调用本地时间。
- 如果想将访问到的本地时间,来作为OLED显示输出的话,读取本地时间特别要注意,很容易造成内存溢出,导致系统重启,所以操作相关的时间函数时,特别要小心。
- 如果只是作为串口打印输出的话,可以参考《Arduino ESP32 最简单直接获取网络时间方法》,就可以,格式化打印时间和操作数据还是有差别的。拿到本地String类型的时间数据,你可以用这个数据用到其他地方。
调试了一天最终无bug的程序!(不容易啊!)
#include <Arduino.h>
#include <WiFi.h>
#define NTP1 "ntp1.aliyun.com"
#define NTP2 "ntp2.aliyun.com"
#define NTP3 "ntp3.aliyun.com"
//填写WIFI入网信息
const char *ssid = "MERCURY_D268G"; // WIFI账户
const char *password = "pba5ayzk"; // WIFI密码
const String WDAY_NAMES[] = {"星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; //星期
const String MONTH_NAMES[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; //月份
//time_t now; //实例化时间
void setClock()
{
struct tm timeInfo; //声明一个结构体
if (!getLocalTime(&timeInfo))
{ //一定要加这个条件判断,否则内存溢出
Serial.println("Failed to obtain time");
return;
}
//Serial.print(asctime(&timeInfo)); //默认打印格式:Mon Oct 25 11:13:29 2021
String date = WDAY_NAMES[timeInfo.tm_wday];
Serial.println(date.c_str());
// sprintf_P(buff1, PSTR("%04d-%02d-%02d %s"), timeInfo.tm_year + 1900, timeInfo.tm_mon + 1, timeInfo.tm_mday, WDAY_NAMES[timeInfo.tm_wday].c_str());
String shuju = String(timeInfo.tm_year + 1900); //年
shuju += "-";
shuju += timeInfo.tm_mon + 1; //月
shuju += "-";
shuju += timeInfo.tm_mday; //日
shuju += " ";
shuju += timeInfo.tm_hour; //时
shuju += ":";
shuju += timeInfo.tm_min;
shuju += ":";
shuju += timeInfo.tm_sec;
shuju += " ";
shuju += WDAY_NAMES[timeInfo.tm_wday].c_str(); //星期
Serial.println(shuju.c_str());
}
void setup()
{
Serial.begin(115200);
Serial.println();
//设置ESP32工作模式为无线终端模式
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected!");
configTime(8 * 3600, 0, NTP1, NTP2, NTP3);
}
void loop()
{
Serial.println("Waiting 10s before the next round...");
delay(10000);
setClock();
// printLocalTime();
}
- 串口打印输出
以上是关于Arduino ESP32 获取网络时间并同步本地RTC时钟的主要内容,如果未能解决你的问题,请参考以下文章
Arduino ESP32 通过getString方法获取网络时间和气象数据
Arduino ESP32 获取网络数据(HTTP GET方式)
Arduino ESP32 获取网络数据(HTTP PUT方式)
Arduino ESP32 获取网络数据(HTTP POST方式)