基于基于esp32的联网获取时间-Arduino中文社区 - Powered by Discuz! Archiver

明流月 发表于 2020-1-5 22:30

基于基于esp32的联网获取时间

突然突发奇想想做一个基于esp32的小作品,可以联网获取时间的。
首先,在这里感谢“单片机菜鸟”博哥的代码支持。https://blog.csdn.net/dpjcn1990/article/details/92830098
#include <ESP8266WiFi.h>//想要在ESP32模块上使用,只需要把头文件更改为<WiFi.h>

void smartConfig()
{
WiFi.mode(WIFI_STA);
Serial.println("\r\nWait for Smartconfig");
delay(2000);// 等待配网
WiFi.beginSmartConfig();

while (1)
{
    Serial.print(".");
    delay(500);
    if (WiFi.smartConfigDone())
    {
      Serial.println("SmartConfig Success");
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
      Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      WiFi.setAutoConnect(true);// 设置自动连接
      break;
    }
}

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

void setup()
{
Serial.begin(115200);
smartConfig();
}

void loop()
{
delay(100);
Serial.println("loop");
}

这里就是博哥的源代码,写的也是够详细的。这里就是博哥的一键配网的源代码。已经附上博哥CSDN博客地址。
在这里说明一点,这个代码在更改头文件后,可以在ESP8266和ESP32中随意切换使用。

下面联网获取时间的代码部分
#include <WiFi.h>//想要在ESP8266模块上使用,只需要把头文件更改为<ESP8266WiFi.h>
#include "time.h"

const char* ssid       = "YOUR_SSID";
const char* password   = "YOUR_PASS";

const char* ntpServer = "pool.ntp.org";
const longgmtOffset_sec = 3600;//这里采用UTC计时,中国为东八区,就是 8*60*60
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();
}

这个代码位于esp32开发板自带的示例中。pool.ntp.org为获取时间得接口,可以尝试更多得接口。比如微软的time.windows.com,美国国家标准与技术研究院的time.nist.gov(笔者未曾尝试是否可行)
由于代码使用的UTC计时方式,换算成中国的东八区,就是 8*60*60


最后附上修改,合并的代码
#include <WiFi.h>//想要在ESP32模块上使用,只需要把头文件更改为<WiFi.h>
#include <time.h>

const char* ntpServer = "pool.ntp.org";
const longgmtOffset_sec = 28800;
const int   daylightOffset_sec = 28800;

void smartConfig()
{
WiFi.mode(WIFI_STA);
Serial.println("\r\nWait for Smartconfig");
delay(2000);// 等待配网
WiFi.beginSmartConfig();

while (1)
{
    Serial.print(".");
    delay(500);
    if (WiFi.smartConfigDone())
    {
      Serial.println("SmartConfig Success");
      Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
      Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
      WiFi.setAutoConnect(true);// 设置自动连接
      break;
    }
}

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}


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);
    smartConfig();
}

{
    while (WiFi.status() != WL_CONNECTED)
   {
      delay(500);
      Serial.print(".");
}

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
}
}
void loop()
{
delay(1000);
printLocalTime();
}



代码简单易懂,待我继续研究后,添加一个oled屏。

单片机菜鸟 发表于 2020-1-6 09:53

大佬牛逼哈哈哈哈

莫知 发表于 2020-6-7 18:02

你好请问#include <time.h>,和getLocalTime(&timeinfo)是哪个库里的,我操作的时候显示getLocalTime()是没有定义的

vickerjacker 发表于 2020-8-2 16:17

莫知 发表于 2020-6-7 18:02
你好请问#include ,和getLocalTime(&timeinfo)是哪个库里的,我操作的时候显示getLocalTime()是没有定义 ...

esp32示例自带的

cdjinge 发表于 2021-2-2 20:52

你好,我是一名esp32开发新手,最近两天才接触esp32,想在ttgo上显示时间,如果你愿意的话,我们可以一起讨论嘛

cdjinge 发表于 2021-2-2 20:53

你好,我是一名esp32开发新手,最近两天才接触esp32,想在ttgo上显示时间,如果你愿意的话,我们可以一起讨论嘛
页: [1]
查看完整版本: 基于基于esp32的联网获取时间