TERMOSTATO CON LCD

NE555   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:

NE555

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.

NE555

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



 

1488 Visite totali 18 Visite di oggi
TERMOSTATO CON LCD ultima modifica: 2017-02-24T13:12:01+00:00 da ne555

Lascia un commento

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