Библиотека для получения точного времени с NTP сервера для esp8266/esp32
- Работает на стандартной библиотеке WiFiUdp.h
- Учёт времени ответа сервера и задержки соединения
- Получение времени с точностью до нескольких миллисекунд
- Получение UNIX-времени, а также миллисекунд, секунд, минут, часов, дня, месяца, года и дня недели
- Синхронизация по таймеру
- Обработка ошибок
- Асинхронный режим
esp8266, esp32
- Библиотеку можно найти по названию GyverNTP и установить через менеджер библиотек в:
- Arduino IDE
- Arduino IDE v2
- PlatformIO
- Скачать библиотеку .zip архивом для ручной установки:
- Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
- Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
- Распаковать и положить в Документы/Arduino/libraries/
- (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
- Читай более подробную инструкцию по установке библиотек здесь
- Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
- Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить"
- Вручную: удалить папку со старой версией, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!
GyverNTP ntp; // параметры по умолчанию (gmt 0, период 3600 секунд (1 час))
GyverNTP ntp(gmt); // часовой пояс в часах (например Москва 3)
GyverNTP ntp(gmt, period); // часовой пояс в часах и период обновления в секундах
bool begin(); // запустить
void end(); // остановить
void setGMTminute(int16_t gmt); // установить часовой пояс в минутах
void setGMT(int8_t gmt); // установить часовой пояс в часах
void setPeriod(uint16_t prd); // установить период обновления в секундах
void setHost(char* host); // установить хост (по умолч. "pool.ntp.org")
void asyncMode(bool f); // асинхронный режим (по умолч. включен, true)
void ignorePing(bool f); // не учитывать пинг соединения (умолч. false)
uint8_t tick(); // тикер, обновляет время по своему таймеру. Вернёт true если произошла попытка обновления
uint8_t updateNow(); // вручную запросить и обновить время с сервера. Вернёт статус (см. ниже)
uint32_t unix(); // unix время
uint16_t ms(); // миллисекунды текущей секунды
uint8_t second(); // получить секунды
uint8_t minute(); // получить минуты
uint8_t hour(); // получить часы
uint8_t day(); // получить день месяца
uint8_t month(); // получить месяц
uint16_t year(); // получить год
uint8_t dayWeek(); // получить день недели (пн.. вс = 1.. 7)
String timeString(); // получить строку времени формата ЧЧ:ММ:СС
String dateString(); // получить строку даты формата ДД.ММ.ГГГГ
bool synced(); // получить статус текущего времени, true - синхронизировано
bool busy(); // вернёт true, если tick ожидает ответа сервера в асинхронном режиме
int16_t ping(); // получить пинг сервера
uint8_t status(); // получить статус системы
// 0 - всё ок
// 1 - не запущен UDP
// 2 - не подключен WiFi
// 3 - ошибка подключения к серверу
// 4 - ошибка отправки пакета
// 5 - таймаут ответа сервера
// 6 - получен некорректный ответ сервера
- Нужно вызывать
tick()
в главном цикле программыloop()
, он синхронизирует время по своему таймеру - Если основной цикл программы сильно загружен, а время нужно получать с максимальной точностью (несколько мс), то можно выключить асинхронный режим
asyncMode(false)
- Библиотека продолжает считать время даже после пропадания синхронизации
- По моим тестам esp "уходит" на ~1.7 секунды за сутки (без синхронизации). Поэтому стандартный период синхронизации выбран 1 час
// пример выводит время каждую секунду
// а также два раза в секунду мигает светодиодом
// можно прошить на несколько плат - они будут мигать синхронно
#include <ESP8266WiFi.h> // esp8266
//#include <WiFi.h> // esp32
#include <GyverNTP.h>
GyverNTP ntp(3);
// список серверов, если "pool.ntp.org" не работает
//"ntp1.stratum2.ru"
//"ntp2.stratum2.ru"
//"ntp.msk-ix.ru"
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
WiFi.begin("WIFI_SSID", "WIFI_PASS");
while (WiFi.status() != WL_CONNECTED) delay(100);
Serial.println("Connected");
ntp.begin();
//ntp.asyncMode(false); // выключить асинхронный режим
//ntp.ignorePing(true); // не учитывать пинг до сервера
}
void loop() {
ntp.tick();
if (ntp.ms() == 0) {
delay(1);
digitalWrite(LED_BUILTIN, 1);
}
if (ntp.ms() == 500) {
delay(1);
digitalWrite(LED_BUILTIN, 0);
Serial.println(ntp.timeString());
Serial.println(ntp.dateString());
Serial.println();
}
}
- v1.0
- v1.1 - мелкие улучшения и gmt в минутах
- v1.2 - оптимизация, улучшена стабильность, добавлен асинхронный режим
- v1.2.1 - изменён стандартный период обновления
- v1.3 - ускорена синхронизация при запуске в асинхронном режиме
- v1.3.1 - заинклудил WiFi библиотеку в файл
При нахождении багов создавайте Issue, а лучше сразу пишите на почту alex@alexgyver.ru
Библиотека открыта для доработки и ваших Pull Request'ов!
При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:
- Версия библиотеки
- Какой используется МК
- Версия SDK (для ESP)
- Версия Arduino IDE
- Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
- Какой код загружался, какая работа от него ожидалась и как он работает в реальности
- В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код