Proyecto con Arduino: anillo de diodos RGB con botón para encendido y apagado

En unas semanas el señor Ironman tiene otro evento, y como las luces de las manos no le terminaron de funcionar bien en el evento anterior, he decidido cambiar el circuitillo pila-interruptor-bombilladelleroymerlin por un circuito con los mismos LEDs que el resto del disfraz.

Al principio pensé en enganchar las luces de las manos a los cables de los brazos, pero cuando me puse a hacer el esquema me di cuenta de que las luces de las manos eran anillos de diodos GRB, y las luces de los brazos eran RGBW. Tras una media hora intentando sin éxito dar con el código RGBW que me diera el mismo tono de azul en todos los LEDs del anillo, decidí que las luces de las manos iban a ir cada una en un circuito separado.

El esquema es bastante simple:

Sobre el circuito:

Lo bueno de usar anillos ya ensamblados es que no hay que preocuparse por los condensadores ni la resistencia de entrada, así que se puede conectar directamente el puerto que se elija del arduino a la entrada del anillo. Lo malo, como ya he comentado, es que los anillos solo se encuentran con LEDs GRB (o RGB), no RGBW.

Pero eso también tiene algo bueno: al ser GRB consumen menos intensidad (además de ser mucho menos que en el circuito para el cuerpo entero), y un anillo de 12 diodos funciona perfectamente con los 500mA que da el arduino.

La fuente de alimentación es 4 pilas AA en serie, que dan 6V – aquí la intensidad no es un factor decisivo porque con la que da el arduino ya vale -, suficiente para conectarlo a la entrada de voltaje regulado.

El código, que es un copipega de trozos de proyectos anteriores, queda así:


#include <Adafruit_NeoPixel.h>
#define PIN 4
#define NUMPIXELS 12
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int boton = 3;
long tiempo_anterior;
long diferencia;
bool flagLuces = false;
bool encendido = false;

void setup() {
Serial.begin(9600);
pixels.begin(); // This initializes the NeoPixel library.
pixels.show(); // initialize all pixels to "off"

pinMode(boton, INPUT);
attachInterrupt(digitalPinToInterrupt(boton), pulsacion, FALLING);
}

void pulsacion(){
diferencia = millis() - tiempo_anterior;
tiempo_anterior = millis();

if(diferencia > 500){
flagLuces = true;
}
}

void loop() {
if(flagLuces){
cambiaEstadoLED();
}
}

void cambiaEstadoLED(){
if(!encendido){
encender();
Serial.println("encendido");
}
else{
apagar();
Serial.println("apagado");
}
encendido = !encendido;
flagLuces = false;
}

void encender(){
uint16_t i, j;

for (j = 0; j < 255; j++) {
for(int i=0;i<NUMPIXELS;i++){
pixels.setPixelColor(i, pixels.Color(23, 161, 165));
}
pixels.setBrightness(j);
pixels.show();
delay(20);
}
}

void apagar(){
uint16_t i, j;

for (j = 255; j > 0; j--) {
for(int i=0;i<NUMPIXELS;i++){
pixels.setPixelColor(i, pixels.Color(23, 161, 165));
}
pixels.setBrightness(j);
pixels.show();
delay(20);
}
}

Sobre el código:

Poco que decir: el botón está programado como una interrupción y habéis visto ese código ya ochenta veces en anteriores posts, y el color que dan los diodos es azul frío, pero cambiando los códigos de color se puede conseguir cualquier otro.

El circuito final está hecho de tal forma que el interruptor se accione al juntar el pulgar y el íncide, y las luces van a ir en la palma de la mano. El arduino y el portapilas irían dentro del antebrazo, y las clemas son porque el guante y el antebrazo van por separado, para no tener que andar con cables colgando de una pieza a otra cuando no están puestas:

 

************************************************************

Espero que esta entrada pueda ser de utilidad, y si no, como siempre, aquí tenéis un gato para compensar.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *