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