DIMMER A CONTROL REMOTO CON ARDUINO

 

Resultado de imagen para dimmer bombilla
Pensando en la necesidad de los usuarios interesados en desarrollar proyectos basados en electrónica de potencia y electrónica de control, hemos diseñado un circuito que nos permite regular la intensidad lumínica de una bombilla incandescente o si usted lo desea: de un motor eléctrico bien podría ser de un ventilador, un taladro incluso de un calefactor eléctrico. Sin embargo y de manera inicial el circuito está pensado para usar bombillas incandescentes. Este circuito está pensado para regular de las dos formas: usando potenciómetro y un arduino usando un control remoto puede ser de un televisor, o un control de otra aplicación electrónica.
EL FUNCIONAMIENTO
Este circuito usa un puente rectificador el cual será aprovechado en otras etapas del circuito como un detector de cruce por cero manejado por las interrupciones de programación del arduino, adicional a eso también será aprovechado para conectar el SCR y la bombilla en conjunto con un oscilador de relajación compuesto por un transistor UJT que a través de los pulsos generados desde la base 2 activará un SCR por la compuerta o gate y de esta forma podremos manipular la señal senoidal proveniente del puente rectificador mediante ángulos de disparo.
Este circuito posee de igual forma entradas optoacopladas conectadas hacia un 4n35 que lo que hace es separar la señal del detector de cruce por cero del arduino para que esta pueda ser manipulada con voltajes de control que normalmente oscilan entre 0 y 5 volts, la parte de la conexión entre el arduino y el control remoto es básicamente configurar los códigos hexadecimales que genera dicho control los cuales pueden ser visualizados mediante el monitor serial del arduino. Cada vez que usted presione una tecla automáticamente está configurando la trama de datos de cada uno de los botones del control remoto.
Otra particularidad de este sistema y que notamos al momento de montar este circuito es la imposibilidad de controlar la señal de salida por PWM realmente controlar un dimmer por control remoto usando un PWM es imposible debido a que lo que usted manipula cada vez que presiona un botón del control son pulsos modulados y no van en cruce con la señal de línea o la señal de voltaje AC por lo cual consideramos que no es nada apto controlar via PWM un dimmer.
Las adaptaciones pueden ser muchas. Usted puede controlarlo via bluetoooth  y creando una aplicación en Android con el software app inventor totalmente gratuito y suministrado por el MIT. Pero eso ya son palabras mayores debido a que usted debería ser capaz de diseñar dicho software y empezar como a mirar cuales son sus requerimientos.
A continuación les comparto el circuito empleado para dicha aplicación más unos videos de configuración
fig 1DIMMER

 

LISTADO DE MATERIALES
1 puente rectificador de 4 Amperios
1 resistencia de 100k a 1/2W
1 bombillo incandescente de 120V
1 SCR mayor a 15 amperios s6035J
1 resistencia de 3.3 a 10W (ojo tipo tiza)
1 UJT transistor 2n6027
1 condensador de 0.1uF a 450V
1 resistencia de 220 ohm a 1/2W
1 diodo 1n4004
1 resistencia de 1k a 1/2W
1 potenciómetro de 50k a 1/2W
1 resistencia de 100k a 1/2W
1 diodo 1N4742A (regula a 12 volts y es a 1W)
1 resistencia de 330 ohms
1 resistencia de 10k
1 optoacoplador 4N35
1 resistencia de 100 ohm a 1/2W
1 optoacoplador MOC 3021
1 tarjeta arduino uno R3
1 cable de potencia para el tomacorriente
 
AQUI LES COMPARTO UN VIDEO DE NUESTRO DIMMER EN ACCION
 
 
TUTORIAL PARA SACAR LOS CODIGOS DEL CONTROL 
REMOTO
(del profesor Humberto Higinio) 100% recomendado

CODIGO FUENTE

la particularidad de este código es que posee una conexión de un display de 7 segmentos, pero de forma general el código es el mismo que empleamos para hacer el control de manera remota. modificamos la activación del display. al final del código está el link de la página de donde lo extraimos
 
#include “IRremote.h”
//—–( Declare Constants )—–
int receiver = 13;
//—–( Declare objects )—–
IRrecv irrecv(receiver);           // create instance of ‘irrecv’
decode_results results;            // create instance of ‘decode_results’
//—–( Declare Variables )—–
#include <TimerOne.h>           // Avaiable from http://www.arduino.cc/playground/Code/Timer1
volatile int i=0;               // Variable to use as a counter
volatile boolean zero_cross=0;  // Boolean to store a “switch” to tell us if we have crossed zero
int AC_pin = 3;                 // Output to Opto Triac
int buton1 = 4;                 // first button at pin 4
int buton2 = 5;                 // second button at pin 5
int dim2 = 0;                   // led control
int dim = 128;                  // Dimming level (0-128)  0 = on, 128 = 0ff
int pas = 10;                   // step for count;
int A = 9;                  // step for count;
int B = 6;
int C = 7;
int D = 8;
int E = 12;
int F = 10;
int G = 11;
// version: 4m7 (15.04.2013 – Craiova, Romania) – 16 steps, 4 button & LED blue to red (off to MAX)
// version: 7m6.1 (23.01.2014 – Craiova, Romania) – 16 steps, 2 button & LCD1602
int freqStep = 75;    // This is the delay-per-brightness step in microseconds.
char incomingByte;  // incoming data from serial 9bluetooth)
void setup() {  // Begin setup
  Serial.begin(9600); // initialization
  irrecv.enableIRIn(); // Start the IR receiver (classic remote)
  pinMode(buton1, INPUT);  // set buton1 pin as input
  pinMode(buton2, INPUT);  // set buton1 pin as input
  pinMode(AC_pin, OUTPUT);                          // Set the Triac pin as output
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  attachInterrupt(0, zero_cross_detect, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
  Timer1.initialize(freqStep);                      // Initialize TimerOne library for the freq we need
  Timer1.attachInterrupt(dim_check, freqStep);
  // Use the TimerOne Library to attach an interrupt
}
void zero_cross_detect() {
  zero_cross = true;               // set the boolean to true to tell our dimming function that a zero cross has occured
  i=0;
  digitalWrite(AC_pin, LOW);
}
// Turn on the TRIAC at the appropriate time
void dim_check() {
  if(zero_cross == true) {
    if(i>=dim) {
      digitalWrite(AC_pin, HIGH);  // turn on light
      i=0;  // reset time step counter
      zero_cross=false;    // reset zero cross detection
    }
    else {
      i++;  // increment time step counter
    }
  }
}
//—–( Declare User-written Functions )—–
void translateIR() // takes action based on IR code received
{
  switch(results.value)
  {
case 16724175:
    dim=128;
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, HIGH);
    digitalWrite(E, HIGH);
    digitalWrite(F, HIGH);
    digitalWrite(G, LOW);
    }
    break;
case 16744575:
    dim=120;
    {
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
    digitalWrite(E, LOW);
    digitalWrite(F, LOW);
    digitalWrite(G, LOW);
    }
    break;
case 16728255:
    dim=105;
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, LOW);
    digitalWrite(D, HIGH);
    digitalWrite(E, HIGH);
    digitalWrite(F, LOW);
    digitalWrite(G, HIGH);
    }
    break;
case 16760895:
    dim=90;
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, HIGH);
    digitalWrite(E, LOW);
    digitalWrite(F, LOW);
    digitalWrite(G, HIGH);
    }
    break;
case 16720095:
    dim=75;
    {
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
    digitalWrite(E, LOW);
    digitalWrite(F, HIGH);
    digitalWrite(G, HIGH);
    }
    break;
case 16752735:
    dim=60;
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, HIGH);
    digitalWrite(D, HIGH);
    digitalWrite(E, LOW);
    digitalWrite(F, HIGH);
    digitalWrite(G, HIGH);
    }
    break;
case 16736415:
    dim=45;
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, HIGH);
    digitalWrite(D, HIGH);
    digitalWrite(E, HIGH);
    digitalWrite(F, HIGH);
    digitalWrite(G, HIGH);
    }
    break;
case 16769055:
    dim=30;
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
    digitalWrite(E, LOW);
    digitalWrite(F, LOW);
    digitalWrite(G, LOW);
    }
    break;
case 16716015:
    dim=15;
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, HIGH);
    digitalWrite(E, HIGH);
    digitalWrite(F, HIGH);
    digitalWrite(G, HIGH);
    }
    break;
case 16748655:
    dim=00;
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, HIGH);
    digitalWrite(E, LOW);
    digitalWrite(F, HIGH);
    digitalWrite(G, HIGH);
    }
    break;
  case 16758855:
    {
    if (dim<127)
   {
    dim = dim + pas;
    if (dim>127)
    {
     dim=128;
    }
    }
    }
    break;
  case 16730295:
    {
      {
  if (dim>5)
  {
     dim = dim – pas;
  if (dim<0)
    {
      dim=0;  // in vechiul sketch era 1
    }
   }
   }
   }
    break;
   if(dim>100)
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, HIGH);
    digitalWrite(E, HIGH);
    digitalWrite(F, HIGH);
    digitalWrite(G, LOW);
    }
    default:
    Serial.println(results.value);
  }
}
void loop() {
  digitalWrite(buton1, HIGH);
  digitalWrite(buton2, HIGH);
 if (digitalRead(buton1) == LOW)
   {
  if (dim<127)
  {
    dim = dim + pas;
    if (dim>127)
    {
      dim=128; // in vechiul sketch era 127
    }
  }
   }
  if (digitalRead(buton2) == LOW)
   {
  if (dim>5)
  {
     dim = dim – pas;
  if (dim<0)
    {
      dim=0;  // in vechiul sketch era 1
    }
   }
   }
    while (digitalRead(buton1) == LOW) {  }
    delay(10); // waiting little bit…
    while (digitalRead(buton2) == LOW) {  }
    delay(10); // waiting little bit…
 if(dim>127)
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, HIGH);
    digitalWrite(E, HIGH);
    digitalWrite(F, HIGH);
    digitalWrite(G, LOW);
    }
 if(127>dim && dim>115)
    {
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
    digitalWrite(E, LOW);
    digitalWrite(F, LOW);
    digitalWrite(G, LOW);
    }
 if(115>dim && dim>105)
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, LOW);
    digitalWrite(D, HIGH);
    digitalWrite(E, HIGH);
    digitalWrite(F, LOW);
    digitalWrite(G, HIGH);
    }
 if(105>dim && dim>90)
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, HIGH);
    digitalWrite(E, LOW);
    digitalWrite(F, LOW);
    digitalWrite(G, HIGH);
    }
 if(90>dim && dim>75)
   {
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
    digitalWrite(E, LOW);
    digitalWrite(F, HIGH);
    digitalWrite(G, HIGH);
    }
 if(75>dim && dim>60)
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, HIGH);
    digitalWrite(D, HIGH);
    digitalWrite(E, LOW);
    digitalWrite(F, HIGH);
    digitalWrite(G, HIGH);
    }
 if(60>dim && dim>45)
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, HIGH);
    digitalWrite(D, HIGH);
    digitalWrite(E, HIGH);
    digitalWrite(F, HIGH);
    digitalWrite(G, HIGH);
    }
 if(45>dim && dim>30)
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
    digitalWrite(E, LOW);
    digitalWrite(F, LOW);
    digitalWrite(G, LOW);
    }
 if(30>dim && dim>15)
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, HIGH);
    digitalWrite(E, HIGH);
    digitalWrite(F, HIGH);
    digitalWrite(G, HIGH);
    }
 if(15>dim && dim>00)
    {
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, HIGH);
    digitalWrite(E, LOW);
    digitalWrite(F, HIGH);
    digitalWrite(G, HIGH);
    }
// remote
   if (irrecv.decode(&results)) // have we received an IR signal?
  {
    translateIR();
    irrecv.resume(); // receive the next value
  }
 delay (100);
}

 

 

 

Deja un comentario

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