Dimmer LED con arduino y mando a distancia

Voy a contar un poco de historia, si queréis ir al grano buscad la negrita. Hace tiempo en el chalet teníamos una tira de LEDs blanca, muy luminosa, que conectábamos a la batería e iluminaba el patio, donde nos sentábamos a cenar. Como era muy luminosa, al salir del techo y sentarnos fuera no podíamos ver bien las estrellas, así que le hice un dimmer.

Ese dimmer ya está posteado por aquí.

El problema es que antes del verano hicimos unas obras y se cambió la tira LED por un bar de bombillas, también LED, de bajo consumo y a 12 voltios. Se podían controlar igual, pero mi sistema necesitaba una mejora. Tenía que ser doble, y tenía que manejarse a distancia.

Así que revisé el material que tenía por casa y tuve una idea con el siguiente material: un arduino pro mini, unos MOSFET viejos, un sensor de infrarrojos y un mando a distancia.

De estos componentes ya he hablado en otras ocasiones, si queréis conocer las características y funcionamiento:

Si no tenéis un Pro Mini no os preocupéis, podéis usar otra placa distinta como un UNO, o un Nano.

El circuito es más simple que el mecanismo de un botijo. En primer lugar se regula la tensión con un 7805 para no quemar el arduino conectándolo directamente a los 12 voltios de la batería. Concretamente el Mini puede funcionar tanto a 5 como a 3.3 voltios.

Lo siguiente es conectar dos salidas PWM del arduino a los MOSFET. Para asegurar la conmutación, se suelen poner resistencias de 1 Megaohmio a masa en la puerta. Para hacer más simple la conexión, se pueden usar unos terminales con tornillos.

Por otro lado, se conecta el sensor de infrarrojos a una pata cualquiera del arduino, la alimentación de 5V y a masa.

arduinodimmer

A mí me quedó la placa así:

arduinodimmer2

Para poder reutilizar el arduino cuando no se gaste (lógicamente el circuito está desmontado, lo tengo en casa otra vez desde verano), le puse unos conectores hembra, entonces el arduino va clavado ahí y se saca cuando quieras. Detrás a la derecha se ve el 7805, más al frente el sensor de infrarrojos y delante del todo ya los MOSFET.

Ahora falta la programación. Para ello hay que conocer los códigos que envía el mando, lo que se puede conseguir refiriéndonos otra vez al primer ejemplo con el mando de infrarrojos.

#include <IRremote.h>
// 1 = 16724175
// 2 = 16718055
// 3 = 16743045
// - = 16754775
// + = 16748655
// Mute = 16769565
// ON/OFF = 16753245
// Derecha = 16761405
// Izquierda = 16712445
// PlayPause = 16720605

#define m1 16724175
#define m2 16718055
#define m3 16743045
#define m4 16716015
#define m6 16734885
#define menos 16754775
#define mas 16748655
#define mute 16769565
#define ONOFF 16753245
#define derecha 16761405
#define izquierda 16712445
#define PlayPause 16720605

int IRpin = 9, PWM1 = 5, PWM2 = 6, PWM1_val = 0, PWM2_val = 0; //Asignamos pines para la entrada del sensor IR, y las dos salidas PWM para los MOSFET
//También dos variables que indiquen el valor del PWM que se va a asignar a cada pin
IRrecv irrecv(IRpin); //Se declara el objeto sensor de IR para el pin que hemos asignado antes
decode_results results; //Se crea una variable para guardar los datos decodificados

void setup()
{
//Serial.begin(9600); //No necesitamos conexión serial
pinMode(PWM1,OUTPUT); //Pines PWM como salida, que se inicien apagados
pinMode(PWM2,OUTPUT);
digitalWrite(PWM1, LOW);
digitalWrite(PWM2, LOW);
irrecv.enableIRIn(); // Inicializar el receptor

}

void loop()
{
if (irrecv.decode(&results)) //Si tenemos un resultado de la decodificación, vamos a ver la acción
{
if(results.value==ONOFF){ //Si se ha pulsado el boton ONOFF
if((PWM1_val > 0)||(PWM2_val > 0)){ //Si alguno de los PWM está en marcha
PWM1_val = 0; //Apagar los dos pines
PWM2_val = 0;
}
else{ //Y si los dos están apagados
PWM1_val = 255; //Encender ambos al máximo
PWM2_val = 255;
}
}

if(results.value==izquierda){ //Si se ha pulsado el botón izquierda
if(PWM1_val > 0) PWM1_val = 0; //Si el PWM1 está encendido, apagalo
else PWM1_val = 255; //Y si esta apagado ponlo al máximo
}

if(results.value==derecha){ //Si se ha pulsado el botón derecha
if(PWM2_val > 0) PWM2_val = 0; //Si el PWM2 está encendido, apagalo
else PWM2_val = 255; //Y si está apagado ponlo al máximo
}

if(results.value==m1) PWM1_val -= 15; //Si se ha pulsado el botón 1 del mando
//Resta 15 al valor del PWM1, disminuye la luminosidad
//Este valor se puede cambiar si deseas tener que pulsar más o menos veces el botón

if(results.value==m3) PWM1_val += 15; //Si se ha pulsado el botón 3 del mando
//Suma 15 al valor del PWM1, aumenta la luminosidad

if(results.value==m4) PWM2_val -= 15; //Lo mismo con el PWM2 y los botones 4 y 6

if(results.value==m6) PWM2_val +=15;
irrecv.resume(); // El IR está listo para recibir el siguiente valor
}
//Ahora vamos a controlar que los valores del PWM no están por debajo del 0 ni por encima del 255
if(PWM1_val<0) PWM1_val = 0; if(PWM1_val>255) PWM1_val = 255;
if(PWM2_val<0) PWM2_val = 0; if(PWM2_val>255) PWM2_val = 255;

//Y ahora se escriben los valores en el pin correspondiente
analogWrite(PWM1, PWM1_val);
analogWrite(PWM2, PWM2_val);
}

Deja un comentario

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