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