vvip-68 / GyverPanelWiFi

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

Изменение цветовой последовательности для одного отрезка #255

Closed Melkiyby closed 1 year ago

Melkiyby commented 1 year ago

Привет. Собрал матрицу 48х14(6х14 на окно) и так совпало что одна лента оказалась отличной по цветовой последовательности. Есть ли возможность для этого участка указать нужную последовательность или нужно глубокое погружение в библиотеку FastLed? Screenshot_20221212-004946_Video Player

vvip-68 commented 1 year ago

Мне не известен способ как это сделать и я не вижу простого решения. Есть вроде какая-то возможность разделять вывод на ленту через подключение к разным пинам контроллера и для каждого пина указать свои настройки. Но это действительно нужно глубокое погружение в FastLED и я с этим не сталкивался и ничего конкретного по этому поводу сказать не могу.

vvip-68 commented 1 year ago

Ну, мои эксперименты показали, что это возможно. Вывод на части ленты разделяется на разные пины, каждый пин инициализируется со своей цветовой последовательностью. Должно работать.

Melkiyby commented 1 year ago

Ну про вывод через разные пины это понятно, сейчас ковыряю fastled на возможность внесения коррекции в сам массив что бы еще один провод не тянуть. По результатам отпишусь

vvip-68 commented 1 year ago

Проще всего, видимо, найти процедуру FastLedShow() и в указанное место

image

вставить небольшой цикл, который пробегает по участку матрицы, которая "не того цвета" и меняет для каждого пикселя цвета с RGB на GRB или как там оно у вас...

Melkiyby commented 1 year ago

Всё верно, в это место нужно вставить 123 Осталось проверить на подтормаживание

Melkiyby commented 1 year ago

Был выявлен косяк с морганием изменённого участка(синий с красным чередовались) в режиме рисования, игр, загрузки картинок и на некоторых эффектах. Вот фикс 456

vvip-68 commented 1 year ago

Может быть после FastLED.show() нужно просто обратно вернуть как было? Видимо часть эффектов для построения следующего кадра берет данные из этого массива, а он уже изменен... Отсюда и артефакты.

Тогда да, нужно создать массив нужного размера, скопировать в него через memcpy() текущее содержимое leds с нужной позиции, после отправки на матрицу show() через memcpy() вернуть обратно...

Копирование памяти memcpy() работает быстро

Melkiyby commented 1 year ago

Я согласен что мой метод не самый быстрый. Завтра попробую с memcpy() если конечно мозга хватит.

vvip-68 commented 1 year ago

В проекте есть несколько мест, где используется memcpy(), посмотрите там. Почитайте в инете про функцию с примерами. Ничего сложного - указывается куда копировать (приемник), откуда копировать (источник) и сколько копировать (в байтах). Помним, что цвета в массиве - эта структура RGB, то есть один цвет - 3 байта. Вроде бы так.

Хотя, если ваш метод работает и все устраивает - нет задержек - к чёрту перфекционизм.