#include <WiFi.h>
#include "time.h"
const char* ssid = "xxx";
const char* password = "xxxxxxxx";
const char* ntpServer = "us.pool.ntp.org";
const long gmtOffset_sec = 3600*7;
const int daylightOffset_sec = 3600;
void printLocalTime()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}
void setup()
{
Serial.begin(115200);
//connect to WiFi
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
//init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
//disconnect WiFi as it's no longer needed
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
}
void loop()
{
delay(1000);
printLocalTime();
}
使用NTP服务,核心是通过WIFI访问NTP服务器。
NTP服务器在全球有多个节点,当访问这些网址节点时,则返回最近节点的精确时间,在linux和windows系统中广泛使用。
用ESP32来访问这些节点,需要使用configTime来对时间进行设置,其中GMT是指时区,daylightoffset是指夏令时,因为中国在东八区,所以跟日期变更线差7个时区,只需要在GMT中设置3600*7即可,这样打印出来的时间即是东八区时间。
用这个功能即可做数字wifi时钟,成本可以很低。