From ec679047bf5bca0538c82b9c0e01a532543016ea Mon Sep 17 00:00:00 2001 From: gunner47 Date: Sat, 19 Oct 2019 15:09:51 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20"=D0=BD=D0=BE=D1=87=D0=BD=D1=8B=D0=B5=20=D1=87?= =?UTF-8?q?=D0=B0=D1=81=D1=8B"=20=D1=81=20=D1=80=D0=B5=D0=B3=D1=83=D0=BB?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=BE=D0=B9=20=D1=8F=D1=80=D0=BA?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B2=D0=BE=D0=B4=D0=B0=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- firmware/GyverLamp_v1.4/Constants.h | 7 +++- firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino | 2 + firmware/GyverLamp_v1.4/button.ino | 2 +- firmware/GyverLamp_v1.4/runningText.ino | 44 +++++++++++++++++++++- firmware/GyverLamp_v1.4/time.ino | 2 +- 5 files changed, 52 insertions(+), 5 deletions(-) diff --git a/firmware/GyverLamp_v1.4/Constants.h b/firmware/GyverLamp_v1.4/Constants.h index a7fd519..79b19f1 100644 --- a/firmware/GyverLamp_v1.4/Constants.h +++ b/firmware/GyverLamp_v1.4/Constants.h @@ -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 @@ -42,6 +42,11 @@ const uint8_t AP_STATIC_IP[] = {192, 168, 4, 1}; // статичес #define NTP_INTERVAL (30UL * 60UL * 1000UL) // интервал синхронизации времени (30 минут) #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 +#define NIGHT_HOURS_STOP (479U) // конец действия "ночного времени" (в минутах от начала суток, 7:59) +#define DAY_HOURS_BRIGHTNESS (255) // яркость для вывода текущего времени бегущей строкой днём; если -1, будет использована яркость текущего эффекта (она известна, даже когда матрица выключена) +#define NIGHT_HOURS_BRIGHTNESS (5) // яркость для вывода текущего времени бегущей строкой ночью; если -1, будет использована яркость текущего эффекта (она известна, даже когда матрица выключена) + // константы DAY_HOURS_BRIGHTNESS и NIGHT_HOURS_BRIGHTNESS используются только, когда матрица выключена, иначе будет использована яркость текущего эффекта // --- ВНЕШНЕЕ УПРАВЛЕНИЕ -------------- #define USE_MQTT (false) // true - используется mqtt клиент, false - нет diff --git a/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino b/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino index 101e1ff..eaeca55 100644 --- a/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino +++ b/firmware/GyverLamp_v1.4/GyverLamp_v1.4.ino @@ -92,6 +92,8 @@ - Добавлен вывод времени бегущей строкой: - * по запросу - шестикратному клику - текущее время белым цветом; - * периодически - определяется константой PRINT_TIME в Constants.h - от раза в час (красным цветом) до раза в минуту (синим цветом) с яркостью текущего эффекта как при включенной, так и при выключенной матрице + --- 19.10.2019 + - Добавлены "ночные часы" (от NIGHT_HOURS_START до NIGHT_HOURS_STOP включительно) и "дневные часы" (всё остальное время), для которых доступна регулировка яркости для вывода времени бегущей строкой - NIGHT_HOURS_BRIGHTNESS и DAY_HOURS_BRIGHTNESS */ // Ссылка для менеджера плат: diff --git a/firmware/GyverLamp_v1.4/button.ino b/firmware/GyverLamp_v1.4/button.ino index 3b1ae79..71d8eae 100644 --- a/firmware/GyverLamp_v1.4/button.ino +++ b/firmware/GyverLamp_v1.4/button.ino @@ -109,7 +109,7 @@ void buttonTick() // шестикратное нажатие if (clickCount == 6U) // вывод текущего времени бегущей строкой { - printTime(thisTime, true); + printTime(thisTime, true, ONflag); } diff --git a/firmware/GyverLamp_v1.4/runningText.ino b/firmware/GyverLamp_v1.4/runningText.ino index e7db6cc..79f5d6e 100644 --- a/firmware/GyverLamp_v1.4/runningText.ino +++ b/firmware/GyverLamp_v1.4/runningText.ino @@ -63,9 +63,10 @@ bool fillString(const char* text, CRGB letterColor) } -void printTime(uint32_t thisTime, bool onDemand) // периодический вывод времени бегущей строкой; onDemand - по требованию, вывод текущего времени; иначе - вывод времени по расписанию +void printTime(uint32_t thisTime, bool onDemand, bool ONflag) // периодический вывод времени бегущей строкой; onDemand - по требованию, вывод текущего времени; иначе - вывод времени по расписанию { #if defined(USE_NTP) && defined(PRINT_TIME) // вывод, только если используется синхронизация времени и если заказан его вывод бегущей строкой + if (espMode != 1U || !ntpServerAddressResolved) // вывод только в режиме WiFi клиента и только, если имя сервера времени разрезолвлено { return; @@ -133,7 +134,7 @@ void printTime(uint32_t thisTime, bool onDemand) // периодич char stringTime[10U]; // буффер для выводимого текста, его длина должна быть НЕ МЕНЬШЕ, чем длина текста + 1 sprintf_P(stringTime, PSTR("-> %u:%02u"), (uint8_t)((thisTime - thisTime % 60U) / 60U), (uint8_t)(thisTime % 60U)); loadingFlag = true; - FastLED.setBrightness(modes[currentMode].Brightness); + FastLED.setBrightness(getBrightnessForPrintTime(thisTime, ONflag)); delay(1); while (!fillString(stringTime, letterColor)) { delay(1); ESP.wdtFeed(); } loadingFlag = true; @@ -143,6 +144,45 @@ void printTime(uint32_t thisTime, bool onDemand) // периодич } +uint8_t getBrightnessForPrintTime(uint32_t thisTime, bool ONflag) // определение яркости для вывода времени бегущей строкой в зависимости от ESP_MODE, USE_NTP, успешности синхронизации времени, + // текущего времени суток, настроек дневного/ночного времени и того, включена ли сейчас матрица +{ + #if defined(USE_NTP) && defined(PRINT_TIME) + + if (espMode != 1U || !ntpServerAddressResolved || ONflag) + { + return modes[currentMode].Brightness; + } + + if (NIGHT_HOURS_START >= NIGHT_HOURS_STOP) // ночное время включает переход через полночь + { + if (thisTime >= NIGHT_HOURS_START || thisTime <= NIGHT_HOURS_STOP)// период действия ночного времени + { + return (NIGHT_HOURS_BRIGHTNESS >= 0) + ? NIGHT_HOURS_BRIGHTNESS + : modes[currentMode].Brightness; + } + } + else // ночное время не включает переход через полночь + { + if (thisTime >= NIGHT_HOURS_START && thisTime <= NIGHT_HOURS_STOP)// период действия ночного времени + { + return (NIGHT_HOURS_BRIGHTNESS >= 0) + ? NIGHT_HOURS_BRIGHTNESS + : modes[currentMode].Brightness; + } + } + + return (DAY_HOURS_BRIGHTNESS >= 0) // дневное время + ? DAY_HOURS_BRIGHTNESS + : modes[currentMode].Brightness; + + #endif + + return modes[currentMode].Brightness; +} + + void drawLetter(uint8_t letter, int8_t offset, CRGB letterColor) { uint8_t start_pos = 0, finish_pos = LET_WIDTH; diff --git a/firmware/GyverLamp_v1.4/time.ino b/firmware/GyverLamp_v1.4/time.ino index e2fe23c..3471b3c 100644 --- a/firmware/GyverLamp_v1.4/time.ino +++ b/firmware/GyverLamp_v1.4/time.ino @@ -60,7 +60,7 @@ void timeTick() thisTime = timeClient.getHours() * 60 + timeClient.getMinutes(); uint32_t thisFullTime = timeClient.getHours() * 3600 + timeClient.getMinutes() * 60 + timeClient.getSeconds(); - printTime(thisTime, false); + printTime(thisTime, false, ONflag); // проверка рассвета if (alarms[thisDay].State && // день будильника