Исправлены ошибки режима Избранное и эффекта "Белый свет"; Оптимизация использования памяти

This commit is contained in:
gunner47
2019-09-05 23:26:03 +03:00
parent 763770d72f
commit 2d5a709116
11 changed files with 258 additions and 239 deletions

View File

@@ -53,102 +53,19 @@
- Эффект "Светлячки со шлейфами" переименован в "Угасающие пиксели"
- Добавлены 5 новых эффекта: "Радуга диагональная", "Метель", "Звездопад", "Светлячки со шлейфами" (новый) и "Блуждающий кубик"
- Исправлены ошибки
--- 04.09.2019
- Большая часть определений (констант) перенесена в файл Constants.h
- Большая оптимизация использования памяти
- Исправлена ошибка невключения эффекта "Белый свет" приложением и кнопкой
- Исправлена ошибка неправильного выбора интервала в режиме Избранное в android приложении
*/
// Ссылка для менеджера плат:
// https://arduino.esp8266.com/stable/package_esp8266com_index.json
// ============= НАСТРОЙКИ =============
// --- ВРЕМЯ ---------------------------
#define USE_NTP // закомментировать или удалить эту строку, если нужно, чтобы устройство не лезло в интернет
#define GMT (3) // часовой пояс (москва 3)
#define NTP_ADDRESS ("ntp2.colocall.net") // сервер времени
#define NTP_INTERVAL (30UL * 60UL * 1000UL) // интервал синхронизации времени (30 минут)
// --- РАССВЕТ -------------------------
#define DAWN_BRIGHT (200U) // максимальная яркость рассвета (0-255)
#define DAWN_TIMEOUT (1U) // сколько рассвет светит после времени будильника, минут
// --- МАТРИЦА -------------------------
#define BRIGHTNESS (40U) // стандартная маскимальная яркость (0-255)
#define CURRENT_LIMIT (2000U) // лимит по току в миллиамперах, автоматически управляет яркостью (пожалей свой блок питания!) 0 - выключить лимит
#define WIDTH (16U) // ширина матрицы
#define HEIGHT (16U) // высота матрицы
#define COLOR_ORDER (GRB) // порядок цветов на ленте. Если цвет отображается некорректно - меняйте. Начать можно с RGB
#define MATRIX_TYPE (0U) // тип матрицы: 0 - зигзаг, 1 - параллельная
#define CONNECTION_ANGLE (0U) // угол подключения: 0 - левый нижний, 1 - левый верхний, 2 - правый верхний, 3 - правый нижний
#define STRIP_DIRECTION (0U) // направление ленты из угла: 0 - вправо, 1 - вверх, 2 - влево, 3 - вниз
// при неправильной настройке матрицы вы получите предупреждение "Wrong matrix parameters! Set to default"
// шпаргалка по настройке матрицы здесь! https://alexgyver.ru/matrix_guide/
// --- ESP -----------------------------
#define ESP_MODE (1U) // 0U - WiFi точка доступа, 1U - клиент WiFi (подключение к роутеру)
#define ESP_USE_BUTTON // если строка не закомментирована, должна быть подключена кнопка (иначе ESP может регистрировать "фантомные" нажатия и некорректно устанавливать яркость)
#define ESP_HTTP_PORT (80U) // номер порта, который будет использоваться во время первой утановки имени WiFi сети (и пароля), к которой потом будет подключаться лампа в режиме WiFi клиента (лучше не менять)
#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 WIFIMAN_DEBUG (true) // вывод отладочных сообщений при подключении к WiFi сети: true - выводятся, false - не выводятся; настройка не зависит от GENERAL_DEBUG
#define OTA // если строка не закомментирована, модуль будет ждать два последдовательных запроса пользователя на прошивку по воздуху (см. документацию в "шапке")
#ifdef OTA
#define ESP_OTA_PORT (8266U) // номер порта, который будет "прослушиваться" в ожидании команды прошивки по воздуху
#endif
// --- ESP (WiFi клиент) ---------------
uint8_t STA_STATIC_IP[] = {}; // статический IP адрес: {} - IP адрес определяется роутером; {192, 168, 1, 66} - IP адрес задан явно (если DHCP на роутере не решит иначе); должен быть из того же диапазона адресов, что разадёт роутер
// SSID WiFi сети и пароль будут запрошены WiFi Manager'ом в режиме WiFi точки доступа, нет способа захардкодить их в прошивке
// --- AP (WiFi точка доступа) ---
#define AP_NAME ("LedLamp") // имя WiFi точки доступа, используется как при запросе SSID и пароля WiFi сети роутера, так и при работе в режиме ESP_MODE = 0
#define AP_PASS ("31415926") // пароль WiFi точки доступа
uint8_t AP_STATIC_IP[] = {192, 168, 4, 1}; // статический IP точки доступа (лучше не менять)
// ============= ДЛЯ РАЗРАБОТЧИКОВ =====
#define LED_PIN (2U) // пин ленты
#define BTN_PIN (4U) // пин кнопки
// список и номера эффектов ниже в списке согласованы с 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 NUM_LEDS (WIDTH * HEIGHT)
#define SEGMENTS (1U) // диодов в одном "пикселе" (для создания матрицы из кусков ленты)
// --- БИБЛИОТЕКИ ----------------------
#define FASTLED_INTERRUPT_RETRY_COUNT (0U)
#define FASTLED_ALLOW_INTERRUPTS (0U)
#define FASTLED_ESP8266_RAW_PIN_ORDER
#include "Types.h"
#include "timerMinim.h"
#include "pgmspace.h"
#include "Constants.h"
#include <FastLED.h>
#include <ESP8266WiFi.h>
#include <DNSServer.h>
@@ -156,6 +73,8 @@ uint8_t AP_STATIC_IP[] = {192, 168, 4, 1}; // статичес
#include <WiFiManager.h>
#include <WiFiUdp.h>
#include <EEPROM.h>
#include "Types.h"
#include "timerMinim.h"
#ifdef ESP_USE_BUTTON
#include <GyverButton.h>
#endif
@@ -169,6 +88,7 @@ uint8_t AP_STATIC_IP[] = {192, 168, 4, 1}; // статичес
#include "FavoritesManager.h"
#include "EepromManager.h"
// --- ИНИЦИАЛИЗАЦИЯ ОБЪЕКТОВ ----------
CRGB leds[NUM_LEDS];
WiFiManager wifiManager;
@@ -192,14 +112,14 @@ OtaPhase OtaManager::OtaFlag = OtaPhase::None;
// --- ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ -------
uint16_t localPort = ESP_UDP_PORT;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1]; // buffer to hold incoming packet
String inputBuffer;
char packetBuffer[MAX_UDP_BUFFER_SIZE]; // buffer to hold incoming packet
char inputBuffer[MAX_UDP_BUFFER_SIZE];
static const uint8_t maxDim = max(WIDTH, HEIGHT);
ModeType modes[MODE_AMOUNT];
AlarmType alarms[7];
uint8_t dawnOffsets[] = {5, 10, 15, 20, 25, 30, 40, 50, 60};// опции для выпадающего списка параметра "время перед 'рассветом'" (будильник)
uint8_t dawnOffsets[] = {5, 10, 15, 20, 25, 30, 40, 50, 60};// опции для выпадающего списка параметра "время перед 'рассветом'" (будильник); синхронизировано с android приложением
uint8_t dawnMode;
bool dawnFlag = false;
long thisTime;
@@ -242,7 +162,7 @@ void setup()
wifiManager.resetSettings();
#ifdef GENERAL_DEBUG
Serial.println("Настройки WiFiManager сброшены");
Serial.println(F("Настройки WiFiManager сброшены"));
#endif
}
#endif
@@ -267,23 +187,23 @@ void setup()
WiFi.softAP(AP_NAME, AP_PASS);
Serial.println("Режим WiFi точки доступа");
Serial.print("IP адрес: ");
Serial.println(F("Режим WiFi точки доступа"));
Serial.print(F("IP адрес: "));
Serial.println(WiFi.softAPIP());
wifiServer.begin();
}
else // режим WiFi клиента (подключаемся к роутеру, если есть сохранённые SSID и пароль, иначе создаём WiFi точку доступа и запрашиваем их)
{
Serial.println("Режим WiFi клиента");
Serial.println(F("Режим WiFi клиента"));
if (WiFi.SSID())
{
Serial.print("Подключение WiFi сети: ");
Serial.print(F("Подключение WiFi сети: "));
Serial.println(WiFi.SSID());
}
else
{
Serial.println("WiFi сеть не определена, запуск WiFi точки доступа для настройки параметров подключения к WiFi сети...");
Serial.println(F("WiFi сеть не определена, запуск WiFi точки доступа для настройки параметров подключения к WiFi сети..."));
}
if (STA_STATIC_IP)
@@ -300,7 +220,7 @@ void setup()
if (WiFi.status() != WL_CONNECTED)
{
Serial.printf("Время ожидания ввода SSID и пароля от WiFi сети или подключения к WiFi сети превышено\nПерезагрузка модуля");
Serial.println(F("Время ожидания ввода SSID и пароля от WiFi сети или подключения к WiFi сети превышено\nПерезагрузка модуля"));
#if defined(ESP8266)
ESP.reset();
@@ -309,11 +229,11 @@ void setup()
#endif
}
Serial.print("IP адрес: ");
Serial.print(F("IP адрес: "));
Serial.println(WiFi.localIP());
}
Serial.printf("Порт UDP сервера: %u\n", localPort);
Serial.printf_P(PSTR("Порт UDP сервера: %u\n"), localPort);
Udp.begin(localPort);
EepromManager::InitEepromSettings( // инициализация EEPROM; запись начального состояния настроек, если их там ещё нет; инициализация настроек лампы значениями из EEPROM