Dimmer digital --> PIC 12F675

#1
Bueno, hace dos fines de semana atrás, invité a una señorita a mi departamento y no tenia un sistema para poner el ambiente mas romántico (luces bajas) y se me ocurrió un dimmer, pero ya todos conocerán el dimmer con perilla (potenciómetro) pero ese es muy simple, así que se me ocurrió utilizar un PIC y hacerlo digital y que sea controlado vía control remoto, también con pulsadores, así que me puse a buscar en internet a ver si alguien lo tenia desarrollado y encontré uno muy interesante pero sólo mostraba la teoría diciendo que no pondrá el código fuente porque hay muchas personas que lo venden y no quiere perjudicarlos, pero yo digo que la educación no debe ser guardada para algunos si no mostrada a todos que quieran avanzar en su desarrollo, bueno dejándonos de mucho floro les dejo el código fuente de un DIMMER digital con el PIC 12F675, claro es algo muy básico y creo que funciona porque realmente no lo e probado en físico pero si lo e simulado en PROTEUS 7.2 y esta de locos, en esta primera versión lo e hecho con pulsadores para variar la intensidad de la luz, bueno no es necesario explicar el código ya que en él esta bien detallada.

Código:
#include <12F675.h>
#fuses   INTRC_IO,NOWDT,PUT,NOPROTECT,NOCPD,NOMCLR,BROWNOUT
#use     delay(clock=4000000)
#define  GP0 PIN_A0   // TRIAC
#define  GP1 PIN_A1   // CONTROL REMOTO IR
#define  GP2 PIN_A2   // DETECTOR CRUCE POR CERO
#define  GP3 PIN_A3   // RESET
#define  GP4 PIN_A4   // UP
#define  GP5 PIN_A5   // DOWN

unsigned int16 fase=57536;
int1 cambio=1;

#int_TIMER1                      //Interrupción del TIMER1
void time()
{
 output_high(GP0);                //Se desbordó el TIMER1 y pongo en "0" el gate del triac
}

#INT_EXT                         //Interrupción externa.
void cero()                      //Función de la interrupción externa
{
 output_low(GP0);               //Pongo en "1" el gate del triac
 set_timer1(fase);               //Cargo el TIMER1 con el valor determinado por las teclas y espera que desborde
 enable_interrupts(INT_TIMER1);  //Habilito la interrupción del TIMER1 y salta a su respectiva interrupción

 if(cambio==0)                   //Para ver con que flanco de interrumpirá ahora
 {
  ext_int_edge(H_TO_L);          //Interrupción con flanco de bajada
  cambio=1;                      //Cambia para que la proxima la interrupción sea en flanco de subida
 }
 else
 {
  ext_int_edge(L_TO_H);          //Interrupción con flanco de subida
  cambio=0;                      //Cambia para que la proxima la interrupción sea en flanco de bajada
 }
}

void main()                      //Función principal
{
 ext_int_edge(L_TO_H);           //Primera interrupción se dará en flanco de subida
 setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);  //Configuración de TIMER1
 enable_interrupts(INT_EXT);     //Habilito interrupciones externas
 enable_interrupts(GLOBAL);      //Habilito las interrupciones generales
 
while(1){
  restart_wdt();                 //Apago el watch dog timer
  if(input(GP4)==0)              //Si el pulsador se a apretado
  {if(fase<=64536&&fase>57536){delay_ms(10); fase=fase-5;}} //Aumenta la luminicidad
  if(input(GP5)==0)              //Si el pulsador se a apretado
  {if(fase>=57536&&fase<64536){delay_ms(10); fase=fase+5;}} //Disminiye la luminicidad
 }
}
Ahora solo copiar el código y compilarlo en el CCS, ya dejan sus comentarios para ver como les fue o tal vez también para aportar mejoras, como punto final si alguien quiere armarlo le sugiero que lo alimente con una fuente capacitiva (sin transformador) lo pueden encontrar en muchas páginas y para el detector cruce por cero le de la misma red de 220vac colocar dos resistencias en serie de 5M y por lo menos de 5Wa la entrada de INT del PIC ya que esta patilla tiene una protección contra sobre voltaje y pas resistencias están para reducir la corriente y no hay problema en conectarlo de frente, bueno lo demas ya les dejo a criterio propio.

Les dejo enlaces:

Sobre el cruce por cero --> http://www.domoticachile.org/index....&id=52:zerocrossing&catid=44:teoria&Itemid=61
sobre el circuito (recomendable en archivos adj.) --> http://tech-freaks.net/?p=170

Bueno colegas mano a la obra, espero comentarios, próximamente voy a hacer que funcione con control remoto con el protocolo de PHILIPS RC5, bueno ya tengo el decodificador de estas señales pero aun me falta la fusión, la intención es hacer varios de estos dimmers y colocarlos en cada habitación y con el control remoto de philips activar cada dimmer con los números del control y subir o bajar la intensidad de luz con el volumen, pero eso lo tendré listo para la próxima semana y que publicare por este mismo canal :) suerte a todos.
 
Última edición por un moderador:
#2
esta muy interesante eso

yo estoy trabajando en algo muy parecido

la idea es mover unas cortinas, que seria como la intensidad luminica con el dimmer, lo estoy haciendo por pulsadores

vamos a ver como nos va... suerte
 
#3
Pudiera ser para una cortina, pero no creo que te sirva de mucho, lo mas facil y barato seria simplemente un motor DC conectado al cordón de la cortina y y con un LM555 y un puente H lo pudieras controlar incluso hasta la velocidad. :)
 
#4
que tal amigos. yo justamente estoy montando algo similar también con el 12F675 puedo grabarle en la memoria 4 botones del mando ir que quiera luego las funciones son 1 on / aumentar intensidad - 2 off 3 modo dormir 4- bajar intensidad. hasta ahi esta perfecto lo que no logro es que la lampara prenda un 100%. ni bien lo solucione lo subo. saludos
 
#5
Me parece vacan, pero seria bueno que lo subieras parte de tu código para poder ayudar en algo, ya sera en la recepción de la señal IR o en activación del triac, bueno como dije sube parte de tu código y ya veremos. :)
 
#6
Hola, me pudieras ayudar, nesecito controlar la velocidad de 2 motores de ac, me servira este codigo pienso usar el pic 16f877a
 
#7
Que tal , me pareció muy interestante tu post, y me gustaria probarlo en fisico con un pic16f887 pero tengo algunas dudas, como que pones
output_high(GP0); //Se desbordó el TIMER1 y pongo en "0" el gate del triac
yo siento que eso lo pondria en alto osea en "1" aunque no se como tengas el diagrama, asi como unas variables que nunk usas como el del control remoto y el reset, o por ejemplo el detector de cruce por cero lo pones en el pin A2 pero en el codigo no veo donde lo usas, me imagino que es la interrupcion del RB0, por eso me gustaria si pudieras compartirme tu diagrama de proteus, espero no sea mucha molestia, gracias, :)
 
#8
Si colega tengo que admitirlo que fue un error de tipeo, se pon en "uno" y lo del control remoto lo puse porque ese es mi siguiente paso, aún no lo e implementado, con respecto al diagrama no se que es lo que pasa con mi compu que no me permite subir imagenes, en cuanto arregle el problema lo haré :).
 
#9
Alguien ya probo el codigo y podria decirme que tal funciona por favor. O no se si pueden poner algunas modificaciones que le hicieron al mismo para que quedara mejorado... :apreton:
 
#10
:aplauso:


Vicbrother vicvicvicvicvic..

Código:
            #include "16f877a.h"
            #device ADC=8 
            #fuses XT,NOWDT,NOPROTECT,NOLVP,NODEBUG 
            #use delay(clock=4000000) 
            #define Pulse PIN_C0             //aquí manda pulso disparo al triac 
            
            int flag=0;                      //#include 
               
            #int_ext 
            void ext_isr()
            { flag=1; } 
            
            void main() 
            { 
            BYTE i, j, address, value;
            int16 q, q1; 
            int16 retardo=0,data=200; 
            float p; q1=0; 
            
            output_low(Pulse);
            setup_adc_ports(AN0); 
            setup_adc(ADC_CLOCK_INTERNAL); 
            set_adc_channel(0); 
            ext_int_edge(0,L_TO_H); 
            enable_interrupts(INT_EXT); 
            enable_interrupts(GLOBAL); 
            
            do
            {
            if(flag)
            { 
            data=read_adc();
            retardo=(int16)(255-data)*32; 
            delay_us(retardo); 
            output_high(Pulse); 
            delay_us(40); 
            output_low(Pulse); 
            flag=0; 
            } 
            }while (TRUE); 
            }

Aqui esta el diagrama..
 

Adjuntos

Última edición por un moderador:
#11
Me parece interesante amiguita, lo isiste super, lo probe en software y si me simula OK pero yo creo que el PIC que utilizas es mucho oara esta aplicaciòn, y seria mejor no usar un POT ya que un POT, un diac, un triac, etc seria una soluciòn mas facil. pero de todas maneras bien con el aporte. Besos.
 
#12
Oye, realizaste algunas modificaciones al dimmer que tienes publicado aqui, lo que pasa es que no logro hacer que encienda al 100% ni que baje al 0%, hablo del programa que tines al inicio de este post. gracias..
 
#13
yo tengo uno igual con el pic12675 pero no logro que funcione el led parpadea y el foco queda prendido aveces pienso que podria ser el receptor de IR o el Triac pero aun no se que puede ser de verdad y uds alguno le ha pasado esto? y lo solucionaron?
 
#14
:unsure:

Mira pues yo te podria pasar el .Hex ya que el codigo ccs lo tengo en venta. Es un dimmer manejado con el control IR de tv que es ademas on-off y se puede programar para que se desactive una hora despues de presionar el pulsador off.

O en otro caso pon tu codigo y te puedo ayudar a solucionar tu problema.

Algo mas, lo de mariacontenis es por el nobre de la banda de rock. Aclaro por que alguien ya me hecho flores.
 
Última edición:
#15
yo tengo uno igual con el pic12675 pero no logro que funcione el led parpadea y el foco queda prendido aveces pienso que podria ser el receptor de IR o el Triac pero aun no se que puede ser de verdad y uds alguno le ha pasado esto? y lo solucionaron?
Puede ser que la fuente capacitiva no le entregue suficiente corriente al circuito, a mi me habia pasado.
 
#18
Tienes que publicar tu diagrama ara poder ayudarte, el cruce por cero si resulta bien con una resistencia de 1M pero es necesario saber como configuras tu salida de potencia con el triac, o el tipo de optoacopldor que usas, ahi puede estar la clave si no es que quien realiza mal la funcion del cruce por cero es tu software. ;)
 

Temas similares

Arriba