Приветствую ищущих. Делюсь опытом. Теги:
bluetooth, prismatic, мерцание, задержка отображения
Подсветку делал на телевизор, для связи с компьютером использовал блютус, модуль hc-05, хотя работает и на JDY-31. Гайд для справки
https://mihalech.com/2017/11/13/ambient-light-with-ambibox-arduino-bluetooth-hc-05-ws2812b/
По блютусу вкратце - hc-05 настраивал через программатор esp-ttl, т.к. через ардуино он не захотел,
AT+UART=115200,0,0 (скорости достаточно, если использовать интерполяцию, как написано ниже; если все же решите поднять до 128000 на JDY учтите, что потом не сможете легко её понизить, т.к. монитор порта ArduinoIDE не позволяет соединяться на такой скорости, нужно будет писать скетч, чтобы ардуино прошила его сама).
Upd: через пару недель таки заменил модуль на JDY, потому что hc-05 периодически отказывался коннектится;
возможно проблема была в автообновлении Призматика - его тоже отключил; сейчас всё работает хорошо; модуль стал отваливаться реже, но все таки иногда не подключается; решается отключением/включением блютуса на компе.
На компе использовал
Prismatic вместо AmbiBox (
https://github.com/psieg/Lightpack), когда разберетесь с ней - можно создавать профили для различного положения черных полос в фильмах; хранятся профили в текстовых файлах, поэтому их можно легко настраивать через блокнот, а не таскать зоны захвата по экрану). Скриншот для моей настройки профиля с черными полосами внизу.
Первоначально при работе часто было хаотическое
мерцание, вылечилось установкой CURRENT_LIMIT 0 в скетче. Об этом тут уже не раз писали, что этот параметр работает криво. В Призматике при настройке эти лимиты можно указать, поэтому думаю в скетче без вреда можно обнулить параметр.
Для увеличения скорости работы подсветки (интервал захвата снизил до 10 мс),
уменьшения задержки отображения и загрузки компьютера снизил количество зон захвата в два раза - 65 зон при 130 диодах (телевизор 65'', ленту использовал 30 диодов/м). Для этого цвет каждого второго светодиода находил интерполяцией между соседними двумя, для которых данные брались из захвата. Для этого изменил фрагмент скетча так:
memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
for (int i = 0; i < NUM_LEDS; i += 2) { //данные с захвата присваиваются каждому второму диоду
byte r, g, b;
// читаем данные для каждого цвета
while (!Serial.available()) check_connection();
r = Serial.read();
while (!Serial.available()) check_connection();
g = Serial.read();
while (!Serial.available()) check_connection();
b = Serial.read();
leds.r = r;
leds.g = g;
leds.b = b;
if (i == 0) continue;
leds[i - 1].r = (r + leds[i - 2].r) / 2; //для остальных диодов цвета находятся интерполяцией
leds[i - 1].g = (g + leds[i - 2].g) / 2;
leds[i - 1].b = (b + leds[i - 2].b) / 2;
}
leds[NUM_LEDS - 1].r = (leds[0].r + leds[NUM_LEDS - 2].r) / 2; //если число диодов четное, то последний нужно прописать дополнительно через интерполяцию...
leds[NUM_LEDS - 1].g = (leds[0].g + leds[NUM_LEDS - 2].g) / 2; //...между предпоследним и нулевым диодом (т.к. лента "замкнута" в кольцо);...
leds[NUM_LEDS - 1].b = (leds[0].b + leds[NUM_LEDS - 2].b) / 2; //...если у вас нечетное количество диодов, то экспериментируйте; скорее всего можно будет это убрать, но в настройке цикла написать i <= NUM_LEDS + 1
FastLED.show();
Восприятие подсветки никак не пострадало. Мне кажется, вообще нет смысла гнаться за большим числом диодов и лучше не использовать ленты 60 и 144 диода/м для телевизоров.