mirror of
https://github.com/gunner47/GyverLamp.git
synced 2025-08-10 10:17:36 +03:00
Добавлен переход на летнее/зимнее время; Добавлен эффект Белый огонь; Исправлены ошибки
This commit is contained in:
@@ -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 сервера
|
||||
|
@@ -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();
|
||||
}
|
||||
|
||||
|
@@ -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 - интервал смены эффектов в секундах
|
||||
|
@@ -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;
|
||||
|
@@ -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 столбцов нижний правый угол неработает
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user