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 с ошибкой