Сервер Реального времени NTP на ESP32

08 ноября 2022

Всем привет! Сегодня разберем как получать реальное время через интернет.

Бывают ситуации, когда необходимо точно знать реальное время, а rtc модуля нет. В таком случае если у вашей платы есть wifi, то вы можете воспользоваться технологией ntp. Что из себя представляет ntp?

NTP расшифровывается как Network Time Protocol и представляет собой сетевой протокол для синхронизации часов между компьютерными системами. Другими словами, он используется для синхронизации часов компьютера в сети.

Давайте попробуем сделать часы на esp32 и oled дисплее:

Соберем схему:

Дисплей подключается по i2c.

Для работы с дисплеем будем использовать библиотеку GyverOLED.

А для получения реального времени: NTPClient. (Рекомендую именно эту версию, а не официальную, потому что тут есть поддержка даты.)

Напишем скетч:

#include <NTPClient.h>#include <GyverOLED.h>#include <WiFi.h>#include <WiFiUdp.h>const char *ssid     = "12"; //Название вашей сетиconst char *password = "12345678"; //Пароль сетиGyverOLED<SSH1106_128x64> oled; //Объект дисплеяWiFiUDP ntpUDP; //Объект ntpUDPNTPClient timeClient(ntpUDP);// NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000); //Так-же можно более детально настроить пул и задержку передачи.void setup(){  oled.init(); //Инициализируем дисплей  oled.setContrast(255);  oled.home();  oled.setScale(2);  oled.invertText(false);  Serial.begin(115200);  WiFi.begin(ssid, password); //Wifi  while (WiFi.status() != WL_CONNECTED) {    delay (500);    Serial.print (".");  }  timeClient.begin(); //Запускаем клиент времени  timeClient.setTimeOffset(10800); //Указываем смещение по времени от Гринвича. Москва GMT+3 => 60*60*3 = 10800}void loop() {  timeClient.update(); //Обновляем дату  oled.clear();  oled.setCursor(15, 2);  oled.print(timeClient.getFormattedTime()); //Выводим время  oled.setCursor(5, 5);  oled.print(timeClient.getFormattedDate().substring(0, 10)); //Выводим дату  oled.update();  delay(1000);}

Для получения конкретного числа (часов, минут по отдельности) есть специальные флаги:

struct tm timeinfo;  if(!getLocalTime(&timeinfo)){    Serial.println("Failed to obtain time");    return;  }Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");Serial.print("День недели: ");Serial.println(&timeinfo, "%A");Serial.print("Месяц: ");Serial.println(&timeinfo, "%B");Serial.print("День месяца: ");Serial.println(&timeinfo, "%d");Serial.print("Год: ");Serial.println(&timeinfo, "%Y");Serial.print("Час: ");Serial.println(&timeinfo, "%H");Serial.print("Час (12 часовой формат): ");Serial.println(&timeinfo, "%I");Serial.print("Минута: ");Serial.println(&timeinfo, "%M");Serial.print("Секунда: ");Serial.println(&timeinfo, "%S");

Загружаем и смотрим как это работает:

Это небольшое дополнение может отлично подойти в любой домашний проект.

На этом сегодня все, спасибо за прочтения и удачи в проектах!


Данная статья является собственностью Amperkot.ru. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.


Поделиться: