
Всем привет! Сегодня разберем как получать реальное время через интернет.
Бывают ситуации, когда необходимо точно знать реальное время, а 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. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.
Комментарии