Как изменить яркость светодиодного освещения?

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

Когда дело доходит до регулировки яркости красного, зеленого и синего. Я попытался изменить значения внутри colorRGB().

С помощью colorRGB():

int redPin = 9;
int greenPin = 10;
int bluePin = 11;

void setup(){
    pinMode(redPin, OUTPUT);
    delay(500);
    pinMode(greenPin, OUTPUT);
    delay(500);
    pinMode(bluePin, OUTPUT);
    delay(500);
}
void loop(){
    colorRGB(255, 0, 0); //Уровень яркости 255
    colorRGB(150, 0, 0); //Уровень яркости 150
    colorRGB(50, 0, 0); //Уровень яркости 50
}
void colorRGB(int red, int green, int blue){
    analogWrite(redPin, red);
    analogWrite(greenPin, green);
    analogWrite(bluePin, blue);
}

Я также пытался использовать analogWrite(), однако ему нужен PIN в качестве одного из аргументов, поэтому я не совсем уверен, как связать это с уже настроенными цветами внутри void loop(){}.

, 👍1


2 ответа


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

3

Чтобы изменить яркость любого цвета RGB, вам нужно умножить каждый цветовой компонент на коэффициент яркости. Давайте рассмотрим несколько примеров:

  • Красный-255,0,0 в RGB. Полная яркость представлена 1, половина яркости-0,5, четверть яркости-0,25 и так далее. Таким образом, мы получаем следующие значения (мы выполняем целочисленные вычисления, поэтому удаляем любые десятичные цифры):
    • половина яркости: 255*0.5,0*0.5,0*0.5 --> >127,0,0
    • четверть яркости: 255*0.25,0*0.25,0*0.25 --> >63,0,0
  • Желтый-это сочетание красного и зеленого, поэтому 255,255,0. Проделав ту же математику, что и выше, мы получим:
    • половина яркости: 255*0.5,255*0.5,0*0.5 --> >127,127,0
    • четверть яркости: 255*0.25,255*0.25,0*0.25 --> >63,63,0
  • Голубой-это сочетание красного зеленого и наполовину синего, так что 255,255,127. Проделав ту же математику, что и выше, мы получим:
    • половина яркости: 255*0.5,255*0.5,127*0.5 --> >127,127,63
    • четверть яркости: 255*0.25,255*0.25,127*0.25 --> >63,63,31

Таким образом, вы можете изменить свою функцию, включив параметр яркости:

void colorRGB(int red, int green, int blue, int brightness_percent){
    analogWrite(redPin, red*brightness_percent/100);
    analogWrite(greenPin, green*brightness_percent/100);
    analogWrite(bluePin, blue*brightness_percent/100);
}

Здесь я использовал не диапазон значений от 0 до 1, а вместо этого в процентах от 0 до 100. Это связано с тем, что операции с плавающей запятой на ардуино довольно трудоемки (потому что у Arduino для этого нет аппаратного обеспечения, и все это нужно делать в программном обеспечении), поэтому лучше умножить на процентное значение, а затем разделить на 100. Таким образом, у нас есть только целочисленные вычисления, что намного быстрее. Результат тот же самый.

Примечание: По мере того, как цветовые компоненты получают более низкие значения, вы можете увидеть цветовые ошибки из-за количественной оценки. Хотя обычно светодиоды RGB тоже не очень точны в цвете, так что, вероятно, вы этого не заметите.

,

Огромное спасибо. На самом деле я думал о том, чтобы вручную преобразовать его в проценты или доли в зависимости от яркости, но я подумал, что ошибусь. Еще раз большое вам спасибо., @Sean Balbuena


1

Я только что создал простую симуляцию для написанного хорошего ответа. Вот код:

int redPin = 9;
int greenPin = 10;
int bluePin = 11;

void setup() {
  pinMode(redPin, OUTPUT);
  delay(500);
  pinMode(greenPin, OUTPUT);
  delay(500);
  pinMode(bluePin, OUTPUT);
  delay(500);
}
void loop() {
  colorRGB(255, 0, 0, 100); //Brightness level 100%
  delay(3000);
  colorRGB(255, 0, 0, 25); //Brightness level 25%
  delay(3000);

  colorRGB(255, 255, 0, 100); //Brightness level 100%
  delay(3000);
  colorRGB(255, 255, 0, 25); //Brightness level 25%
  delay(3000);

  colorRGB(255, 255, 127, 100); //Brightness level 100%
  delay(3000);
  colorRGB(255, 255, 127, 25); //Brightness level 25%
  delay(3000);
}
void colorRGB(int red, int green, int blue, int brightness_percent) {
  analogWrite(redPin, red * brightness_percent / 100);
  analogWrite(greenPin, green * brightness_percent / 100);
  analogWrite(bluePin, blue * brightness_percent / 100);
   
}

я надеюсь, что это будет полезно. Я из команды Wokwi и буду рад всем вашим вопросам. Вы можете взглянуть на ссылку для моделирования Arduino Wokwi здесь:

https://wokwi.com/arduino/projects/313797447551812161

,