# Dimmer digital --> PIC 12F675



## wilfretronic (Ene 31, 2011)

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.


```
#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.


----------



## shala (Mar 30, 2011)

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


----------



## wilfretronic (Abr 4, 2011)

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.


----------



## rascueso (Abr 4, 2011)

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


----------



## wilfretronic (Abr 6, 2011)

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.


----------



## Haks (May 5, 2011)

Hola, me pudieras ayudar, nesecito controlar la velocidad de 2 motores de ac, me servira este codigo pienso usar el pic 16f877a


----------



## Pepenavas (May 19, 2011)

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,


----------



## wilfretronic (May 20, 2011)

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é .


----------



## mariacontenis (Jun 16, 2011)

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...


----------



## mariacontenis (Jun 20, 2011)

Vicbrother vicvicvicvicvic..


```
#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..


----------



## wilfretronic (Jun 26, 2011)

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.


----------



## mariacontenis (Jun 30, 2011)

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..


----------



## panxulitho (Oct 13, 2011)

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?


----------



## mariacontenis (Oct 13, 2011)

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.


----------



## biker2k3 (Oct 13, 2011)

panxulitho dijo:


> 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.


----------



## panxulitho (Oct 14, 2011)

biker2k3 dijo:


> Puede ser que la fuente capacitiva no le entregue suficiente corriente al circuito, a mi me habia pasado.



pero este pasa directamente a los 220v pasa por una resistencia de 1M y diodo zener que estabilizan la corriente para el pic pero como podria solucionar ese problema? el foco queda prendido y el led tbn


----------



## biker2k3 (Oct 15, 2011)

panxulitho dijo:


> pero este pasa directamente a los 220v pasa por una resistencia de 1M y diodo zener que estabilizan la corriente para el pic pero como podria solucionar ese problema? el foco queda prendido y el led tbn



Proba publicando el circuito a ver si vemos algo mal


----------



## mariacontenis (Oct 15, 2011)

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.


----------



## panxulitho (Oct 16, 2011)

ahy unos componentes que cambie como el TSOP y el triac


----------



## rascueso (Oct 16, 2011)

yo lo tengo andando perfecto a ese panxulitho


----------



## panxulitho (Oct 16, 2011)

rascueso dijo:


> yo lo tengo andando perfecto a ese panxulitho



y por que no me funca!  tengo el mente el modulo receptor ya que no use el mismo pero aun nose como poder hacerlo funcionar


----------



## biker2k3 (Oct 17, 2011)

panxulitho dijo:


> y por que no me funca!  tengo el mente el modulo receptor ya que no use el mismo pero aun nose como poder hacerlo funcionar



Fijate si el modulo receptor es el TSOP1738 y va conectado asi..
Visto de frente tenes las patitas asi   1-2---3   la 1 va a masa, entre 1 y 2 va un capacitor de 4.7uf, y a la tercera es la salida y  le podes poner una resistencia de 10k a positivo. A y de la 2 a positivo una de 470 Ohms


----------



## mariacontenis (Oct 17, 2011)

Bien pues este es el diagrama en proteus que yo implemento y todo esta bien, espero te sirva.


----------



## wilfretronic (Ene 7, 2012)

Mis amigos del foro, tengo un versión mejorada del código propuesto en esta linea del Dimmer electrónico, aca les dejo el link para que puedan acceder a él.

https://www.forosdeelectronica.com/f24/dimmer-electronico-control-remoto-pic-12f675-68586/


----------



## hypnos00 (May 21, 2012)

mariacontenis dijo:


> Vicbrother vicvicvicvicvic..
> 
> 
> ```
> ...



saludos, eso d elso timers e interrupciones no se me da aun me falata comprenderlo queria ver si de favor me lo explicas un poco mas tu diseño ya que quiero hacer elc ontrol de una resistencia termica te agradezco el dato


----------



## HeroicLegend (Dic 3, 2016)

Hola. Una pregunta...
Si trato de ingresar al LCD para que me  imprima el voltaje que va teniendo el foco...
¿Cómo lo podría poner? Porque tengo mi código en C y el voltaje se quedó estable, es decir,  no baja ni sube.

Encontré la programación de @mariacontenis y pues pasó lo mismo.

```
#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); 
            }
```


----------



## ruben90 (Dic 3, 2016)

Debes ingresarla dentro de la rutina *do while*. Pero desconozco como se hace en CCS, yo utilizó otro compilador.

En mikroC, el cuál utilizó, primero declaró la librería (asignó pines, inició librería y limpió la pantalla). Luego, sí la información a mostrar es numérica del tipo int, short, float, etc., debo transformarla a tipo string y luego la muestro en pantalla.

Y Listo!.


```
//Declaró terminales de salida para el LCD.

int número=0; //variable númerica,
char texto[20];//variable string.
void main() {
Lcd_Init(); //Inicia librería, obvio.
Lcd_Cmd(_LCD_CLEAR); //Limpió pantalla.
do {
IntToStr(número, texto); //Convierte variable numérica a string.
//Lcd_Out(1,1, texto); //Muestra texto por display LCD.
} while(1); //bucle infinito.
}
```


----------



## technique (Jul 31, 2018)

Buenas tardes estimados...
estoy haciendo este proyecto, pero tengo un inconveniente.
ya no encuentro los controles remoto antiguos..
talvez saben como hacer una copia de control remoto rc5.,
Estaba pensando en un circuito que "aprenda" los códigos, para luego transmitirlos, 
por ejemplo, que se memorice el código de cualquier tecla de un control remoto comercial, y luego con 4 botones, sacar esos códigos en un led ir.
para hacernos nuestros propios controles remoto.
Por favor si tienen  algo así, podrían compartirlo.
gracias


----------

