Сервер Реального времени 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; //Объект ntp
UDPNTPClient 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);
}

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

if(!getLocalTime(&timeinfo)){   
  Serial.println("Failed to obtain time");
}
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. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.


Поделиться: