我想在Arduino-ESP8266中获取时间戳。
但是我不知道如何获取时间戳。
我猜我们需要从互联网上获取时间,因为ESP8266没有时钟。我们只需要在需要时间戳的时候获取一次吗?还是每次都需要获取?
我已经通过Wi-Fi连接到互联网了。
我想在Arduino-ESP8266中获取时间戳。
但是我不知道如何获取时间戳。
我猜我们需要从互联网上获取时间,因为ESP8266没有时钟。我们只需要在需要时间戳的时候获取一次吗?还是每次都需要获取?
我已经通过Wi-Fi连接到互联网了。
NTP是远程获取时间的可靠方式。像@Marcel所说的那样,NTP库通过UDP连接到一个服务器并设置时间间隔,因此使用前不需要对服务器进行任何轮询。
下面是使用NTP库进行一小时偏移和一分钟刷新间隔的示例:
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#define NTP_OFFSET 60 * 60 // In seconds
#define NTP_INTERVAL 60 * 1000 // In miliseconds
#define NTP_ADDRESS "europe.pool.ntp.org"
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);
void setup(){
timeClient.begin();
}
void loop() {
timeClient.update();
}
要随时获取时间戳或格式化时间,请使用以下函数:
String formattedTime = timeClient.getFormattedTime();
unsigned long epcohTime = timeClient.getEpochTime();
error: 'WiFiUDP' does not name a type
。我需要另一个库吗? - stallingOne#include <WiFiUdp.h>
,现在正在编译。 - stallingOne#define NTP_OFFSET 1 * 60 * 60
。谢谢!(我认为您的回复也错过了 timeClient.begin();
) - stallingOne访问互联网上特定的日期/时间API 如用户2927848所描述。或向您信任的服务器发送简单的HTTP请求并读取Date
响应头。
如果您需要更高的精度,您可能想使用Arduino的NTP客户端。
对于ESP8266/ESP32,还有另一种解决方案。Espressif的时间实现提供了一个configTime()
方法,允许配置和使用NTP服务器(请参见Espressif的SimpleTime.ino示例)。
假设: 您已经设置并连接到WiFi网络,并加载了UTP库。
首先配置您的时区和NTP服务器,例如:
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
const char* time_zone = "CET-1CEST,M3.5.0,M10.5.0/3"; // TimeZone rule for Europe/Berlin
configTime(time_zone, ntpServer1, ntpServer2);
在获取并设置时间后,只需调用time(nullptr)
即可获得当前时间戳。