为了尽量减少硬件要求,我们将在不使用RTC模块的情况下制作互联网时钟。与RTC时钟相比,这更准确。ESP32 是一个 Wi-Fi 模块,可以轻松连接到互联网,因此我们将使用 NTP(网络时间协议)和 UDP(用户数据报协议)使用 Wi-Fi 从互联网上获取时间。
什么是 NTP??
网络时间协议(NTP) 是一种网络协议,用于在系统和数据网络之间同步时间。NTP 框架依赖于 Internet Time 服务器。NTP 具有精确调整一天中时间的算法。NTP 服务器具有使用 UDP端口 123 将时钟的时间发送到客户端计算机的软件。因此,在本项目中,我们将使用 ESP32 从 NTP 服务器获取时间,并将其显示在 OLED 显示屏上。
所需材料:
ESP32
128*64 OLED显示屏
面包板
公母线
威廉希尔官方网站 图:
在这里,我们使用SPI 模式将 128×64 OLED 显示模块 (SSD1306) 连接到 ESP32。因此,它将使用 7 个引脚。与 ESP32 的连接方式如下:
OLED 的 CS(片选)引脚 -ESP32 的 > 引脚 D5
OLED 的直流引脚 -ESP32 的 > 引脚 D4
OLED 的 RES 引脚 -ESP32 的 > 引脚 D2
OLED 的 SDA 引脚 -> 引脚 D23 即 ESP32 的 MOSI
OLED 的 SCK 引脚 -> 引脚 D18 即 ESP32 的 SCK
OLED 的 Vdd -ESP32 的 > Vcc
OLED 的 GND -ESP32 的 GND >
我们包含了所有库和定义的变量,用于输入Wi-Fi名称和密码。
#include
#include
#include
#include
#include
#include
const char* ssid = "*******"; //WiFi Name
const char* password = "*********"; // WiFi Password
这里NTPClient.h库用于连接时间服务器。NTP 服务器需要时间并保持同步。HhreWiFiUdp.h库用于发送和接收UDP消息。UDP 是一种从我们的系统向 NTP 服务器发送和接收短消息的协议。
因此,为了从互联网上获取时间,我们必须在程序中为 NTP 定义三个变量。
NTP_OFFSET哪个是您所在国家/地区的时区,即对于印度,它是+5:30小时。所以它是 19800 秒。
NTP_INTERVAL这是 NTP 更新时间所花费的时间间隔。它是60-64秒。
NTP_ADDRESS是您所在国家/地区的 NTP 服务器。对于印度,您可以使用“in.pool.ntp.org”。
#define NTP_OFFSET 19800 // In seconds
#define NTP_INTERVAL 60 * 1000 // In miliseconds
#define NTP_ADDRESS "1.asia.pool.ntp.org"
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);
在设置功能中,初始化 Wi-Fi 设置以连接互联网。
void setup()
{
display.begin();
Serial.begin(9600);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
timeClient.begin();
然后初始化显示函数以在OLED上显示时间。
display.begin(SSD1306_SWITCHCAPVCC);
在循环函数中,我们使用了timeClient.update(),这个函数以字符串的形式从NTP获取更新的时间,并将其存储在formattedTime变量中。然后使用 display.println() 函数在 OLED 上显示它。
void loop()
{
timeClient.update();
String formattedTime = timeClient.getFormattedTime();
display.clearDisplay();
display.setTextSize(2); // set these parameters according to your need..
display.setCursor(0, 0);
display.println(formattedTime);
全部0条评论
快来发表一下你的评论吧 !