如何在 Arduino-ESP8266 中获取时间戳?

How do you get a timestamp in Arduino-ESP8266?

我想获得 Arduino-ESP8266 的时间戳。

但我不知道如何获得它。

我想我们必须从互联网上获取时间,因为 ESP8266 没有任何时钟。我们是只需要这样做一次还是每次需要时间戳时都这样做?

我已经通过 Wi-Fi 连接到互联网。

查看该代码,我认为该微控制器并没有像提到的那样直接内置时钟。由于您有 Wi-Fi,但您可以通过网络查询来获取它。

我会使用 REST 查询到这样的地方:

https://timezonedb.com/api

这会给你一个 JSON 格式化的时间。如果您只需要精度 +/- 几秒钟就可以了。您可以通过这样设置时间来降低带宽/延长电池寿命,然后使用内部计时器计算偏移量,而不是每次需要时间戳时都进行查询。最终你需要重新查询时间 'correct' 因为你的计时器可能在很长一段时间内都不准确,而且它最终可能会翻转。

如果您需要更准确的时间,那么您可能需要一个时钟。您可以尝试根据 ping 进行一些校正,但总的来说,它需要多准确取决于您的项目要求。

联系互联网上的特定 date/time API as described by user2927848. Or send a simple HTTP request to a server you trust and read the Date 回复 header。

如果您需要更高的精度,您可能需要使用 NTP client for Arduino

NTP is the proven way of getting time remotely. NTP libraries, like @Marcel denotes, is making 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();