Schema con Microcontrollore Utile a Mantenere la Luminosità Costante in una Stanza Variando la Luminosità di alcuni LED…
INTRO
Il seguente schema realizza il controllo PWM di un gruppo di LED o di un faretto LED in modo tale da mantenere sempre costante la luminosità di una stanza. Se vi è la luce solare il PWM che controlla i LED è al minimo o spento del tutto, se invece non vi è il sole il PWM sarà regolato in modo tale da avere la luminosità desiderata.
Il sistema quindi regola il PWM in funziona della luminosità ambientale per avere la luminosità desiderata.
Il sistema ha anche un pulsante per accendere o spegnere la luce.
Con una modifica, il sistema può anche controllare luci a 230V.
CODICE
Il codice è il seguente:
char value; //valore per variare il pwm
bit on; //variabile on off
unsigned int luminosita, set; //valori da convertire
void EXT_INT() iv 0x0008 ics ICS_AUTO { //Interrupt accensione spegnimento
on = ~ on; //Spegni se acceso o viceversa
if(!on){
CCP1CON = 0b00000000; //Spegni PWM
PORTC.F2 = 0; //Spegni LED%
}
else CCP1CON = 0b00001100; //se on=1 accendi PWM
Delay_ms(100); //Delay anti-rimbalzo
INTCON.INT0IF = 0; //reset del flag int0
}
void main() {
TRISC.F2 = 0; //uscita pwm portc2
PORTC.F2 = 1; //uscita pwm attiva
TRISB.F0=1; //Ingresso switch
TRISB.F1=0; //Ingresso switch
RCON.IPEN = 0; //disabilito la priorità degli interrupt
INTCON.GIE = 1; //attivo gli interrupt
INTCON2.INTEDG0 = 1; //interrupt sul fronte di salita int0
INTCON.INT0IE = 1;
PR2 = 125; //valore per garantire una frequenza di 20KHZ del pwm
T2CON = 0b00000100; //setting tmr2: postascaler 1:1, tmr2 on, prescaler 1:1
CCPR1L = value; //valore affinchè DC=1 ccpr1l=0001100 ccp1con=0011...
CCP1CON = 0b00001100; //utilizza pwm e setta il valore di comparazione con i due lsb = 11
adc_INIT(); //inizializza l'ADC
on = 1; //Accendi controllo
while(1){
if(on){ //Controlla se il sistema è acceso
luminosita = ADC_Read(0); //Converti la partizione dell'uscita
set = ADC_Read(1); //Converti la partizione dell'uscita
if(luminosita < (set-1) && value > 0){ //se il DC non è massimo e luminosita
value--; //è minore del valore di setting aumenta il DC
CCP1CON = 0b00001100; //Riattiva PWM se spento
}
if(luminosita > (set+1)){ //Se luminosita maggiore del valore di setting
if(value < 125) value++; //Se il DC non è massimo incrementa DC
if(value == 125){ //Se DC massimo ma luminosità < set
CCP1CON = 0b00000000; //Spegni PWM
PORTC.F2 = 1; //Mantieni DC=100%
}
}
CCPR1L = value; //inserisci il valore per variare il DC
}
}
}
//Ricordare che la tensione ai capi della fotoresistenza è inversamente
//proporzionale alla luminosità