11

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

但我不知道如何得到它。

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

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

4

3 回答 3

15

NTP是经过验证的远程获取时间的方法。NTP 库,如@Marcel 所表示的,正在以一定间隔与服务器建立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();
于 2016-11-11T05:59:01.077 回答
1

看看那个代码,我不认为这个微控制器直接有一个内置的时钟。由于您有 Wi-Fi,但您可以通过网络查询来获取它。

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

https://timezonedb.com/api

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

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

于 2016-11-09T20:40:14.133 回答
1

如 user2927848 所述,联系Internet 上的特定日期/时间 API 。或者向您信任的服务器发送一个简单的 HTTP 请求并读取Date响应标头。

如果您需要更高的精度,您可能需要为 Arduino 使用NTP 客户端

于 2016-11-09T21:36:08.950 回答