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

12

我想在Arduino-ESP8266中获取时间戳。

但是我不知道如何获取时间戳。

我猜我们需要从互联网上获取时间,因为ESP8266没有时钟。我们只需要在需要时间戳的时候获取一次吗?还是每次都需要获取?

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


值得一提的是:你可以在 eBay 上以不到 1 美元的价格购买到一个 RTC 模块,包括运费。http://www.ebay.com/itm/201577236297 - dandavis
4个回答

15

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
4
我加入了 #include <WiFiUdp.h>,现在正在编译。 - stallingOne
@ooo 有任何结果吗? - cagdas
所以我像你说的那样添加了 #define NTP_OFFSET 1 * 60 * 60。谢谢!(我认为您的回复也错过了 timeClient.begin(); - stallingOne
@ooo,非常感谢您的反馈。我不想分享完整的草图,但如果它让您感到困惑,我当然会进行更新。这个NTP库只有一个在其公共API中返回日期数字的函数。它返回0代表星期天,1代表星期一等等。如果您认为这足够了,可以使用timeClient的getDay()函数。 - cagdas
显示剩余6条评论

2
看这段代码,我认为这个微控制器直接没有内置时钟。但既然你有 Wi-Fi,你可以通过网络查询来获取时间。
我建议使用 REST 查询到类似这样的地方:

https://timezonedb.com/api

这段文字的意思是:使用JSON格式获取时间可以达到几秒的精度,如果您只需要这样的精度,那么这样做就可以了。通过设置时间并使用内部计时器来计算偏移量,而不是每次需要时间戳时都进行查询,可以降低带宽/提高电池寿命。但是,由于计时器长时间以后可能不准确,而且最终会翻转,所以您最终需要重新查询时间并“校正”它。如果您需要更准确的时间,则可能需要一个时钟。您可以尝试根据ping进行一些校正,但总的来说,需要多精确的时间取决于您的项目要求。

1

0

对于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)即可获得当前时间戳。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接