突然突发奇想想做一个基于esp32的小作品,可以联网获取时间的。
首先,在这里感谢“单片机菜鸟”博哥的代码支持。https://blog.csdn.net/dpjcn1990/article/details/92830098
[mw_shl_code=arduino,true]#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");
}[/mw_shl_code]
这里就是博哥的源代码,写的也是够详细的。这里就是博哥的一键配网的源代码。已经附上博哥CSDN博客地址。
在这里说明一点,这个代码在更改头文件后,可以在ESP8266和ESP32中随意切换使用。
下面联网获取时间的代码部分
[mw_shl_code=arduino,true]#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 long gmtOffset_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();
}[/mw_shl_code]
这个代码位于esp32开发板自带的示例中。pool.ntp.org为获取时间得接口,可以尝试更多得接口。比如微软的time.windows.com,美国国家标准与技术研究院的time.nist.gov(笔者未曾尝试是否可行)
由于代码使用的UTC计时方式,换算成中国的东八区,就是 8*60*60
最后附上修改,合并的代码
[mw_shl_code=arduino,true]#include <WiFi.h>//想要在ESP32模块上使用,只需要把头文件更改为<WiFi.h>
#include <time.h>
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_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();
}[/mw_shl_code]
代码简单易懂,待我继续研究后,添加一个oled屏。
|