Библиотека FastLED: Как настроить яркость одного пикселя в абсолютном масштабе?

library rgb-led led-strip

Я использую FastLED библиотеку для управления цифровой светодиодной полосой RGB.

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

FastLED.setBrightness() уменьшает яркость всех пикселей.
светодиоды[i].Функция fadeLightBy() уменьшает масштаб отдельного пикселя, но если она будет вызвана снова для того же пикселя перед обновлением светодиодов, то пиксель снова исчезнет из уже исчезнувшего значения.

Действительно ли нет встроенного метода для установки яркости отдельных пикселей на определенное значение?

, 👍3


1 ответ


3

Специальной функции для регулировки яркости нет.
Вы можете (однако) сделать это с помощью цветовой модели HSV.


Разделение ВПГ (анахронизм) на части:

H (Оттенок) Управляет самим цветом.
S (Насыщенность) цвета.
V называется Легкостью или Значением.

"V" - это то, что вы хотите контролировать.
Просто установите цвет светодиодов на значение HSV и измените его значение V.

leds[i] = HSV(color, saturation, brightness);

В то время как "Цвет" и "Насыщенность" остаются прежними (чтобы сохранить один и тот же цвет), вы можете изменить "Яркость" непосредственно в третьем параметре.

Обратите внимание, что "leds[i]" по-прежнему определяется как "CRGB", а не как "HSV".
Это назначение использует неявное преобразование, определенное в библиотеке.

Вы можете увидеть пример использования " HSV "в примере" Cylon " в библиотеке FastLED.
Там вы найдете значение оттенка, которое изменяется; но это тот же принцип, что и "яркость".


Теперь есть проблема, которую нужно решить.
Библиотека FastLED может преобразовывать цвета "HSV" в цвета "RGB", но не наоборот.
Таким образом, вы не можете просто получить "оттенок" и насыщенность цвета "RGB" с помощью этой библиотеки.

У вас есть 2 альтернативы:

1. Вы можете просто определить дополнительный массив светодиодов с цветами HSV и синхронизировать оба массива, чтобы они содержали одни и те же данные (каждый раз, когда вы хотите изменить цвет, вы должны установить цвет " HSV "во втором массиве, преобразовать этот массив в" RGB "с помощью" CRGB(hsv_leds[i]) " и сохранить его в первом массиве, который используется библиотекой FastLED).
Это относительно просто, но для хранения значений цвета вам фактически потребуется вдвое больше памяти.
Это не проблема, если у вас достаточно памяти или недостаточно светодиодов для управления.

2. Вы можете написать свою собственную функцию для преобразования значений " RGB " в "HSV"; затем используйте ее для доступа к значениям "оттенок" и "Насыщенность" для целевого цвета "RGB", создайте с ним новый цвет " HSV "и новую" Яркость "и используйте ее для установки значений" RGB " для библиотеки FastLED.
В этой теме форума есть краткое обсуждение этого, хотя это оставляет вас с реализацией самостоятельно.
Я думаю, что есть подходящие реализации, которые можно найти в Интернете.
Быстрый поиск дал мне этот код из github gist. Я не тестировал его, поэтому не могу сказать, действительно ли он работает правильно, но вы должны попробовать. Я уверен, что есть и другие реализации.

,

Я понимаю, что HSV позволяет вам передавать яркость, однако у меня есть приложения, которые требуют изменения только яркости, учитывая определенный триггер. Теперь мне кажется, что решение состоит в том, чтобы сделать что-то вроде следующего псевдокода: "светодиоды[i] = HSV(светодиоды[i].цвет, светодиоды[i].насыщенность, 127);", чтобы я мог изменять яркость до 127, не зная наверняка текущий цвет, насыщенность или яркость этого пикселя в то время. Мне придется поискать его фактический синтаксис. Я, конечно, надеюсь, что это можно сделать таким образом., @Bort

@Bort Я добавил краткое объяснение по этой теме., @chrisl

Я думаю, что ваш ответ вводит в заблуждение, когда вы говорите: "вы можете просто сделать именно это", потому что я думаю, что ваш ответ затем объясняет, что я не могу этого сделать, и я должен сделать что-то другое. Для вашего решения № 1, зачем мне нужно конвертировать в RGB, если библиотека уже принимает HSV в качестве входных данных? Я попробую № 2 через некоторое время., @Bort

Это больше похоже на "вы можете сделать именно это, но это немного сложнее, чем вы хотели", так как вы можете управлять яркостью одного пикселя с помощью этого, но это сложнее, чем просто использовать одну специальную встроенную функцию. О #1: Все примеры, которые я видел, используют "CRGB" в качестве типа массива, который передается конструктору FastLED. Я попытался использовать конструктор с типом HSV, но это привело к соответствующей ошибке компиляции. Таким образом, я вычел, что библиотека работает только с RGB, но также дает вам HSV, который затем может быть преобразован в RGB, @chrisl

Этот вывод может быть неверным. Если вы можете напрямую использовать HSV для массива, пожалуйста, сообщите нам, и я изменю свой ответ., @chrisl

Я просто имел в виду, что если у меня уже есть то, что я хочу в HSV, я могу просто использовать " светодиоды[i] = HSV(цвет, насыщенность, яркость)"; так зачем преобразовывать в RGB? ....Должно быть, я вас неправильно понимаю., @Bort

Элемент массива "светодиоды[i] по-прежнему определяется как CRGB, поэтому вы не можете вернуть цвет и насыщенность с помощью" светодиоды[i].насыщенность и т. Д. В приведенной выше строке используется неявное преобразование из CHSV в CRGB, определенное в библиотеке. Именно в этом и заключается проблема, почему я добавил эти две возможности. Я добавлю немного больше к ответу, чтобы прояснить это., @chrisl