风筝
发表于: 2021-9-8 17:12:34 | 显示全部楼层

在之前的帖子中,我们使用DS3231和ESP32制作了一款RTC时钟。为了尽量减少硬件需求,我们将不使用RTC模块来制作一款互联网时钟。与RTC时钟相比,时间更准确。 ESP32是一个Wi-Fi模块,可以轻松连接到互联网,因此我们使用NTP(网络时间协议)和UDP(用户数据报协议)通过Wi-Fi从互联网获取时间。这个互联网时钟在制作物联网项目时非常有用。

Internet-Clock-using-ESP32-and-OLED-Display.jpg


什么是NTP?

NTP,Network Time Protocol (网络时间协议)是一种网络协议,用于系统和数据网络之间的时间同步。 NTP框架依赖于Internet时间服务器。 NTP具有精确调整时间的算法。 NTP服务器可以通过UDP端口号123将时钟发送到客户端计算机的软件。所以在本文中,我们使用ESP32从NTP服务器获取时间,然后将其显示在OLED显示屏上。

Communication-between-UDP-and-NTP-server.jpg


所需的组件

●    ESP32开发板

●    OLED显示屏

●    面包板


连接电路图

以下是ESP32和OLED显示屏制作的互联网时钟的原理图:

Circuit-diagram-for-Internet-Clock-using-ESP32-and-OLED-Display.jpg

我们使用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名称和密码变量。

  1. #include <WiFi.h>
  2. #include <SPI.h>
  3. #include <Adafruit_GFX.h>
  4. #include <Adafruit_SSD1306.h>
  5. #include <NTPClient.h>
  6. #include <WiFiUdp.h>

  7. const char* ssid     = "*******";                          //WiFi Name
  8. const char* password = "*********";                   // WiFi Password
复制代码

这里NTPClient.h库用于连接时间服务器。它需要来自NTP服务器的时间并保持同步。而WiFiUdp.h库用于发送和接收UDP消息。 UDP是一种从我们的系统向NTP服务器发送和接收短消息的协议。


因此,为了从互联网获取时间,我们需要在NTP程序中定义三个变量。

●    NTP_OFFSET:所在国家/地区的时区。

●    NTP_INTERVAL:更新时间所用的时间间隔。可以是60-64秒。

●    NTP_ADDRESS :所在国家/地区的NTP服务器。

  1. #define NTP_OFFSET  19800 // In seconds
  2. #define NTP_INTERVAL 60 * 1000    // In miliseconds
  3. #define NTP_ADDRESS  "1.asia.pool.ntp.org"

  4. WiFiUDP ntpUDP;
  5. NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);
复制代码

void setup()函数中,初始化Wi-Fi设置连接互联网。

  1. void setup()
  2. {
  3. display.begin();
  4. Serial.begin(9600);
  5. Serial.println();
  6. Serial.println();
  7. Serial.print("Connecting to ");
  8. Serial.println(ssid);
  9. WiFi.begin(ssid, password);
  10. while (WiFi.status() != WL_CONNECTED)
  11. {
  12. delay(500);
  13. Serial.print(".");
  14. }
  15. Serial.println("");
  16. Serial.println("WiFi connected.");
  17. Serial.println("IP address: ");
  18. Serial.println(WiFi.localIP());
  19. timeClient.begin();
复制代码

然后初始化显示功能以便在OLED屏显示时间。

  1. display.begin(SSD1306_SWITCHCAPVCC);
复制代码

loop()函数中,我们使用了timeClient.update(),该函数以字符串的形式从NT 获取更新时间,然后将其存储在formattedTime变量中。 最后使用display.println()函数将其显示在OLED上。

  1. void loop()
  2. {
  3. timeClient.update();
  4. String formattedTime = timeClient.getFormattedTime();
  5. display.clearDisplay();
  6. display.setTextSize(2);                         // set these parameters according to your need..
  7. display.setCursor(0, 0);
  8. display.println(formattedTime);
复制代码

以上就是本文的全部内容。如果有任何疑问,请随时在本帖下面回复。


跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 54 | 回复: 107



手机版|

GMT+8, 2024-3-28 21:50 , Processed in 0.164937 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表