Arduino Nano 33 BLE Sense incorpora un LED RGB que permite mostrar distintos colores. Un LED RGB se compone de tres LED cada uno de un color: rojo (Red), verde (Green) y azul (Blue). Cada color se controla de forma independiente cambiando el estado de un pin digital, cada pin tiene asociada una constante:
Color | Pin | Constante |
---|---|---|
Rojo | 22 | LEDR |
Verde | 23 | LEDG |
Azul | 24 | LEDB |
Combinando los tres distintos colores se pueden conseguir 8 combinaciones: rojo, verde, azul, amarillo, rosa, celeste y blanco y apagado. Para evitar volverse loco hay que tener en cuenta que los LED funcionan con lógica inversa, el estado LOW los enciende y el estado HIGH los apaga. En la siguiente tabla podemos ver como conseguir cada color:
Color | LEDR | LEDG | LEDB |
---|---|---|---|
Apagado | HIGH | HIGH | HIGH |
Rojo | LOW | HIGH | HIGH |
Verde | HIGH | LOW | HIGH |
Azul | HIGH | HIGH | LOW |
Amarillo | LOW | LOW | HIGH |
Rosa | LOW | HIGH | LOW |
Celeste | HIGH | LOW | LOW |
Blanco | LOW | LOW | LOW |
El primer paso es configurar el pin de cada LED como escritura. Cada pin tiene asociada una constante: LEDR, LEDG, LEDB.
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
Una vez hecho eso podemos controlar el estado de cada color con digitalWrite.
Una cosa a tener en cuenta, y que puede volverte loco, es que los leds funcionan con lógica inversa: el estado LOW los enciende y el estado HIGH los apaga.
Veamos todo esto en un ejemplo que cambia el color del LED cada dos segundos:
void setup() {
// activar todos los pins del led RGB
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
}
void loop() {
//blanco
digitalWrite(LEDR, LOW);
digitalWrite(LEDG, LOW);
digitalWrite(LEDB, LOW);
delay(2000);
//rojo
digitalWrite(LEDR, LOW);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, HIGH);
delay(2000);
//verde
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, LOW);
digitalWrite(LEDB, HIGH);
delay(2000);
//azul
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, LOW);
delay(2000);
//amarillo
digitalWrite(LEDR, LOW);
digitalWrite(LEDG, LOW);
digitalWrite(LEDB, HIGH);
delay(2000);
//rosa
digitalWrite(LEDR, LOW);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, LOW);
delay(2000);
//celeste
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, LOW);
digitalWrite(LEDB, LOW);
delay(2000);
//apagado
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, HIGH);
delay(2000);
}
Regular el brillo del LED para conseguir más colores
Aunque lo habitual es usar los LED como si fueran una salida digital se puede usar como si fuera una salida analógica PWM. Con esto podemos conseguir regular la luminosidad de los distintos LED. En este caso la lógica es inversa, 0 es el mayor valor de luminosidad y 255 el menor. Podemos ajustar cada uno de los tres colores de forma diferente. Regulando la intensidad de cada uno de los tres canales podemos conseguir otros colores. En teoría más de 16 millones (256*256*256) aunque en realidad el LED del Arduino permite muchos menos colores distinguibles. Uno de los problemas que tiene el LED “desnudo” es que cuando hay mucha diferencia de brillo entre sus colores se puede perder el efecto de “color unificado”
En el siguiente ejemplo vamos como usar anologWrite en lugar de digitalWrite para obtener el color naranja.
//naranja
analogWrite(LEDR, 0); //maximo
analogWrite(LEDR, 128); //medio
analogWrite(LEDR, 255); //minimo
Otro ejemplo, el siguiente código recorre toda la gama de colores:
void setup() {
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
}
void loop() {
for(byte r = 0; r < 255; r+=5){
for(byte g = 0; g < 255; g+=5){
for(byte b = 0; b < 255; b+=5){
analogWrite(LEDR, r);
analogWrite(LEDG, g);
analogWrite(LEDB, b);
delay(5);
}
}
}
}
Puedes ver como funciona un LED RGB en el siguiente vídeo de mi canal de Youtube: