赞
踩
时间是软硬件系统或设备中比较重要的东西,特别是需要和外部进行交互时就更加需要用到有个统一的时间了。目前来说只要能联网的设备的时间主要是从网络时间服务器(NTP)上获取的,这篇文章将对此做个简单的说明。
在Arduino core for the ESP32中获取网络时间是非常简单的,只要下面几步就行:
void configTime(long gmtOffset_sec, int daylightOffset_sec, const char* server1, const char* server2 = nullptr, const char* server3 = nullptr)
pool.ntp.org
;gmtOffset_sec
参数就是用来修正时区的,比如对于我们东八区(UTC/GMT+08:00)来说该参数就需要填写 8 * 3600
;daylightOffset_sec
就填写3600,否则就填写0;bool getLocalTime(struct tm * info, uint32_t ms = 5000)
ms
为该操作超时时间,超时则返回false;info
是一个 struct tm
结构体对象,用于接收当前时间;在Arduino core for the ESP32中获取网络时间是非常简单的,只要先连上网,然后就可以调用库中封装的方法获取网络时间了。下面是个简单的示例演示:
#include <WiFi.h> const char *ssid = "********"; //你的网络名称 const char *password = "********"; //你的网络密码 const char *ntpServer = "pool.ntp.org"; 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(); }
可用的网络时间服务器主要有下面一些:
Area | HostName |
---|---|
Worldwide | pool.ntp.org |
Asia | asia.pool.ntp.org |
Europe | europe.pool.ntp.org |
North America | north-america.pool.ntp.org |
South America | south-america.pool.ntp.org |
Oceania | oceania.pool.ntp.org |
该结构体代码如下:
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()为负
};
该结构体可以格式化输出,格式化规则如下:
%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 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
%U 第年的第几周,把星期日做为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十进制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符
使用 time()
函数可以获取到一个包含从1970年开始到现在的秒数对象 time_t
:
在Arduino core for the ESP32中获取网络时间比较简单,更多内容可以参考下面链接:
https://github.com/espressif/arduino-esp32/blob/master/libraries/ESP32/examples/Time/SimpleTime/SimpleTime.ino
https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/esp32-hal-time.c
https://lastminuteengineers.com/esp32-ntp-server-date-time-tutorial/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。