NTPtime
NTPtime, UNIXtime and TimeFunc give you full control and more manipulation with time.
Install / Use
/learn @DenysChuhlib/NTPtimeREADME
NTPtime
Бібліотека часу з багатьма функціями:
- Отримання точного часу за допомогою NTP сервера і використання
- Використання UNIX часу і його декодування
- Можливість використання UNIX64 для більш ширших розрахунків (можна і від'ємний час обробляти)
- Альтернатива стандартній бібліотеці
Time.hв оптимізації і простоті використання - Можливість робити таймер у рівний час, наприклад рівно о 12:00 і так щогодини, який займає лише один байт
- Безліч інших зручних функцій
Сумісність усієї бібліотеки
Будь-які ардуіно сумісні плати
Сумісність синхронізації NTP
esp8266, esp32, Ethernet
Зміст
<a id="install"></a>
Установка
- Бібліотеку можна знайти за назвою
NTPtimeта встановити через менеджер бібліотек у:- Arduino IDE v2.0
(рекомендовано) - Arduino IDE
- Arduino IDE v2.0
- Завантажити бібліотеку .zip архівом для ручної установки:
- Розпакувати та покласти в
Документи/Arduino/libraries/ - (Arduino IDE) автоматичне встановлення з .zip:
Скетч/Підключити бібліотеку/Додати .ZIP бібліотеку…та вказати завантажений архів
- Розпакувати та покласти в
<a id="usage"></a>
Використання і особливості
Режим UNIX64 (v1.2)
Для ввімкнення режиму необхідно, перед підлкюченням любої частини бібліотеки (NTPTime.h/UNIXtime.h/TimeFunc.h), написати #define UNIX64.
PS: Якщо ядро вашої плати, а точніше бібліотека String.h не підтримує числа 64 біт, то буде помилка комбіляції. Можливо, в майб'тньому зроблю універсальніше =).
Типи данних (v1.2)
unix_t- тип для Unix часу. В звичайном режимі цеuint32_t/ якщо ввімкненийUNIX64тоint64_tyear_t- тип для року. В звичайном режимі цеuint16_t/ якщо ввімкненийUNIX64тоint64_tDSTime- структира для зберігання данних які використовуються в обчисленні DST.
<a id="features"></a>
Особливості
NTPTime
tick(),DST(),DSTauto(),updateOnTime()працюють головному в цикліloop().- Чим більше потрібна точність часу тим меньше потрібен період в
tick(prd). Якщо простий годинник, достатньо одного updateOnTime(0,0,10) і обновляти в нічий час, коли найкращий Інтернет.
UNIXtime
DST(),DSTauto()- працюють головному в цикліloop().- Мілісекунди зберігаються при зупинці відліку часу і відновлюються при запуску.
Для кращого розуміння, дивіться приклади testBlink.ino,Watch.ino,Timer.ino,Timer_with_Time.ino, RTC.ino та інші.
<a id="DSTime"></a>
DSTime
//Ініціалізація
DSTime();
DSTime(uint8_t month_start_, uint8_t week_start_, uint8_t dayWeek_start_, uint8_t h_start_,
uint8_t month_end_, uint8_t week_end_, uint8_t dayWeek_end_, uint8_t h_end_, int8_t mode_ = 1);
// для зміни всих значень
void setDST(uint8_t month_start_, uint8_t week_start_, uint8_t dayWeek_start_, uint8_t h_start_,
uint8_t month_end_, uint8_t week_end_, uint8_t dayWeek_end_, uint8_t h_end_, int8_t mode_ = 1);
//можна змінювати одне значення
//елементи з бітовими полями для ефективного зберігання в EEPROM. (займають лише 4 байта)
uint8_t month_start : 4;
uint8_t week_start : 3;
uint8_t dayWeek_start : 3;
uint8_t h_start : 5;
uint8_t month_end : 4;
uint8_t week_end : 3;
uint8_t dayWeek_end : 3;
uint8_t h_end : 5;
// DST_WT -1 //Winter time
// DST_OFF 0 //None
// DST_ON 1 //DST
int8_t mode : 2;
<a id="NTPtime"></a>
NTPtime
//Ініціалізація
NTPtime Time; // параметри за замовчуванням (time zone 0, time zone minune)
NTPtime(time_zona, time_zonaM); // часовий пояс у годинах і хвилинах
void setHost(const String& host); // установити хост (за умовч. pool.ntp.org)
void setPort(uint16_t port); // установити порт NTP сервера (за умовч. 123)
void setTimeout(uint16_t timeout); // установити таймаут відповіді сервера (200 - 64000) (за умовч. 64000)
bool begin(uint16_t port); // запустити (вхідний порт за умовч. 123)
void end(); // зупинити
void asyncMode(bool _on_off); // асинхронний режим (за умовч. ввімкнений, true)
void updateNow(); // обновити зараз (ручний запуск оновлення)
bool updateOnTime(uint8_t h, uint8_t m, uint8_t s); // функція `loop()` цикла яка оновлює час в Г, Х, С (працює в парі з tick())
// функція `loop()` цикла яка оновлює час по періоду (1 хв <= prd <= 1 доба), після ручного запуска або в певний час, підчас оновлення повертає true
bool tick(uint16_t prd);
int16_t ping(); // отримати пінг сервера (при відсутньому з'єднанні повертає -1)
// отримати статус оновлення
/*
NTP_OK 0 - все ок
NTP_NOT_STARTED 1 - не запущений UDP
NTP_NOT_CONNECTED_WIFI 2 - не підключений WiFi
NTP_NOT_CONNECTED_TO_SERVER 3 - помилка підключення до сервера
NTP_NOT_SENT_PACKET 4 - помилка отправки пакета
NTP_WAITING_REPLY 5 - іде очікування відповіді
NTP_TIMEOUT 6 - таймаут відповіді сервера
NTP_REPLY_ERROR 7 - отримана некоректна відповідь сервера
*/
uint8_t NTPstatus();
<a id="UNIXtime&NTPtime"></a>
UNIXtime і NTPtime
В основі NTPtime лежить UNIXtime і він має такі функції:
//Ініціалізація
UNIXtime Timer; // таймер (запустити Timer.startTime();)
//unix час, часовий пояс, хвилини часового поясу, міліскекунди
UNIXtime(unix_t unix, int8_t tz, int8_t tzM, uint16_t ms);
// рік, місяць, день, години, хвилини, секунди, часовий пояс у хвилинах, мілісекунди
UNIXtime(year_t y, uint8_t m, uint8_t d, uint8_t h, uint8_t mn, uint8_t s, int16_t tzM, uint16_t ms);
void setUnixGMT(unix_t unix, uint16_t ms); // встановити unix час відносно грінвіча
void setUnixGMTFromDate(year_t y, uint8_t m, uint8_t d, uint8_t h, uint8_t mn, uint8_t s, int16_t tzM = 0, uint16_t ms = 0);
void addUnix(unix_t unix, uint16_t ms = 0);
void subtractUnix(unix_t unix, uint16_t ms = 0);
void setTimeZone(int8_t tz, int8_t tzM); // установити часовий пояс
int16_t getTimeZoneM(); // дізнатись часовий пояс в хвилинах
void setDST (int8_t dst_wt); // установити літній час 1 (за умовчуванням) та зимовий час -1 або стандартний час 0
void setSummerTime(); // установити літній час
void setWinterTime(); // установити зимовий час
void setStandardTime(); // установити стандартний час
int8_t getDST(); // поверне якщо літній час 1 (DST_ON) та зимовий час -1 (DST_WT) або стандартний час 0 (DST_OFF)
void setDSTauto(DSTime * dst); // передача адреси структури DSTime для втановки автоматичного перерахунки і перевірки DST
DSTime *getDSTauto(); // поверне покажчик збереженого DSTime
void delDSTauto(); // очистити покажчик на елемент стрктури DSTime
bool DSTauto(); // функція ручного однократного запуска перерахунку DST за данними `всановленої` структури DSTime
bool DST (DSTime & dst); // функція ручного однократного запуска перерахунку DST за данними `даної` структури DSTime
// функція ручного однократного запуска перерахунку DST за данними значеннями
void DST(uint8_t month_start, uint8_t week_start, uint8_t dayWeek_start, uint8_t h_start,
uint8_t month_end, uint8_t week_end, uint8_t dayWeek_end, uint8_t h_end, bool dst_or_wt);
//month_start - місяць початку літнього/зимнього часу
//week_start - тиждень початку літнього/зимнього часу (якщо 0 то останній тиждень)
//dayWeek_start - день тижня початку літнього/зимнього часу
//h_start - година початку літнього/зимнього часу
//month_end - місяць кінця літнього/зимнього часу
//week_end - тиждень кінця літнього/зимнього часу (якщо 0 то останній тиждень)
//dayWeek_end - день тижня кінця літнього/зимнього часу
//h_end - година кінця літнього/зимнього часу
//dst_or_wt за умовчування 1 - літній час, якщо 0 то зимній
//DST(3, 0, 7, 3, 10, 0, 7, 4); //https://en.wikipedia.org/wiki/Eastern_European_Summer_Time
unix_t DSTstartInGMT (uint8_t month_start, uint8_t week_start, uint8_t dayWeek_start, uint8_t h_start);
unix_t DSTendInGMT (uint8_t month_end, uint8_t week_end, uint8_t dayWeek_end, uint8_t h_end, bool dst_or_wt = 1);
// отримати статус системи
/*
UNIX_OK 0 - все ок
UNIX_NOT_SYNCHRONIZED 1 - не синхронізовано
UNIX_NOT_STARTED 2 - зупинено
*/
bool status();
bool isRunning();
void startTime(); // почати відлік часу
void stopTime(); // зупунити відлік часу
uint32_t msFromUpdate(); // мілісекунд з останнього оновлення
unix_t uni
