Управление цветом светодиода RGB с одним значением

В таких приложениях, как Photoshop, есть один ползунок для выбора цвета: .

Я хотел бы добиться того же, используя ручку переменного сопротивления в качестве ползунка для управления цветом светодиода RGB. Может ли кто-нибудь направить меня на правильный путь, как линейно отображать значения цвета?

, 👍0

Обсуждение

Используйте HSV, как сказал Маженко. Но вы также можете добавить гамма-коррекцию к этим значениям RGB. Наши глаза не воспринимают разницу в яркости линейно., @Gerben

Любые советы, как это сделать? Я не собирался регулировать яркость или насыщенность, а просто использовать максимальные значения., @wilkas

У Adafruit есть отличное объяснение и руководство по этому вопросу на https://learn.adafruit.com/led-tricks-gamma-correction/the-issue., @Gerben

Спасибо, быстрое исправление гамма-коррекции было так легко реализовать, и оно улучшило внешний вид, особенно после реализации пульсирующего затухания., @wilkas


1 ответ


Лучший ответ:

2

Вы управляете одним из трех значений цветового пространства HSV (он же HSB).

Цвет может быть представлен различными способами, которые называются пробелами. Монитор вашего компьютера отображает цвет в цветовом пространстве RGB - красный, зеленый и синий. Светодиод RGB, конечно же, также отображается в цветовом пространстве RGB. Ваш цветной принтер работает в цветовом пространстве CMYK.

Разные цветовые пространства представляют цвет с использованием разных значений и комбинаций значений, и используемое вами цветовое пространство может быть наложено техническими ограничениями (например, в принтере оно определяется комбинацией цветов чернил).

HSV – это удобный способ визуального управления цветом, так как он позволяет легко понять "Оттенок" (цвет), "Насыщенность" (насколько насыщен цвет) и "Значение" (или "Яркость" – насколько светлым является цвет). ) значения, понятные человеку.

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

Вы можете думать о HSV как о "человеческом" цветовом пространстве, а о RGB как о "цифровом" цветовом пространстве.

К счастью, преобразовать одно в другое относительно просто, и в Интернете есть несколько фрагментов кода, которые дают примеры того, как это сделать.

Я собираюсь включить сюда один, который я использую в моей библиотеке TFT-дисплеев chipKIT "Cariad". Учитывая три 8-битных значения (0-255) «hue», «sat» и «val», он вычислит значения красного, зеленого и синего. «оттенок» — это тот, который вы меняете с помощью своего горшка — другие могут быть статическими значениями (или вы можете добавить больше горшков, чтобы контролировать и их).

    unsigned int H_accent = hue/43;
    unsigned int bottom = ((255 - sat) * val)>>8;
    unsigned int top = val;
    unsigned char rising  = ((top-bottom)  *(hue%43   )  )  /  43  +  bottom;
    unsigned char falling = ((top-bottom)  *(43-hue%43)  )  /  43  +  bottom;

    int r = 0;
    int g = 0;
    int b = 0;

    switch(H_accent) {
        case 0:
                r = top;
                g = rising;
                b = bottom;
        break;

        case 1:
                r = falling;
                g = top;
                b = bottom;
        break;

        case 2:
                r = bottom;
                g = top;
                b = rising;
        break;

        case 3:
                r = bottom;
                g = falling;
                b = top;
        break;

        case 4:
                r = rising;
                g = bottom;
                b = top;
        break;

        case 5:
                r = top;
                g = bottom;
                b = falling;
        break;
    }
    if (r > 255) r = 255;
    if (g > 255) g = 255;
    if (b > 255) b = 255;
    if (r < 0) r = 0;
    if (g < 0) g = 0;
    if (b < 0) b = 0;
,

Каковы диапазоны значений «hue», «sat» и «val» в этом скрипте? Это 0-128?, @wilkas

0-255 полный 8-битный диапазон, @Majenko

Работает как шарм. Я блуждаю, почему цвета выглядят по-разному, когда плата Arduino питается через USB и через подключение к источнику питания, @wilkas

Из-за разного прямого напряжения трех светодиодов и разного входного напряжения питания., @Majenko