ESP32 Урок 53/55 — Создание интернет-часов на LCD | Обучающий набор SunFounder ESP32 для Интернета вещей
В этом руководстве мы создадим подключенные к Интернету LCD-часы с использованием микроконтроллера ESP32 от SunFounder. Эти часы будут автоматически синхронизироваться с текущим временем через Интернет, отображая время в 12-часовом или 24-часовом формате, а также день недели, дату и месяц. Использование протокола сетевого времени (NTP) гарантирует, что часы остаются точными без ручной настройки.
Этот проект использует встроенные возможности Wi-Fi ESP32 для получения текущего времени с NTP-сервера. Мы будем использовать жидкокристаллический дисплей (LCD) для отображения времени, которое можно форматировать в соответствии с предпочтениями пользователя. Для дальнейших разъяснений по любым шагам, пожалуйста, обратитесь к видео (на видео в 00:30).
Объяснение аппаратного обеспечения
Основными компонентами для этого проекта являются микроконтроллер ESP32, ЖК-дисплей 20x4 и источник питания. ESP32 — это мощный микроконтроллер со встроенными Wi-Fi и Bluetooth, что делает его подходящим для проектов Интернета вещей. ЖК-дисплей используется для отображения времени и даты, и его можно настроить для разных размеров экрана.
ЖК-дисплей работает по протоколу I2C, который позволяет осуществлять связь по двум проводам (SDA и SCL). Это упрощает подключение и уменьшает количество контактов, необходимых на ESP32. Подключение к NTP-серверу осуществляется с помощью возможностей Wi-Fi ESP32, что обеспечивает обновления в реальном времени.
- Убедитесь в правильном напряжении питания (5 В).
- Используйте развязывающие конденсаторы рядом с контактами питания для стабильности.
- Будьте осторожны с подключениями I2C, чтобы избежать конфликтов на шине.
- Проверьте I2C-адрес ЖК-дисплея (0x27 или 0x3F).
- Проверьте учетные данные Wi-Fi для точного подключения.
- Учитывайте переход на летнее время в вашем коде.
- Используйте правильный NTP-сервер для вашего географического местоположения.
- Всегда очищайте ЖК-дисплей перед обновлением отображения.
Инструкции по подключению

Чтобы подключить ESP32 к ЖК-дисплею, начните с подключения контактов питания. Подключите VCC ЖК-дисплея к контакту 5V на ESP32, а контакт GND ЖК-дисплея — к контакту GND на ESP32. Для связи I2C подключите контакт SDA ЖК-дисплея к GPIO 21 на ESP32, а контакт SCL — к GPIO 22. Убедитесь, что соединения надежны, чтобы избежать проблем со связью.
При настройке подключения используйте перемычки типа «папа-мама» для удобства. Если ваш ЖК-дисплей имеет другой I2C-адрес или конфигурацию контактов, соответствующим образом измените код. При необходимости обратитесь к видео (на видео в 05:30) для альтернативных вариантов подключения.
Примеры кода и пояснения
Код инициализирует ЖК-дисплей и настраивает подключение Wi-Fi для получения данных о времени с NTP-сервера. Ключевые идентификаторы, такие как ssid и password, используются для подключения к сети Wi-Fi, а ntpServer1 и ntpServer2 указывают, какие NTP-серверы использовать.
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
Этот фрагмент показывает сетевые учетные данные и адреса серверов. Убедитесь, что вы точно ввели свой SSID и пароль Wi-Fi, так как любая ошибка помешает ESP32 подключиться к Интернету.
В функции printLocalTime() текущее время форматируется для отображения. Структура tm используется для хранения информации о времени, а strftime помогает отформатировать время в читаемую строку.
void printLocalTime() {
struct tm timeinfo;
if(!getLocalTime(&timeinfo)) {
Serial.println("No time available (yet)");
return;
}
char timeHour[5];
strftime(timeHour, 5, "%H", &timeinfo);
Этот код проверяет, доступно ли локальное время, и получает час. Отформатированный час затем используется для отображения текущего времени на ЖК-дисплее. Если время еще недоступно, выводится сообщение в последовательный монитор.
Наконец, функция setup() инициализирует ЖК-дисплей и подключается к Wi-Fi. Она также настраивает параметры NTP-сервера и устанавливает обратный вызов для синхронизации времени.
void setup() {
Serial.begin(115200);
lcd.init(); // initialize the lcd
lcd.backlight(); // Turns on the LCD backlight.
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
Этот фрагмент инициализирует последовательный монитор для отладки, настраивает ЖК-дисплей и пытается подключиться к указанной сети Wi-Fi. Статус подключения будет выводиться в последовательный монитор, что позволит вам проверить соединение.
Демонстрация / Что ожидать
После успешной настройки ЖК-дисплей будет отображать текущее время, день недели и дату. Вы можете ожидать, что время будет обновляться каждые 5 секунд благодаря функции loop(). Если подключение к NTP-серверу не удастся, на последовательном мониторе появится сообщение о том, что время еще недоступно (на видео в 12:00).
Распространенные ошибки включают неправильное подключение, неверные I2C-адреса и неправильные учетные данные Wi-Fi. Убедитесь, что все соединения надежны и что NTP-сервер доступен из вашей сети.
Временные метки видео
- 00:00 Начало
- 2:10 Введение
- 5:15 Объяснение подключения
- 7:32 Объяснение кода Arduino
- 18:43 Выбор платы ESP32 и COM-порта в Arduino IDE
- 20:27 Демонстрация интернет-часов
/*
* Часовой интернет с использованием учебного набора IoT ESP32 от SunFounder
* Полное видеоинструктаж https://youtu.be/0KnuNqfiVug
* 📚⬇️ Страница загрузок и ресурсов https://robojax.com/RJT686
* Часовой интернет для ESP32
* Написано Ахмадом Шашмири 31 декабря 2023 года в 19:29
* www.Robojax.com
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// SDA->21, SCL->22
LiquidCrystal_I2C lcd(0x27,16,2); // установите адрес LCD на 0x27 для дисплея на 16 символов и 2 строки
const bool showSeconds = true; // установите на "true", чтобы показать секунды, и "false", чтобы скрыть
const bool showShortMonth = false; // Декабрь = ложь, Дек=истина
const bool show24Hours = true; // истинно, чтобы иметь 18:30 или ложно, чтобы иметь 6:30
#include <WiFi.h>
#include "time.h"
#include "sntp.h"
#include "TZ.h"
// TZ.h взят с https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;
const String months[][2] ={
"January","Jan",
"February","Feb",
"March","Mar",
"April","Apr",
"May","May",
"June","Jun",
"July","Jul",
"August","Aug",
"September","Sep",
"October","Oct",
"November","Nov",
"December","Dec"
};
void printLocalTime()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("No time available (yet)");
return;
}
// Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S 12Hours: %I:%M:%S");
// получить формат времени ЧЧ:ММ
char timeHour[5];
strftime(timeHour,5, "%H", &timeinfo);
String hourString = String(timeHour); // преобразовать timeHour в строку
char timeMinute[3];
strftime(timeMinute,3, "%M", &timeinfo);
String minuteString = String(timeMinute);
// серийный.печать(часСтрока);
if(!show24Hours)
{
if(hourString.toInt() >= 12)
{
minuteString = minuteString + "PM";
}else{
minuteString = minuteString + "AM";
}
}
char timeSeconds[3];
strftime(timeSeconds,3, "%S", &timeinfo);
char timeDayofWeek[10];
strftime(timeDayofWeek, 10 , "%A", &timeinfo);
char timeMonth[10];
strftime(timeMonth, 10 , "%B", &timeinfo);
String Month = String(timeMonth);
if(showShortMonth)
{
for(int m=0; m <12; m++)
{
if(Month == months[m][0] )
{
Month = months[m][1];
// Serial.println(месяцы[m][1]);
}
}
}
char timeDayofMonth[3];
strftime(timeDayofMonth,3 , "%d", &timeinfo);
char timeYear[5];
strftime(timeYear, 5 , "%Y", &timeinfo);
String time = String(timeHour) + ":" + minuteString ;
if(showSeconds) time = time +":" + String(timeSeconds); // добавьте секунды, если showSeconds=true
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(time);
lcd.print(" ");
lcd.print(String(timeDayofWeek));
lcd.setCursor(0, 1);
lcd.print(timeDayofMonth);
lcd.print(" ");
lcd.print(Month);
lcd.print(" ");
lcd.print(timeYear);
}
// Функция обратного вызова (вызывается при корректировке времени через NTP)
void timeavailable(struct timeval *t)
{
Serial.println("Got time adjustment from NTP!");
printLocalTime();
}
void setup()
{
Serial.begin(115200);
lcd.init(); // инициализируйте ЖК-дисплей
lcd.backlight(); // Включает подсветку ЖК-дисплея.
lcd.print("Internet Clock");
delay(3000); // вайф 3 секунды
// установить функцию обратного вызова для уведомлений
sntp_set_time_sync_notification_cb( timeavailable );
/*
* Адрес NTP-сервера может быть получен через DHCP.
*
* ПРИМЕЧАНИЕ: Этот вызов должен быть выполнен ДО того, как esp32 получит IP-адрес через DHCP, в противном случае опция SNTP 42 будет по умолчанию отклонена.
* ПРИМЕЧАНИЕ: вызов функции configTime(), если он выполнен ПОСЛЕ запуска DHCP-клиента, ПЕРЕПИШЕТ полученный адрес NTP-сервера.
*/
sntp_servermode_dhcp(1); // (optional)
/*
* Это установит настроенные NTP-серверы, и постоянный TimeZone/daylightOffset должен быть в порядке, если ваш часовой пояс не требует корректировки daylightOffset дважды в год; в таком случае корректировка времени не будет обрабатываться автоматически.
*/
// configTime(сOffset_gmt_сек, смещение_дневного_света_сек, ntpСервер1, ntpСервер2);
/*
* Более удобный способ работы с часовыми поясами с учетом смещения по времени был бы указать переменную среды с определением часового пояса, включая правила корректировки по времени суток. Список правил для вашего часового пояса можно получить по адресу https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h
*/
// configTzTime(TZ_America_Toronto, ntpServer1, ntpServer2);
configTzTime(TZ_America_Toronto, ntpServer1, ntpServer2);
// подключиться к WiFi
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
}
void loop()
{
delay(5000);
printLocalTime(); // это займет некоторое время для синхронизации времени :)
}
Common Course Links
Common Course Files
Вещи, которые могут вам понадобиться
-
АмазонкаКупите LCD1602-I2C на Amazonamzn.to
-
eBayКупить LCD1602-I2C на eBayebay.us
-
БанггудPurchase LCD1602 display from Banggoodbanggood.com
Ресурсы и ссылки
-
ВнешнийPurchase LCD1602 display from Banggoodbanggood.com
Файлы📁
Требуемый файл (.h)
-
TZ.h
TZ.h0.02 MB