Рубрики
Проекты на ESP32

Интернет часы на ESP32 и OLED дисплее с получением времени по протоколу NTP

В предыдущей статье на нашем сайте мы рассмотрели создание часов реального времени на основе модулей DS3231 и ESP32. Но можно упростить данный проект, исключив из него модуль часов реального времени. При этом точность наших часов будет даже лучше чем при использовании модуля часов реального времени. Таким образом, в данной статье мы рассмотрим создание интернет часов на модуле ESP32 и OLED дисплее, которые будут получать точное время по протоколу NTP.

Ранее на нашем сайте мы рассматривали аналогичный проект интернет часов на основе модуля ESP8266.

Протокол NTP

Протокол сетевого времени (Network Time Protocol, NTP) – это самый старый протокол, который появился в IP сетях для синхронизации времени между компьютерными сетями. Он был разработан ученым David L. Mills в университете Delaware в 1981 году. Данный протокол может быть использован для синхронизации времени различных сетей к всеобщему скоординированному времени (Coordinated Universal Time, UTC) с точностью до нескольких миллисекунд. UTC – это основной стандарт времени в современном мире, который регулирует время и дату. Протокол NTP использует UTC в качестве системного времени и обеспечивает точное синхронизированное время во всей сети Интернет.

Протокол NTP работает на основе иерархической модели клиент-сервер. На самом верхнем уровне этой модели используются системные часы известные как “stratum0”, в качестве которых могут использоваться атомные часы, радиоволны, GPS, GSM, которые получают сигналы времени от спутника. Серверы, которые получают сигналы времени от stratum0, называются “stratum1”, а серверы, которые получают сигналы времени от stratum1, называются “stratum2” и т.д. Это приводит к тому, что точность времени уменьшается при переходе вниз по уровням модели. При этом протокол NTP автоматически выбирает самый лучший из доступных серверов времени для синхронизации, что обеспечивает хорошую отказоустойчивость данного протокола.

В данном проекте мы будем получать точное время от сервера NTP с помощью модуля ESP32 и показывать его на экране OLED дисплея.

Модуль ESP32 может получать доступ к серверам NTP для считывания с них точного времени используя доступ к сети интернет. В нашем случае мы будем использовать протокол NTP в режиме клиент-сервер. NodeMCU ESP8266 будет работать в качестве клиентского устройства и соединяться с серверами NTP с помощью протокола UDP (User Datagram Protocol – протокол передачи дейтаграмм пользователя). Клиент передает пакет запроса на сервер NTP, который в ответ передает ему пакет с временной меткой, содержащий информацию о точности, временной зоне, временной метке UNIX и т.д. Затем клиент выделяет из этой совокупности информации необходимую ему дату и время и далее использует эту информацию по своему усмотрению (в нашем случае отображает на экране OLED дисплея).

Необходимые компоненты

  1. Модуль ESP32 (купить на AliExpress).
  2. 128*64 OLED дисплей с 7 контактами (купить на AliExpress).
  3. Макетная плата.
  4. Соединительные провода.

Схема проекта

Схема интернет часов на модуле ESP32 и OLED дисплее представлена на следующем рисунке.

В нашем проекте мы будем использовать интерфейс SPI для подключения 128×64 OLED дисплея (SSD1306) к модулю ESP32. Между OLED дисплеем и модулем ESP32 необходимо сделать следующие соединения в схеме:

  1. CS (Chip select) pin of OLED -> PIN D5 модуля ESP32.
  2. DC pin of OLED -> PIN D4 модуля ESP32.
  3. RES pin of OLED -> PIN D2 модуля ESP32.
  4. SDA pin of OLED -> PIN D23 (MOSI) модуля ESP32.
  5. SCK pin of OLED -> PIN D18 (SCK) модуля ESP32.
  6. Vdd of OLED -> Vcc модуля ESP32.
  7. GND of OLED -> GND модуля ESP32.

Объяснение программы для модуля ESP32

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Для загрузки кода программы в модуль ESP32 необходимо подготовить Arduino IDE для работы с данным модулем, этот процесс описан в статье про начало работы с модулем ESP32.

Для написания кода программы нам понадобится ряд библиотек, которые можно скачать по следующим ссылкам:

  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/Arduino/tree/master/libraries/ESP8266WiFi.

Далее подключим эти библиотеки в программе, а также укажем параметры для доступа к сети WiFi – ее имя и пароль для доступа к ней.

Библиотека NTPClient.h будет использоваться для соединения с сервером NTP и поддержания с ним синхронизации. Библиотека WiFiUdp.h будет использоваться для передачи и приема сообщений протокола UDP (User Datagram Protocol – протокол пользовательских дейтаграмм) – они используются для обмена данными с NTP сервером.

Для получения времени с серверов NTP в нашей программе мы будем использовать три переменные:

  • NTP_OFFSET – временная зона вашей страны. К примеру, для Индии она равна +5:30 часов, что равно 19800 секундам;
  • NTP_INTERVAL – интервал, необходимый протоколу NTP для обновления времени;
  • NTP_ADDRESS – NTP сервер вашей страны. К примеру, для Индии можно использовать сервер “in.pool.ntp.org”.

В функции setup мы инициализируем Wi-Fi соединение для доступа к сети Интернет.

Затем инициализируем OLED дисплей.

В функции loop мы будем использовать функцию timeClient.update(), которая будет считывать время с NTP сервера в форме строки и сохранять ее в переменной formattedTime. Затем мы будем отображать это время на экране OLED дисплея с помощью функции display.println().

Исходный код программы (скетча)

Видео, демонстрирующее работу проекта

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *