TERMOSTATO CON LCD

Schema per Realizzare un Termostato per Ambiente con Visualizzazione LCD e Tasti di Controllo…


 
 
 
 




 

INTRO

Il seguente schema serve per realizzare un termostato che chiude il contatto di un relè quando la temperatura è minore di una certa soglia. La soglia viene variata grazie a due pulsanti e inoltre sia la soglia che la temperatura vengono mostrate un un display LCD. In questo caso il circuito è tarato per il range di temperature 10-30 gradi centigradi, ma variando una costante nel codice si può variare il range. Visto che si usa un LM35 come sensore di temperatura, la temperatura massima è 150 gradi centigradi. Il circuito utilizza un microcontrollore per la lettura del sensore e per la visualizzazione delle temperature.

 




 

CODICE

Il codice è il seguente:

sbit LCD_RS at RC0_bit;                     // Configurazione Pin I/O
sbit LCD_EN at RC1_bit;                     //Indico alla libreria
sbit LCD_D4 at RC2_bit;                     //come è connesso l'LCD
sbit LCD_D5 at RC3_bit;
sbit LCD_D6 at RC4_bit;
sbit LCD_D7 at RC5_bit;

sbit LCD_RS_Direction at TRISC0_bit;        //Indico se ho ingressi o uscite
sbit LCD_EN_Direction at TRISC1_bit;
sbit LCD_D4_Direction at TRISC2_bit;
sbit LCD_D5_Direction at TRISC3_bit;
sbit LCD_D6_Direction at TRISC4_bit;
sbit LCD_D7_Direction at TRISC5_bit;

unsigned int short adcvalue;              //Variabile valore uscita da ADC
unsigned short int Tem1, Set_Temp;        //Variabile temperatura e settaggio
float Tem;                                //Valore convertito della temperatura
char Text[7];                             //Stringa contenente la temperatura
bit flag;

void print_temp(char text){        //Sottoprogramma per la visualizzazione della temperatura
  Lcd_Cmd(_LCD_SECOND_ROW);         //invia cursore sulla seconda riga
  Lcd_Out_Cp(text);                 //scrivi la parte intera della temperatura
  Lcd_Chr_Cp(223);                  //codice per scrivere il simbolo di grado °
  Lcd_Chr_Cp('C');                  //scrivi C
}

void EXT_INT() iv 0x0008 ics ICS_AUTO {    //0018h per bassa priorità, 0008h per alta priorità

 if(PORTB.B0==1){                          //Controllo tasto incremento
   if(Set_Temp < 30) Set_Temp ++;
 }
 else {                                    //Controllo tasto decremento
   if(Set_Temp > 0) Set_Temp --;
 }

 EEPROM_Write(0x00, Set_Temp);             //Salva valore su memoria
 Delay_ms(50);                             //Ciclo antirimbalzo


 INTCON.INT0IF = 0;                        //reset del flag int0
 INTCON3.INT1IF = 0;                       //reset del flag int1
}


void main(){                        //Programma principale

  Lcd_Init();                       // Initializza LCD
  Lcd_Cmd(_LCD_CLEAR);              // Pulisci LCD
  Lcd_Cmd(_LCD_CURSOR_OFF);         // Cursore non visibile

  ADC_Init();                       // Initializza il modulo ADC con valori di default

  TRISB.B0 = 1;                     //pin di ingresso per pulsante + set temp
  TRISB.B1 = 1;                     //pin di ingresso per pulsante - set temp
  TRISC.B7 = 0;                     //Uscita relè

  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;

  INTCON2.INTEDG1 = 1;              //interrupt sul fronte di salita  int1
  INTCON3.INT1IE = 1;

  Set_Temp = EEPROM_Read(0x00);     //Leggi valore su memoria

  while(1){                         //Ciclo infinito

    adcvalue = ADC_Get_Sample(0);      //Lettura da ADC
    Tem = 0.48828 * adcvalue;          //Conversione da Byte a Decimale
    Tem1 = Tem;                        //conversione in intero
    
    if (Tem1 < Set_Temp) PORTC.F7 = 1; //chiusura e apertura relè
     else PORTC.B7 = 0;

    IntToStr( Tem1, Text );            //conversione in stringa
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Cmd(_LCD_FIRST_ROW);           //invia cursore sulla PRIMA riga
    Lcd_Out_Cp("TEMPERATURA:");
    print_temp(text);                  //Invia i valori da visualizzare al sottoprogramma

    delay_ms(600);                     //Ritardo visualizzazione temperatura

    IntToStr(Set_Temp, Text );         //conversione in stringa
    Lcd_Cmd(_LCD_CLEAR);
    Lcd_Cmd(_LCD_FIRST_ROW);           //invia cursore sulla PRIMA riga
    Lcd_Out_Cp("SET TEMPERATURA:");
    print_temp(text);                  //Invia i valori da visualizzare al sottoprogramma

    delay_ms(1000);
  }
}

Prima di tutto nel codice bisogna inizializzare l’LCD e le variabili necessarie per il programma. Poi si crea una sotto porzione di codice per pilotare l’LCD, questa sotto funzione (print_temp) riceve una stringa che contiene il dato di temperatura e vi aggiunge “°C”.

Dopo di che vi è una routine di interrupt che controlla quale tasto è stato premuto e modifica la soglia del termostato, inoltre la memorizza nella memoria permanente per evitare che in caso di reset la soglia cambi.

Nel programma principale si inizializza LCD, ingressi e uscite, ADC e Interrupt e si legge dalla memoria un eventuale soglia salvata. Nel programma principale vi è un ciclo infinito che legge il valore del sensore, lo converte e in base ad esso accende o spegne il relè. Inoltre si converte il valore della temperatura in stringa e si visualizza sul display LCD prima la stringa della temperatura e poi quella della soglia.
 
SCHEMA

Lo schema è il seguente:

Il sensore LM35 è alimentato con una tensione di 5V e l’uscita del sensore è connesso al PIN2 che è il primo canale dell’ADC. Il PIN1 bisogna portare un livello logico alto per evitare che il PIC18F252 si resetti, questo viene fatto con una resistenza di pull-up da 10KΩ. Il circuito di oscillazione è composto dal risuonatore al quarzo X1 e dai condensatori C1 e C2.

La resistenza variabile RV1 serve per la regolazione del contrasto dell’LCD che viene alimentato anch’esso a 5V. Nello schema manca l’alimentazione della retroilluminazione dell’LCD che viene fatta collegano il catodo a massa e l’anodo a VCC interponendo però una resistenza da 470Ω.

Il PIC18F252 viene alimentato a 5V collegando i PIN8 e PIN19 a massa e il PIN20 a VCC. I tasti hanno una resistenza di pull-up ciascuno e sono R3 e R2.

Infine il relè viene controllato grazie a R4, Q1 e il diodo 1N4001 che fungono da amplificatore di corrente per la bobina del relè.

 

DOWNLOAD

Potete scaricare la simulazione del circuito con PROTEUS al seguente LINK!!!



 

[Voti Totali: 0 Media Voti: 0]
Segui la Nostra Pagina Facebook: Facebook

2 pensieri su “TERMOSTATO CON LCD

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *