Как изменить яркость светодиодного освещения?
Я пытаюсь изменить яркость светодиода с помощью 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(){}.
@Sean Balbuena, 👍1
2 ответа
Лучший ответ:
Чтобы изменить яркость любого цвета 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 тоже не очень точны в цвете, так что, вероятно, вы этого не заметите.
Я только что создал простую симуляцию для написанного хорошего ответа. Вот код:
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
- Управление цифровой адресной светодиодной лентой RGB 12 В с помощью Arduino
- Как подключить светодиодную RGB-матрицу 8x8 к Uno?
- Управление цветом светодиода RGB с помощью одной кнопки
- Подключение схемы включения/выключения по времени и моей светодиодной ленты adafruit neopixel
- Цвета RGB LED рандомизируются, а LDR затухает одновременно
- Схема светодиодной ленты правильная?
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
Огромное спасибо. На самом деле я думал о том, чтобы вручную преобразовать его в проценты или доли в зависимости от яркости, но я подумал, что ошибусь. Еще раз большое вам спасибо., @Sean Balbuena