hola si tienes problema con la lampara te aconsejaria en vez de un rel un cto implementado con un moc y un triac, eso si la lampara es de ac, si es de dc estaria bien un simple cto con un transistor Tip35 o cualquier npn tipo tip
aqui te adjunto un programa sencillo que se encarga de establecer un pwm y tomar un dato necesitaria unas simples modificaciones para que te sea util, este es la base de un programa que utilize para hacer un control de luminosidad, mucha suerte
este es el .c
#include <LCD.C>
#include <STDLIB.H>
#define ADC=8
#define pulsador1 input(pin_e2)
#define pulsador2 input(pin_e1)
int dato_recibido=50;
unsigned int contador=0,a=5;
#int_RDA
RDA_isr()
{
dato_recibido=getc();
}
#int_TIMER2
TIMER2_isr()
{
/*PWM con timer 2
este PWM es utilizado para para dar un rango de luminosidad al bombillo de 0 a 100
y funciona perfectamene lo unico que tienes que actualizar es la variable "a"
que es la que da el valor del duty.
la entrada del adc es por el canal 5
solo tendria que ver que operacion hacer con valor(vble que toma el dato del adc), para luego elegir el valor de a
*/
contador++;
if(contador==100)
{
contador=0;
}
if(contador<=a)
{
output_high(pin_a2);
}
else if(contador>a)
{
output_low(pin_a2);
}
}
void main()
{
unsigned int valor;
int error;
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(5);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_4,200,1);
enable_interrupts(INT_RDA);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
lcd_init();
output_low(pin_d3);
for(;
{
read_adc(ADC_START_ONLY);
delay_us(500);
valor=read_adc(ADC_READ_ONLY);
}
}
este es el .h
#include <16F877.h>
#device adc=8
#use delay(clock=20000000)
#fuses NOWDT,XT, NOPUT, NOPROTECT, BROWNOUT, LVP, NOCPD, NOWRT, NODEBUG
#use rs232(baud=4800,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)