Arduino ESP32 获取网络时间并同步本地

Arduino ESP32 获取网络时间并同步本地


  • 🎉 在 ArduinoESP32核心支持库当中已经包含相关的获取时间的库,获取网络时间后,就可以不依赖网络,重复去获取时间,如果长时间运行,可以设置间隔时间同步NTP时间,只要访问本地时间的相关函数能正常调用,就没有问题。
  • 🔖使用读取本地时间,好处就是不需要频繁去获取NTP时间,占用网络资源,最大节省资源,适合低功耗下运行,保证时间运行准确。只要开机运行获取一次网络时间后,就可以关闭网络,后面读取本地时间,可以最大限度的不依赖网络来获取时间。
  • 🔖在访问本地时间的时候,有些看似不重要的细节,往往很容易掉到坑里去。

🧲实施条件

  • 🌿ESP32需要在:WiFi.mode(WIFI_STA);模式下,配网并接入网络。
  • 🌿使用下面函数从网络时间服务器上获取并设置时间:
configTime(long gmtOffset_sec, int daylightOffset_sec, const char* server1, const char* server2 = nullptr, const char* server3 = nullptr)
  • 🔖参数说明:
  • gmtOffset_sec 参数就是用来修正时区的,比如对于我们东八区(UTC/GMT+08:00)来说该参数就需要填写 8 * 3600 ;
  • daylightOffset_sec使用夏令时 daylightOffset_sec 就填写3600,否则就填写0;

通过网络时间服务器获得的时间是世界协调时间(UTC)/格林尼治时间(GMT),不同地区的时间可以通过时区换算.

  • 设置完成后就可以使用下面函数读取当前时间了:
bool getLocalTime(struct tm * info, uint32_t ms = 5000)
  • 📄参数说明:
  • ms 为该操作超时时间,超时则返回false;
    info 是一个 struct tm 结构体对象,用于接收当前时间;

获取成功后芯片会使用RTC时钟保持时间的更新,这时候,就可以不依赖网络了,可以关闭网络,运行时读取本地同步过的时间。

🎯测试例程一

  • 有网状态下,更新时间。
/**
  ESP32 
*/

#include <WiFi.h>

#define NTP1  "ntp1.aliyun.com"
#define NTP2  "ntp2.aliyun.com"
#define NTP3  "ntp3.aliyun.com"

//填写WIFI入网信息
const char* ssid     = "########";     // WIFI账户
const char* password = "********"; // WIFI密码

void setClock() {
   
  struct tm timeinfo;
    if (!getLocalTime(&timeinfo))
    {
   //如果获取失败,就开启联网模式,获取时间
        Serial.println("Failed to obtain time");
     //    WiFi.disconnect(false);
        WiFi.mode(WIFI_STA);//开启网络  
       WiFi.begin(ssid, password);
         while (WiFi.status() != WL_CONNECTED)
    {
   
        delay(500);
        Serial.print(".");
    }
     configTime(8 * 3600, 0, NTP1, NTP2,NTP3);
        return;
    }
    Serial.println(&timeinfo, "%F %T %A"); // 格式化输出:2021-10-24 23:00:44 Sunday
    Serial.print(asctime(&timeinfo));//默认打印格式:Mon Oct 25 11:13:29 2021
  //   WiFi.disconnect(true);//断开网络连接,关闭网络
}

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);
      setClock()
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值