Код для поиска

ESP32 Урок 53/55 — Создание интернет-часов на LCD | Обучающий набор SunFounder ESP32 для Интернета вещей

ESP32 Урок 53/55 — Создание интернет-часов на LCD | Обучающий набор SunFounder ESP32 для Интернета вещей

В этом руководстве мы создадим подключенные к Интернету LCD-часы с использованием микроконтроллера ESP32 от SunFounder. Эти часы будут автоматически синхронизироваться с текущим временем через Интернет, отображая время в 12-часовом или 24-часовом формате, а также день недели, дату и месяц. Использование протокола сетевого времени (NTP) гарантирует, что часы остаются точными без ручной настройки.

esp32-53-internet-clock-main

Этот проект использует встроенные возможности 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-11_LCD-wiring

Чтобы подключить 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 Демонстрация интернет-часов

Изображения

ESP32-11_LCD-wiring
ESP32-11_LCD-wiring
ESP32-11_LCD-wiring-schematic
ESP32-11_LCD-wiring-schematic
esp32-53-internet-clock-main
esp32-53-internet-clock-main
854-ESP32 Tutorial 53/55- Internet Clock
Язык: C++
/*
 * Часовой интернет с использованием учебного набора 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(); // это займет некоторое время для синхронизации времени :)
}

Вещи, которые могут вам понадобиться

Ресурсы и ссылки

Файлы📁

Требуемый файл (.h)