Задач, що пов’язані з точним орієнтуванням контролера у часі є багато. Але дозвольте нам побудувати і викласти цей матеріал на одному чи кількох простих прикладах.
Що таке високосний і невисокосний роки
Вікіпедія докладно дає визначення високосного і не високосного року, тож наведемо цитату, щоб відновити у пам’яті :
Високо́сний рік – рік у юліанському та григоріанському календарях, кількість днів у якому становить 366 – на одну добу (зимовий день) більше, ніж у звичайному (невисокосному) році. У такий рік місяць лютий має не 28, а 29 днів.
Приклади задач із застосування ознаки високосного року
Приклад 1: До кінця року залишилося стільки-то днів
Припустимо, що нам потрібно навчити наш пристрій повідомляти користувачів написом на дисплеї, що до кінця року залишилося стільки-то днів.
Також, це може бути не кількість днів до кінця року, а кількість днів до будь-якої іншої дати – до весни, до дня народження, до початку опалювального сезону, до автоматичного переходу провітрювання на літній режим. І до зарплати? – і до зарплати.
Також цілком ймовірно, що нам потрібно просто вивести на екран майбутнього розумного годинника фактичні дані типу: “високосний рік”. Чому? – бо це може бути прохання майбутніх користувачів, виявлене за результатами опитування чи фокус групи.
Приклад 2: Скільки днів пройшло з початку року
Ще одним прикладом необхідності у контролера мати ознаку чи високосний рік, можна навести більш складні ситуації, коли контролер має ретроспективно виконувати статистичну обробку накопичених даних з переходом через добу. Виникають дуже прості математичні задачі, на кшталт знаходження середнього арифметичного, але котрі потребують знати, наприклад, скільки днів пройшло з початку року, щоб відшукати середнє значення тієї чи іншої фізичної величини, тощо. Таким чином можуть проводитися розрахунки витрат ресурсів (вода, газ електроенергія) або ж отримана доза опромінення, якщо йдеться про дозиметри і багато інших задач.
І навіть якщо ми маємо підключення до інтернет і отримуємо синхронізований час через SNTP (Simple Network Time Protocol), до речі, підтримка якого є в прошивці NodeMCU. або якщо ми маємо енергонезалежний RTC-годинник (Real Time Clock) на борту і дані відміток часу для запису у журнал ми беремо з RTC, нам все одно потрібно знати, скільки днів було у лютому цьогоріч, тобто у місяці, що вже давно минув.
Примітка А. Розповсюджений RTC-годинник DS3231, візьмемо цей чіп як галузевий технологічний орієнтир, має вбудований механізм компенсації високосного року до 2100 року, але цей чіп не має комірки пам’яті, з якої ми могли б напряму отримати ознаку, чи є поточний рік високосним. Докладно дивись Maxim Integrated DS3231 Datasheet за посиланням ( Maxim Integrated DS3231 ), Figure1. Timekeeping Registers на сторінці 11.
Примітка Б. C-модулі sntp. та rtctime. надають інструменти для того, щоб окрім дати та часу отримати значення порядкового дня року. Ба більше, згадані модулі сумісні з концепцією високосного року (31 грудня є 366-м днем) і звичайного року (31 грудня є 365-м днем) і автоматично виконують компенсацію. Але ці модулі не повертають окремої ознаки, чи є поточний рік високосним. Тож, знаючи порядковий номер дня року, ми все ще не знаємо, скільки ж днів залишилося до кінця року. У перевірочному коді Lua, що наведено нижче, все виглядає просто, оскільки для перевірки ми вказали конкретний Unix Epoch Timestmap, як для високосного року так і для звичайного. В реальних умовах – умовах контролера – показані підходи не дадуть жодної корисної функціональності з точки зору перевірки чи є рік високосним, бо ми маємо лише поточний timestamp і не можемо засобами контролера згенерувати такий для 31.12.хххх з майбутнього, щоб перевірити чи рік високосний.
Перевірочний код Lua для NodeMCU:
1 2 3 4 5 6 |
> tm = rtctime.epoch2cal(1577750400) -- 2019 рік звичайний, вводимо у вбудований RTC 31/12/19. > print("Calendar RTC value: ", string.format("%03d", tm["yday"])) Calendar RTC value: 365 > tm = rtctime.epoch2cal(1609372800) -- 2020 рік є високосним, вводимо у RTC 31.12.20. > print("Calendar RTC value: ", string.format("%03d", tm["yday"])) Calendar RTC value: 366 |
Зверніть увагу, що даний код і відповідна функціональність буде працювати лише за наявності в прошивці NodeMCU C-модуля rtctime., а також, якщо ви плануєте виконувати синхронізацію часу через Інтернет, то додатково потрібно включити до прошивки C-модуль sntp.
Висновки
Всі наведені приклади різноманітних ситуацій, поєднує загальна проблема – контролер може все знати про поточні дату і час, але іноді нам потрібно точно знати:
- або, скільки днів минуло з початку року,
- або скільки днів до кінця року ще залишилося.
Розрахунок кількості днів є можливим, лише якщо ми отримаємо і врахуємо ознаку чи високосний зараз рік.
Звісно ж, існує можливість визначення високосного року шляхом математичного розрахунку. У публічному доступі в мережі Інтернет є відповідні алгоритми.
Нашою метою було навести приклади, коли це може бути потрібно і у чому є проблеми з вирішенням описаних задач. Сподіваємося, що ми досягли своєї мети і розповіли та показали вам чергові корисності. Також ми маємо готові комерційні модулі на Lua, що вирішують описані задачі – рекомендуємо ознайомитися, а якщо сподобається, придбати.
Продукти за темою
Якщо ви шукаєте готове рішення цієї задачі, пропонуємо вам переглянути наші програмні продукти. Це не дуже складні програми, які ми розробили, відлагодили і перевірили, щоб наші клієнти могли одразу їх застосовувати:
Модуль визначення чи є рік високосним чи ні – alterstrategy.com/product/isleapyear/
Модуль визначення кількості днів, що залишилася до Нового року – alterstrategy.com/product/daystillny/