1 год назад
История
README.md
MOD_GyverNTP
Форк библиотеки для получения точного времени с 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(gmt); // часовой пояс в часах (например Москва 3)
GyverNTP(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(); // получить день недели
String timeString(); // получить строку времени формата ЧЧ:ММ:СС
String dateString(); // получить строку даты формата ДД.ММ.ГГГГ
String getFullFormLastUpdate(); // получить строку последней успешной синхронизации в формате "ДД-ММ-ГГ ЧЧ:ММ:СС"
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();
}
}
Версии
- v0.1 - Добавлена функция последней успешной синхронизации в формате “ДД-ММ-ГГ ЧЧ:ММ:СС”.
Автор Форка: Otto Дата создания: 20.03.2023
MIT License
Описание
Форк библиотеки для получения точного времени с NTP сервера для esp8266/esp32
Конвейеры
0 успешных
0 с ошибкой