|
在之前的帖子中,我们使用DS3231和ESP32制作了一款RTC时钟。为了尽量减少硬件需求,我们将不使用RTC模块来制作一款互联网时钟。与RTC时钟相比,时间更准确。 ESP32是一个Wi-Fi模块,可以轻松连接到互联网,因此我们使用NTP(网络时间协议)和UDP(用户数据报协议)通过Wi-Fi从互联网获取时间。这个互联网时钟在制作物联网项目时非常有用。
什么是NTP? NTP,Network Time Protocol (网络时间协议)是一种网络协议,用于系统和数据网络之间的时间同步。 NTP框架依赖于Internet时间服务器。 NTP具有精确调整时间的算法。 NTP服务器可以通过UDP端口号123将时钟发送到客户端计算机的软件。所以在本文中,我们使用ESP32从NTP服务器获取时间,然后将其显示在OLED显示屏上。
所需的组件 ● ESP32开发板 ● OLED显示屏 ● 面包板
连接电路图 以下是ESP32和OLED显示屏制作的互联网时钟的原理图:
我们使用SPI模式将OLED显示屏模块 (SSD1306) 连接到ESP32。该显示屏使用7个引脚。
代码说明 我们需要在代码中使用几个库,可以从以下链接下载: 1. Adafruit_SSD1306:https://github.com/adafruit/Adafruit_SSD1306 2. SPI:https://github.com/PaulStoffregen/SPI 3. Adafruit_GFX:https://github.com/adafruit/Adafruit-GFX-Library 4. NTPClient:https://github.com/arduino-libraries/NTPClient 5. WiFiUdp:https://github.com/esp8266/Ardui ... braries/ESP8266WiFi
首先在代码中包含库的头文件,然后定义Wi-Fi名称和密码变量。 - #include <WiFi.h>
- #include <SPI.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #include <NTPClient.h>
- #include <WiFiUdp.h>
- const char* ssid = "*******"; //WiFi Name
- const char* password = "*********"; // WiFi Password
复制代码这里NTPClient.h库用于连接时间服务器。它需要来自NTP服务器的时间并保持同步。而WiFiUdp.h库用于发送和接收UDP消息。 UDP是一种从我们的系统向NTP服务器发送和接收短消息的协议。
因此,为了从互联网获取时间,我们需要在NTP程序中定义三个变量。 ● NTP_OFFSET:所在国家/地区的时区。 ● NTP_INTERVAL:更新时间所用的时间间隔。可以是60-64秒。 ● NTP_ADDRESS :所在国家/地区的NTP服务器。 - #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);
复制代码
在void setup()函数中,初始化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);
复制代码
在loop()函数中,我们使用了timeClient.update(),该函数以字符串的形式从NT 获取更新时间,然后将其存储在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);
复制代码
以上就是本文的全部内容。如果有任何疑问,请随时在本帖下面回复。
|