Arduino ESP32 最简单直接获取网络时间方法

Arduino ESP32 最简单直接获取网络时间方法ArduinoESP32最简单直接获取网络时间方法在ArduinoESP32核心支持库当中已经包含相关的获取时间的库,所有获取网络时间,只需要连接好网络,调用相关的库函数即可实现NTP时间的获取,免去的额外加载扩展库的头文件。实施条件ESP32需要在:WiFi.mode(WIFI_STA);模式下,配网并接入网络。使用下面函数从网络时间服务器上获取并设置时间:configTime(longgmtOffset_sec,intdaylightOffset_sec,constc



Arduino ESP32 最简单直接获取网络时间方法


✨在 ArduinoESP32核心支持库当中已经包含相关的获取时间的库,所有获取网络时间,只需要连接好网络,调用相关的库函数即可实现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     = "MERCURY_D268G";     // WIFI账户
const char* password = "pba5ayzk"; // 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();
    // 从网络时间服务器上获取并设置时间
    // 获取成功后芯片会使用RTC时钟保持时间的更新
   
// WiFi.disconnect(true);//断开wifi网络
// WiFi.mode(WIFI_OFF);//关闭网络
    Serial.println("WiFi disconnected!");
}

void loop()
{ 
   
  
  Serial.println("Waiting 10s before the next round...");
  delay(10000);
  setClock();
}

  • 🎉串口打印信息
    在这里插入图片描述

🧲默认的时间格式输出:asctime(&timeinfo),如果像将该数据传递给其他地方使用,可以使用char*变量来接收。例如:char* timelist=asctime(&timeinfo);需要注意的是,并不能使用const char* timelist2 =(&timeinfo, "%F %T %A");来接收这种格式化的数据,得到的将是%F %T %A的字符串结果。

🎄struct tm结构体与格式化输出

通过一个结构体将时间数据拆解成段,满足不同需求的显示。

  • struct tm结构体
struct tm { 
   
int tm_sec; // 秒,取值0~59;
int tm_min; // 分,取值0~59;
int tm_hour; // 时,取值0~23;
int tm_mday; // 月中的日期,取值1~31;
int tm_mon; // 月,取值0~11;
int tm_year; // 年,其值等于实际年份减去1900;
int tm_wday; // 星期,取值0~6,0为周日,1为周一,依此类推;
int tm_yday; // 年中的日期,取值0~365,0代表1月1日,1代表1月2日,依此类推;
int tm_isdst; // 夏令时标识符,实行夏令时的时候,tm_isdst为正;不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负
};

  • 格式化输出(只能在申明tm结构体函数内调用执行)

Serial.println(&timeinfo, "%F %T %A"); // 格式化输出:2021-10-24 23:00:44 Sunday Serial.print(asctime(&timeinfo));//默认打印格式:Mon Oct 25 11:13:29 2021

%a 星期几的简写
%A 星期几的全称
%b 月分的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的后两位数字
%d 十进制表示的每月的第几天
%D 月//%e 在两字符域中,十进制表示的每月的第几天
%F 年--%g 年份的后两位数字,使用基于周的年
%G 年分,使用基于周的年
%h 简写的月份名
%H 24小时制的小时
%I 12小时制的小时
%j 十进制表示的每年的第几天
%m 十进制表示的月份
%M 十时制表示的分钟数
%p 本地的AM或PM的等价显示
%r 12小时的时间
%R 显示小时和分钟:hh:mm
%S 十进制的秒数
%t 水平制表符
%T 显示时分秒:hh:mm:ss
%u 每周的第几天,星期一为第一天 (值从06,星期一为0%U 第年的第几周,把星期日做为第一天(值从053%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从06,星期天为0%W 每年的第几周,把星期一做为第一天(值从053%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从099%Y 带世纪部分的十进制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符

今天的文章Arduino ESP32 最简单直接获取网络时间方法分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/32281.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注