NTP отримання точної дати та часу

NTP протокол – Network Time Protocol (Протокол Часу у Мережі). Це стандартний протокол інтернет-часу для синхронізації годинника з еталонним годинником в мережі.

Інколи в проектах потрібно викорстання часу, наприклад вмикати реле по заданому часу, або зберігання даних датчиків через заданий час. Для цього використовують RTC (real-time clock), часи реального часу, але точність цих мікросхем не дуже хороша. DS1307 має похибку 20 ~ 30 секунд на добу. Коригувати час вручну не дуже зручно, якщо є підключення до інтернету можна використати NTP протокол, і періодично оновлювати годинник у автоматичному режимі.

Для отримання точного часу по NTP будем використовувати ESP32 з підключенням до інтернету по Wi-Fi та бібліотеку NTPClient Arduino ESP32.

Для встановлення бібліотеки у PlatformIO додайте наступний рядок до файлу platformio.ini.

lib_deps = arduino-libraries/NTPClient @ ^3.1.0

Код програми

#include <NTPClient.h>
#include <WiFi.h>
const char *ssid     = "ssid";
const char *password = "password";
const int utcOffsetInSeconds = 7200;         // UTC +2  в секундах
const int updateInterval = 3600;             // Інтервал оновлення в секундах
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);
void setup()
{
Serial.begin(9600);
WiFi.begin(ssid, password);
while ( WiFi.status() != WL_CONNECTED )
{
Serial.print(".");
delay ( 500 );
}
timeClient.begin();
}
void print_time()
{
Serial.print("Day of week - ");
Serial.println(timeClient.getDay());               // День тижня
Serial.print("Hours - ");
Serial.println(timeClient.getHours());             // Години
Serial.print("Minutes - ");
Serial.println(timeClient.getMinutes());           // Хвилини
Serial.print("Seconds - ");
Serial.println(timeClient.getSeconds());           // Секунди
Serial.print("Formatted time - ");
Serial.println(timeClient.getFormattedTime());    // форматований час  hh:mm:ss
Serial.print("Unix time - ");
Serial.println(timeClient.getEpochTime());       // Секунд від 1970.01.01 00:00:00
Serial.println("");
}
void loop()
{
if (timeClient.update()){
print_time();
}
delay(5000);
}

Вивід монітору серійного порта

ntp-serial-monitor

Основні світові NTP сервери

ЗонаСервер
Загальносвітовий серврер pool.ntp.org
Європаeurope.pool.ntp.org
Азіяasia.pool.ntp.org
Північна америка north-america.pool.ntp.org
Південна америкаsouth-america.pool.ntp.org
Океаніяoceania.pool.ntp.org

ПІсля отримання точного часу можна оновити наш годинник.

Підключення RTC DS1307 та DS3231 до Arduino часи реального часу та ESP32/ESP8266

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *