Добавлен переход на летнее/зимнее время; Добавлен эффект Белый огонь; Исправлены ошибки

This commit is contained in:
gunner47
2019-11-02 19:30:10 +02:00
parent 08d5d6022a
commit 0413e435db
24 changed files with 1917 additions and 67 deletions

View File

@@ -17,7 +17,7 @@ uint8_t espMode = ESP_MODE; // ESP_MODE може
#define ESP_UDP_PORT (8888U) // номер порта, который будет "слушать" UDP сервер во время работы лампы как в режиме WiFi точки доступа, так и в режиме WiFi клиента (лучше не менять)
#define ESP_CONN_TIMEOUT (7U) // время в секундах (ДОЛЖНО БЫТЬ МЕНЬШЕ 8, иначе сработает WDT), которое ESP будет пытаться подключиться к WiFi сети, после его истечения автоматически развернёт WiFi точку доступа
#define ESP_CONF_TIMEOUT (300U) // время в секундах, которое ESP будет ждать ввода SSID и пароля WiFi сети роутера в конфигурационном режиме, после его истечения ESP перезагружается
#define GENERAL_DEBUG // если строка не закомментирована, будут выводиться отладочные сообщения
//#define GENERAL_DEBUG // если строка не закомментирована, будут выводиться отладочные сообщения
#define WIFIMAN_DEBUG (true) // вывод отладочных сообщений при подключении к WiFi сети: true - выводятся, false - не выводятся; настройка не зависит от GENERAL_DEBUG
#define OTA // если строка не закомментирована, модуль будет ждать два последдовательных запроса пользователя на прошивку по воздуху (см. документацию в "шапке")
#ifdef OTA
@@ -41,9 +41,30 @@ const uint8_t AP_STATIC_IP[] = {192, 168, 4, 1}; // статичес
// --- ВРЕМЯ ---------------------------
#define USE_NTP // закомментировать или удалить эту строку, если нужно, чтобы устройство не лезло в интернет
#define GMT (3) // часовой пояс (москва 3)
#define NTP_ADDRESS ("ntp2.colocall.net") // сервер времени
#define NTP_INTERVAL (30UL * 60UL * 1000UL) // интервал синхронизации времени (30 минут)
#define SUMMER_WINTER_TIME // для тех, кому нужен переход на зимнее/летнее время - оставить строку, остальным - закомментировать или удалить
#if !defined(SUMMER_WINTER_TIME)
#define LOCAL_WEEK_NUM (week_t::Last) // для стран, где нет перехода на зимнее/летнее время это технический параметр, не нужно его изменять
#define LOCAL_WEEKDAY (dow_t::Sun) // для стран, где нет перехода на зимнее/летнее время это технический параметр, не нужно его изменять
#define LOCAL_MONTH (month_t::Mar) // для стран, где нет перехода на зимнее/летнее время это технический параметр, не нужно его изменять
#define LOCAL_HOUR (1U) // для стран, где нет перехода на зимнее/летнее время это технический параметр, не нужно его изменять
#define LOCAL_OFFSET (3 * 60) // смещение локального времени относительно универсального координированного времени UTC в минутах
#define LOCAL_TIMEZONE_NAME ("MSK") // обозначение локального часового пояса; до 5 символов; может быть использовано, если понадобится его вывести после вывода времени
#else
#define SUMMER_WEEK_NUM (week_t::Last) // номер недели в месяце, когда происходит переход на летнее время (возможные варианты: First - первая, Second - вторая, Third - третья, Fourth - четвёртая, Last - последняя)
#define SUMMER_WEEKDAY (dow_t::Sun) // день недели, когда происходит переход на летнее время (возможные варианты: Mon - пн, Tue - вт, Wed - ср, Thu - чт, Sat - сб, Sun - вс)
#define SUMMER_MONTH (month_t::Mar) // месяц, в котором происходит переход на летнее время (возможные варианты: Jan - январь, Feb - февраль, Mar - март, Apr - апрель, May - май, Jun - июнь, Jul - июль, Aug - август, Sep - сентябрь, Oct - октябрь, Nov - ноябрь, Dec - декабрь)
#define SUMMER_HOUR (3U) // час (по зимнему времени!), когда заканчивается зимнее время и начинается летнее; [0..23]
#define SUMMER_OFFSET (3 * 60) // смещение летнего времени относительно универсального координированного времени UTC в минутах
#define SUMMER_TIMEZONE_NAME ("EEST") // обозначение летнего времени; до 5 символов; может быть использовано, если понадобится его вывести после вывода времени; может быть "ЛЕТ"
#define WINTER_WEEK_NUM (week_t::Last) // номер недели в месяце, когда происходит переход на зимнее время (возможные варианты: First - первая, Second - вторая, Third - третья, Fourth - четвёртая, Last - последняя)
#define WINTER_WEEKDAY (dow_t::Sun) // день недели, когда происходит переход на зимнее время (возможные варианты: Mon - пн, Tue - вт, Wed - ср, Thu - чт, Sat - сб, Sun - вс)
#define WINTER_MONTH (month_t::Oct) // месяц, в котором происходит переход на зимнее время (возможные варианты: Jan - январь, Feb - февраль, Mar - март, Apr - апрель, May - май, Jun - июнь, Jul - июль, Aug - август, Sep - сентябрь, Oct - октябрь, Nov - ноябрь, Dec - декабрь)
#define WINTER_HOUR (4U) // час (по летнему времени!), когда заканчивается летнее время и начинается зимнее; [0..23]
#define WINTER_OFFSET (2 * 60) // смещение зимнего времени относительно универсального координированного времени UTC в минутах
#define WINTER_TIMEZONE_NAME ("EET") // обозначение зимнего времени; до 5 символов; может быть использовано, если понадобится его вывести после вывода времени; может быть "ЗИМ"
#endif
#define PRINT_TIME (0U) // 0U - не выводить время бегущей строкой; 1U - вывод времени каждый час; 2U - каждый час + каждые 30 минут; 3U - каждый час + каждые 15 минут
// 4U - каждый час + каждые 10 минут; 5U - каждый час + каждые 5 минут; 6U - каждый час + каждую минуту
#define NIGHT_HOURS_START (1380U) // начало действия "ночного времени" (в минутах от начала суток, 23:00), текущее время бегущей строкой будет выводиться с яркостью NIGHT_HOURS_BRIGHTNESS
@@ -82,30 +103,31 @@ const uint8_t AP_STATIC_IP[] = {192, 168, 4, 1}; // статичес
// список и номера эффектов ниже в списке согласованы с android приложением!
#define EFF_SPARKLES (0U) // Конфетти
#define EFF_FIRE (1U) // Огонь
#define EFF_RAINBOW_VER (2U) // Радуга вертикальная
#define EFF_RAINBOW_HOR (3U) // Радуга горизонтальная
#define EFF_RAINBOW_DIAG (4U) // Радуга диагональная
#define EFF_COLORS (5U) // Смена цвета
#define EFF_MADNESS (6U) // Безумие 3D
#define EFF_CLOUDS (7U) // Облака 3D
#define EFF_LAVA (8U) // Лава 3D
#define EFF_PLASMA (9U) // Плазма 3D
#define EFF_RAINBOW (10U) // Радуга 3D
#define EFF_RAINBOW_STRIPE (11U) // Павлин 3D
#define EFF_ZEBRA (12U) // Зебра 3D
#define EFF_FOREST (13U) // Лес 3D
#define EFF_OCEAN (14U) // Океан 3D
#define EFF_COLOR (15U) // Цвет
#define EFF_SNOW (16U) // Снегопад
#define EFF_SNOWSTORM (17U) // Метель
#define EFF_STARFALL (18U) // Звездопад
#define EFF_MATRIX (19U) // Матрица
#define EFF_LIGHTERS (20U) // Светлячки
#define EFF_LIGHTER_TRACES (21U) // Светлячки со шлейфом
#define EFF_PAINTBALL (22U) // Пейнтбол
#define EFF_CUBE (23U) // Блуждающий кубик
#define EFF_WHITE_COLOR (24U) // Белый свет
#define MODE_AMOUNT (25U) // количество режимов
#define EFF_WHITTE_FIRE (2U) // Белый огонь
#define EFF_RAINBOW_VER (3U) // Радуга вертикальная
#define EFF_RAINBOW_HOR (4U) // Радуга горизонтальная
#define EFF_RAINBOW_DIAG (5U) // Радуга диагональная
#define EFF_COLORS (6U) // Смена цвета
#define EFF_MADNESS (7U) // Безумие 3D
#define EFF_CLOUDS (8U) // Облака 3D
#define EFF_LAVA (9U) // Лава 3D
#define EFF_PLASMA (10U) // Плазма 3D
#define EFF_RAINBOW (11U) // Радуга 3D
#define EFF_RAINBOW_STRIPE (12U) // Павлин 3D
#define EFF_ZEBRA (13U) // Зебра 3D
#define EFF_FOREST (14U) // Лес 3D
#define EFF_OCEAN (15U) // Океан 3D
#define EFF_COLOR (16U) // Цвет
#define EFF_SNOW (17U) // Снегопад
#define EFF_SNOWSTORM (18U) // Метель
#define EFF_STARFALL (19U) // Звездопад
#define EFF_MATRIX (20U) // Матрица
#define EFF_LIGHTERS (21U) // Светлячки
#define EFF_LIGHTER_TRACES (22U) // Светлячки со шлейфом
#define EFF_PAINTBALL (23U) // Пейнтбол
#define EFF_CUBE (24U) // Блуждающий кубик
#define EFF_WHITE_COLOR (25U) // Белый свет
#define MODE_AMOUNT (26U) // количество режимов
//#define MAX_UDP_BUFFER_SIZE (UDP_TX_PACKET_MAX_SIZE + 1)
#define MAX_UDP_BUFFER_SIZE (129U) // максимальный размер буффера UDP сервера

View File

@@ -80,11 +80,12 @@
- * обновление его оттенка/яркости происходит 1 раз в 3 секунды вместо 1 раза в минуту
- * диоды разбиты на 6 групп, первой из которых назначается новый оттенок/яркость 1 раз в 3 секунды, вторая "отстаёт" на 1 шаг, третья - на 2 шага и т.д. (для большей плавности)
- Добавлена визуальная сигнализация о некоторых важных действиях/состояниях лампы:
- * при запуске в режиме WiFi клиента и ещё не настроенных параметрах WiFi сети (когда их нужно ввести) - 1 короткая (0,25 сек) вспышка жёлтым
- * если лампа стартовала в режиме WiFi клиента с ненастроенными параметрами WiFi сети, и они не были введены за отведённый таймаут (перед перезагрузкой) - 1 короткая вспышка красным
- * при переходе лампы в режим обновления по воздуху (OTA) по двум четырёхкратным кликам по кнопке или по кнопке OTA из android приложения - 2 стандартных (0,5 сек) вспышки жёлтым
- * если лампа была переведена в режим OTA, но не дождалась прошивки за отведённый таймаут (перед перезагрузкой) - 2 стандартных вспышки красным
- * при переключении рабочего режима лампы WiFi точка доступа/WiFi клиент семикратным кликом по кнопке (перед перезагрузкой) - 3 стандартных вспышки красным
- * при запуске в режиме WiFi клиента и ещё не настроенных параметрах WiFi сети (когда их нужно ввести) - 1 вспышка жёлтым
- * если лампа стартовала в режиме WiFi клиента с ненастроенными параметрами WiFi сети, и они не были введены за отведённый таймаут (перед перезагрузкой) - 1 вспышка красным
- * при переходе лампы в режим обновления по воздуху (OTA) по двум четырёхкратным кликам по кнопке или по кнопке OTA из android приложения - 2 вспышки жёлтым
- * если лампа была переведена в режим OTA, но не дождалась прошивки за отведённый таймаут (перед перезагрузкой) - 2 вспышки красным
- * при переключении рабочего режима лампы WiFi точка доступа/WiFi клиент семикратным кликом по кнопке (перед перезагрузкой) - 3 вспышки красным
- * при запросе вывода времени бегущей строкой, если время не синхронизировано - 4 вспышки красным
- Уменьшен таймаут подключения к WiFi сети до 6 секунд; вызвано увеличившейся продолжительностью работы функции setup(), она в сумме должна быть меньше 8 секунд
- Оптимизирован код
--- 14.10.2019
@@ -99,6 +100,11 @@
--- 24.10.2019
- Добавлен вывод сигнала (HIGH/LOW - настраивается константой MOSFET_LEVEL) синхронно с включением матрицы на пин MOSFET транзистора (настраивается константой MOSFET_PIN)
- Добавлен вывод сигнала (HIGH/LOW - настраивается константой ALARM_LEVEL) на пин будильника (настраивается константой ALARM_PIN); сигнал подаётся в течение одной минуты, начиная со времени, на которое заведён будильник
--- 02.11.2019
- Добавлен переход на летнее/зимнее время (изменены настройки часового пояса, см. Constants.h); добавлена библиотека Timezone
- Добавлен эффект Белый огонь
- Исправлена ошибка сброса сигнала на пине ALARM_PIN при отключении будильника вручную
- Добавлена сигнализация (4 вспышки красным) при запросе вывода времени шестикратным кликом, если время не синхронизировано
*/
// Ссылка для менеджера плат:
@@ -121,7 +127,9 @@
#include "fonts.h"
#ifdef USE_NTP
#include <NTPClient.h>
#include <Timezone.h>
#endif
#include <TimeLib.h>
#ifdef OTA
#include "OtaManager.h"
#endif
@@ -141,11 +149,20 @@ WiFiUDP Udp;
#ifdef USE_NTP
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, GMT * 3600, NTP_INTERVAL);
NTPClient timeClient(ntpUDP, NTP_ADDRESS, 0, NTP_INTERVAL); // объект, запрашивающий время с ntp сервера; в нём смещение часового пояса не используется (перенесено в объект localTimeZone); здесь всегда должно быть время UTC
#ifdef SUMMER_WINTER_TIME
TimeChangeRule summerTime = { SUMMER_TIMEZONE_NAME, SUMMER_WEEK_NUM, SUMMER_WEEKDAY, SUMMER_MONTH, SUMMER_HOUR, SUMMER_OFFSET };
TimeChangeRule winterTime = { WINTER_TIMEZONE_NAME, WINTER_WEEK_NUM, WINTER_WEEKDAY, WINTER_MONTH, WINTER_HOUR, WINTER_OFFSET };
Timezone localTimeZone(summerTime, winterTime);
#else
TimeChangeRule localTime = { LOCAL_TIMEZONE_NAME, LOCAL_WEEK_NUM, LOCAL_WEEKDAY, LOCAL_MONTH, LOCAL_HOUR, LOCAL_OFFSET };
Timezone localTimeZone(localTime);
#endif
#endif
timerMinim timeTimer(3000);
bool ntpServerAddressResolved = false;
bool timeSynched = false;
uint32_t lastTimePrinted = 0U;
#ifdef ESP_USE_BUTTON
@@ -171,7 +188,6 @@ bool MqttManager::needToPublish = false;
char MqttManager::mqttBuffer[] = {};
uint32_t MqttManager::mqttLastConnectingAttempt = 0;
SendCurrentDelegate MqttManager::sendCurrentDelegate = NULL;
// volatile uint32_t wifiLastConnectingAttempt = 0;
#endif
// --- ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ -------
@@ -318,7 +334,7 @@ void setup()
else
{
LOG.println(F("WiFi сеть не определена, запуск WiFi точки доступа для настройки параметров подключения к WiFi сети..."));
showWarning(CRGB::Yellow, 250U, 250U); // мигание жёлтым цветом 0,25 секунды (1 раз) - нужно ввести параметры WiFi сети для подключения
showWarning(CRGB::Yellow, 1000U, 500U); // мигание жёлтым цветом 0,5 секунды (1 раз) - нужно ввести параметры WiFi сети для подключения
}
if (sizeof(STA_STATIC_IP))
@@ -345,7 +361,7 @@ void setup()
LOG.printf_P(PSTR("Рабочий режим лампы изменён и сохранён в энергонезависимую память\nНовый рабочий режим: ESP_MODE = %d, %s\nРестарт...\n"),
espMode, espMode == 0U ? F("WiFi точка доступа") : F("WiFi клиент (подключение к роутеру)"));
showWarning(CRGB::Red, 250U, 250U); // мигание красным цветом 0,25 секунды (1 раз) - ожидание ввода SSID'а и пароля WiFi сети прекращено, перезагрузка
showWarning(CRGB::Red, 1000U, 500U); // мигание красным цветом 0,5 секунды (1 раз) - ожидание ввода SSID'а и пароля WiFi сети прекращено, перезагрузка
ESP.restart();
}

View File

@@ -16,10 +16,10 @@
* ALM_SET1 390 - установить время будильника 1 (понедельник) на 06:30 (количество минут от начала суток)
* DAWN1 - установить "рассвет" за 5 минут до будильника (1 = 5 минут - номер опции в выпадающем списке в приложении, нумерация с единицы)
* TMR_SET 1 3 300 - установить таймер; описание параметров - см. команду TMR ниже
* FAV_SET 1 60 120 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 - установить режим "избранное", параметры - см. команду FAV ниже
* FAV_SET 1 60 120 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 - установить режим "избранное", параметры - см. команду FAV ниже
* BTN ON - разблокировать кнопку на лампе
* BTN OFF - заблокировать кнопку на лампе
* Лампа отправляет своё состояние сразу после включения и после каждого изменения в топик LedLamp/LedLamp_00316765/state; payload:
* Лампа отправляет своё состояние сразу после включения и после каждого изменения в топик LedLamp/LedLamp_<ChipId>/state; payload:
* "CURR 7 14 4 50 1 1 1 0 1 21:25:50", где:
* CURR - идентификатор команды, CURR - текущее состояние лампы
* 7 - номер текущего эффекта
@@ -42,7 +42,7 @@
* 1 - признак "таймер взведён"
* 3 - опция "выключить лампу через ...", цифра указывает на номер значения в выпадающем списке: 1 - не выключать, 2 - 1 минута... (см. в приложении)
* 300 - количество секунд, через которое выключится лампа (0 - не выключать)
* "FAV 1 60 120 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0"
* "FAV 1 60 120 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0"
* FAV - идентификатор команды, FAV - избранное
* 1 - режим "избранное" включен
* 60 - интервал смены эффектов в секундах

View File

@@ -10,7 +10,8 @@ void effectsTick()
switch (currentMode)
{
case EFF_SPARKLES: sparklesRoutine(); break;
case EFF_FIRE: fireRoutine(); break;
case EFF_FIRE: fireRoutine(true); break;
case EFF_WHITTE_FIRE: fireRoutine(false); break;
case EFF_RAINBOW_VER: rainbowVerticalRoutine(); break;
case EFF_RAINBOW_HOR: rainbowHorizontalRoutine(); break;
case EFF_RAINBOW_DIAG: rainbowDiagonalRoutine(); break;

View File

@@ -77,7 +77,7 @@ static const uint8_t hueMask[8][16] PROGMEM =
{0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 }
};
void fireRoutine()
void fireRoutine(bool isColored) // true - цветной огонь, false - белый
{
if (loadingFlag)
{
@@ -92,7 +92,7 @@ void fireRoutine()
generateLine();
pcnt = 0;
}
drawFrame(pcnt);
drawFrame(pcnt, isColored);
pcnt += 30;
}
@@ -129,7 +129,7 @@ void shiftUp()
// draw a frame, interpolating between 2 "key frames"
// @param pcnt percentage of interpolation
void drawFrame(uint8_t pcnt)
void drawFrame(uint8_t pcnt, bool isColored)
{
int32_t nextv;
@@ -148,9 +148,9 @@ void drawFrame(uint8_t pcnt)
- pgm_read_byte(&valueMask[y][newX]);
CRGB color = CHSV(
modes[EFF_FIRE].Scale * 2.5 + pgm_read_byte(&hueMask[y][newX]), // H
255U, // S
(uint8_t)max(0, nextv) // V
isColored ? modes[EFF_FIRE].Scale * 2.5 + pgm_read_byte(&hueMask[y][newX]) : 0U, // H
isColored ? 255U : 0U, // S
(uint8_t)max(0, nextv) // V
);
leds[getPixelNumber(x, y)] = color;
@@ -176,9 +176,9 @@ void drawFrame(uint8_t pcnt)
uint8_t newX = x;
if (x > 15U) newX = x % 16U;
CRGB color = CHSV(
modes[EFF_FIRE].Scale * 2.5 + pgm_read_byte(&(hueMask[0][newX])), // H
255, // S
(uint8_t)(((100.0 - pcnt) * matrixValue[0][newX] + pcnt * line[newX]) / 100.0) // V
isColored ? modes[EFF_FIRE].Scale * 2.5 + pgm_read_byte(&(hueMask[0][newX])): 0U, // H
isColored ? 255U : 0U, // S
(uint8_t)(((100.0 - pcnt) * matrixValue[0][newX] + pcnt * line[newX]) / 100.0) // V
);
//leds[getPixelNumber(newX, 0)] = color; // на форуме пишут что это ошибка - вместо newX должно быть x, иначе
leds[getPixelNumber(x, 0)] = color; // на матрицах шире 16 столбцов нижний правый угол неработает

View File

@@ -48,7 +48,8 @@ void processInputBuffer(char *inputBuffer, char *outputBuffer, bool generateOutp
if (!strncmp_P(inputBuffer, PSTR("DEB"), 3))
{
#ifdef USE_NTP
sprintf_P(inputBuffer, PSTR("%s%s"), PSTR("OK "), timeClient.getFormattedTime().c_str());
getFormattedTime(inputBuffer);
sprintf_P(inputBuffer, PSTR("OK %s"), inputBuffer);
#else
strcpy_P(inputBuffer, PSTR("OK --:--"));
#endif
@@ -351,9 +352,12 @@ void sendCurrent(char *outputBuffer)
sprintf_P(outputBuffer, PSTR("%s %u"), outputBuffer, (uint8_t)buttonEnabled);
#ifdef USE_NTP
sprintf_P(outputBuffer, PSTR("%s %s"), outputBuffer, timeClient.getFormattedTime().c_str());
char timeBuf[9];
getFormattedTime(timeBuf);
sprintf_P(outputBuffer, PSTR("%s %s"), outputBuffer, timeBuf);
#else
sprintf_P(outputBuffer, PSTR("%s %ull"), outputBuffer, millis());
time_t currentTicks = millis() / 1000UL;
sprintf_P(outputBuffer, PSTR("%s %02u:%02u:%02u"), outputBuffer, hour(currentTicks), minute(currentTicks), second(currentTicks));
#endif
}

View File

@@ -67,8 +67,9 @@ void printTime(uint32_t thisTime, bool onDemand, bool ONflag) // периоди
{
#if defined(USE_NTP) && defined(PRINT_TIME) // вывод, только если используется синхронизация времени и если заказан его вывод бегущей строкой
if (espMode != 1U || !ntpServerAddressResolved) // вывод только в режиме WiFi клиента и только, если имя сервера времени разрезолвлено
if (espMode != 1U || !ntpServerAddressResolved || !timeSynched) // вывод только в режиме WiFi клиента и только, если имя сервера времени разрезолвлено
{
showWarning(CRGB::Red, 4000U, 500U); // мигание красным цветом 4 секунды - смена рабочего режима лампы, перезагрузка
return;
}

View File

@@ -12,7 +12,6 @@
// при ошибках повторной синхронизации времени функции будильника отключаться не будут
#define RESOLVE_TIMEOUT (1500UL) // таймаут ожидания подключения к интернету в миллисекундах (1,5 секунды)
uint64_t lastResolveTryMoment = 0UL;
bool timeSynched = false;
IPAddress ntpServerIp = {0, 0, 0, 0};
static CHSV dawnColor = CHSV(0, 0, 0); // цвет "рассвета"
static CHSV dawnColorMinus1 = CHSV(0, 0, 0); // для большей плавности назначаем каждый новый цвет только 1/10 всех диодов; каждая следующая 1/10 часть будет "оставать" на 1 шаг
@@ -48,19 +47,20 @@ void timeTick()
}
}
timeSynched = timeSynched || timeClient.update(); // если время хотя бы один раз было синхронизировано, продолжаем
timeSynched = timeClient.update() || timeSynched; // если время хотя бы один раз было синхронизировано, продолжаем
if (!timeSynched) // если время не было синхронизиировано ни разу, отключаем будильник до тех пор, пока оно не будет синхронизировано
{
return;
}
uint8_t thisDay = timeClient.getDay();
if (thisDay == 0) thisDay = 7; // воскресенье это 0
thisDay--;
thisTime = timeClient.getHours() * 60 + timeClient.getMinutes();
uint32_t thisFullTime = timeClient.getHours() * 3600 + timeClient.getMinutes() * 60 + timeClient.getSeconds();
time_t currentLocalTime = localTimeZone.toLocal(timeClient.getEpochTime());
uint8_t thisDay = dayOfWeek(currentLocalTime);
if (thisDay == 1) thisDay = 8; // в библиотеке Time воскресенье - это 1; приводим к диапазону [0..6], где воскресенье - это 6
thisDay -= 2;
thisTime = hour(currentLocalTime) * 60 + minute(currentLocalTime);
uint32_t thisFullTime = hour(currentLocalTime) * 3600 + minute(currentLocalTime) * 60 + second(currentLocalTime);
printTime(thisTime, false, ONflag);
printTime(thisTime, false, ONflag); // проверка текущего времени и его вывод (если заказан и если текущее время соответстует заказанному расписанию вывода)
// проверка рассвета
if (alarms[thisDay].State && // день будильника
@@ -95,14 +95,14 @@ void timeTick()
delay(1);
FastLED.show();
dawnFlag = true;
#if defined(ALARM_PIN) && defined(ALARM_LEVEL) // установка сигнала в пин, управляющий будильником
if (thisTime == alarms[thisDay].Time) // установка, только в минуту, на которую заведён будильник
{
digitalWrite(ALARM_PIN, ALARM_LEVEL);
}
#endif
}
#if defined(ALARM_PIN) && defined(ALARM_LEVEL) // установка сигнала в пин, управляющий будильником
if (thisTime == alarms[thisDay].Time) // установка, только в минуту, на которую заведён будильник
{
digitalWrite(ALARM_PIN, manualOff ? !ALARM_LEVEL : ALARM_LEVEL);// установка сигнала в зависимости от того, был ли отключен будильник вручную
}
#endif
}
else
{
@@ -162,4 +162,10 @@ void resolveNtpServerAddress(bool &ntpServerAddressResolved) // ф
ntpServerAddressResolved = true;
}
}
void getFormattedTime(char *buf)
{
time_t currentLocalTime = localTimeZone.toLocal(timeClient.getEpochTime());
sprintf_P(buf, PSTR("%02u:%02u:%02u"), hour(currentLocalTime), minute(currentLocalTime), second(currentLocalTime));
}
#endif