vvip-68 / GyverPanelWiFi

Универсальная прошивка для широкоформатных матриц / гирлянд на балкон или стену / лампы с эффектами / часов с будильником-рассвет. Управление по WiFi в локальной сети или через MQTT-брокер.
286 stars 116 forks source link

не правильная кдировка цветов #296

Closed Kenaed closed 7 months ago

Kenaed commented 8 months ago

Купил готовую гирлянду в ней другая кодировка RGB можно ли это исправить в коде? и думаю стоит такую возможность включить в настройки

vvip-68 commented 8 months ago

Найти константу COLOR_ORDER и там исправить порядок цветов Включить в настройки - технически сложно.

frol-aleksan commented 8 months ago

Включить в настройки - технически сложно.

Ничего сложного. Сделал у себя за пару часов.

vvip-68 commented 8 months ago

Тогда научите как

frol-aleksan commented 8 months ago

Все делал по аналогии с уже имеющимся функционалом.

  1. Начинаем с того, что в приложении Panel Setup добавляем комбобокс cbColorOrder со списком возможных вариантов порядка цветов (GRB,RGB,BGR,BRG,GBR,RBG).
  2. На экране редактирования блоков добавляем функцию ParamSetM10 и вставляем ее вызов в paramSwitch6 1234
  3. Ковыряем код прошивки (буду указывать, что в каком файле делал) Заглавный файл где настройки ленты switch(mCOLOR_ORDER) { case 0: FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); break; case 1: FastLED.addLeds<WS2812, LED_PIN, RGB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); break; case 2: FastLED.addLeds<WS2812, LED_PIN, BGR>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); break; case 3: FastLED.addLeds<WS2812, LED_PIN, BRG>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); break; case 4: FastLED.addLeds<WS2812, LED_PIN, GBR>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); break; case 5: FastLED.addLeds<WS2812, LED_PIN, RBG>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); break; }

a_def_soft.h где объявляются переменные ширины и высоты матрицы uint8_t mCOLOR_ORDER = 0; // порядок цветов в гирлянде, 0 соответствует GRB

a_main.ino где case 8: (настройки параметров матрицы) case 8: // Настройки параметтров матрицы (размеры, подключение, порядок цветов) str = getStateString("UP|FM|M0|M1|M2|M3|M4|M5|M6|M7|M8|M9|M10"); break;

Между if (key == "M9") {...} и if (key == "E0") {...} добавляем // порядок цветов в гирлянде if (key == "M10") { tmp = String(mCOLOR_ORDER); if (value) { value->set(tmp); return tmp; } return str + "M10:" + tmp; }

eeprom.ino где идет определение направления и точки подключения mCOLOR_ORDER = getColorOrder();

putColorOrder(mCOLOR_ORDER);

void putColorOrder(uint8_t colorder) { if (colorder > 5) colorder = 0; if (colorder != getColorOrder()) { EEPROMwrite(93, colorder); }
} uint8_t getColorOrder() { uint8_t value = EEPROMread(93); if (value > 5) value = 0; return value; }

mqtt.ino где #define STATE_KEYS

define STATE_KEYS "|W|H|DM|PS|PD|IT|AL|RM|PW|BR|WU|WT|WR|WS|WC|WN|WZ|EF|EN|UE|UT|UC|SE|SS|SQ|BE|CE|CC|CO|CK|NC|SC|C1|DC|DD|DI|NP|NT|NZ|NS|DW|OF|TM|AW|AT|AD|AE|MX|MU|MD|MV|MA|MB|MP|AU|AN|NW|IP|QZ|QA|QP|QS|QU|QR|TE|TI|TS|CT|C2|OM|ST|AM1T|AM1A|AM2T|AM2A|AM3T|AM3A|AM4T|AM4A|AM5A|AM6A|UP|FM|T1|T2|M0|M1|M2|M3|M4|M5|M6|M7|M8|M9|M10/E1/E2/E3"

Может где-то что-то пропустил, ссылка на коммит с данными правками (и не только с ними): https://github.com/frol-aleksan/GyverPanelWiFi/commit/d6af36948e548919e900d651471384f8da9188c4

Работа основной части кода проверена с порядками цветов GRB, RGB и BGR, которые понадобились мне лично и ради чего это все затевалось. Работа MQTT не тестировалась, т. к. не пользуюсь.

Также как вторичный функционал добавлен эффект для проверки правильности выбора порядка цветов, заполняющий верхние 3 ряда матрицы красным, зеленым и синим, кнопка для его запуска находится в основном приложении.

vvip-68 commented 8 months ago

Вот, а теперь представьте, что такой же шаблон что у вас в switch(mCOLOR_ORDER) - он уже есть в программе, только таким образом реализуется выбор пина на который выводится линия ленты - там стоит switch(LED_PIN). И на ESP32 таких пинов, доступных для назначения около 20 штук. Плюс разновидностей ESP на которые рассчитан скетч - 8 штук ( ESP8266, ESP32-WROOM, S2, S2 mini, S3, S3 mini, C3, C3 mini) и у всех разные доступные пины. То есть, если мы хотим еще и порядок цвета брать из переменной - то на каждый внешний case от LED_PIN для одной (разновидности контроллера) будет еще по 6 вложенных case COLOR_ORDER. И того - 120 различных вариантов. Мало того, что это простыня из вложенных switch-case будет занимать 120 строк нечитаемого кода, та еще, полагаю, и при компиляции будет занимать кучу места в программном коде, с вероятностью не влезть во flash, которая и так пишет, что занято 98% памяти кода. Вот это я и называю - технически сложно включить в настройки...

frol-aleksan commented 8 months ago

Но к пину один раз припаял разъем, и все. А гирлянды можно подкинуть разные, и чтобы под каждую из них каждый раз не перепрошивать плату, добавил этот функционал

vvip-68 commented 8 months ago

Ну мне чаще попадались варианты (от пользователей), когда - подключил, а оно не работает и не знаю почему - как бы повыбирать на какое пин реально вывод идет. А с цветовым порядком - тот же аргумент - один раз в скетче прописал, проверил и больше менять не нужно. Мне как-то за эти годы не нужно было подкидывать разные гирлянды. Исходя из этого (из моих потребностей) и писалось.

Другой вопрос в последнее время всплыл, что мне китаец прислал три куска гирлянды - и у них у всех разный цветовой порядок. И тут уже нужно придумывать настройку - что диоды 0-99 - GRB, 100-199 - BGR и 200-299 - GBR, чтобы соединить это все в одну гирлянду

Но это уже совсем другая история...