TEMPERATURA E UMIDITÀ SU LCD CON DHT11

Schema per Misurare e Visualizzare su LCD Temperatura e Umidità utilizzando il Sensore DHT11…

 

 

 

 




 

INTRO

Il sensore DHT11 serve per misurare in modo digitale la temperatura e l’umidità. Digitale significa che dispone di un ADC interno che converte i segnali e quindi invia i segnali in modo digitali in uscita.

Il sistema presentato dispone di un microcontrollore che legge i dati del sensore, li elabora e invia i segnali di controllo al display LCD mostrando temperatura e umidità.

Il range di misura della umidità va da un minimo di 20%RH ad un massimo di 90%RH con una risoluzione di 1% che vuol dire che il sensore non discrimina variazioni minori dell’1% di RH. L’accuratezza è pari a 4%RH, quindi il sensore potrebbe sbagliare di questo valore sia in positivo che in negativo e inoltre se vi è una variazione brusca di umidità il sensore impiega 10 secondi circa per rilevarla.

Per quanto riguarda la temperatura il range di misura va bene sono per temperature positive e inferiori a 50°C con una risoluzione di 1°C e tempo per rilevare le variazioni brusche di temperature di 13 secondi circa.

 




 

CODICE

Il codice è il seguente:

#define DHT11_dir TRISB.F0 //Connessione DHT11 #define DHT11_dat PORTB.F0 sbit LCD_RS at RB2_bit; //Connessione LCD sbit LCD_EN at RB3_bit; sbit LCD_D4 at RB4_bit; sbit LCD_D5 at RB5_bit; sbit LCD_D6 at RB6_bit; sbit LCD_D7 at RB7_bit; sbit LCD_RS_Direction at TRISB2_bit; sbit LCD_EN_Direction at TRISB3_bit; sbit LCD_D4_Direction at TRISB4_bit; sbit LCD_D5_Direction at TRISB5_bit; sbit LCD_D6_Direction at TRISB6_bit; sbit LCD_D7_Direction at TRISB7_bit; unsigned char Check, T_byte1, T_byte2, //Variabili RH_byte1, RH_byte2, Ch; unsigned Temp, RH, Sum ;  void StartSignal(){ //Sottoprogramma avvio com  DHT11_dir = 0; //Config come uscita  DHT11_dat = 0; //Porta a livello basso  delay_ms(18); //Aspetta 18ms  DHT11_dat = 1; //porta a livello alto  delay_us(30); //Aspetta 30ms  DHT11_dir = 1; //Configura come uscita } void CheckResponse(){ //Sottoprogramma rileva risposta  Check = 0;  delay_us(40); //Aspetta 40uS  if (DHT11_dat == 0){ //Se DHT11_dat = 0  delay_us(80); //Aspetta altri 80us  while (DHT11_dat == 1); //Aspetta la fine del livello alto  Check = 1; //Check avvenuto (80us low, 80us high)  } } char ReadData(){ //Sottoprogramma lettura dati  unsigned char i, j = 0; //Inizializza due variabili a 0  for(j = 0; j < 8; j++){ //8 bit, quindi ripeti 8 volte  i <<= 1; //Shifta i  while(!DHT11_dat); //Aspetta che DHT11_dat sia alto  delay_us(24); //Aspetta 28us, tempo che indica 0 logico  if(DHT11_dat == 1) i |= 1; //set bit 7-j DHT11_dat = 1  while(DHT11_dat); //Aspetta che DHT11_dat ritorni 0  }  return i; //Ritorna } void main() { //Programma principale  Lcd_Init(); //Inizializza LCD  Lcd_Cmd(_LCD_CURSOR_OFF); //Spegni cursore  Lcd_Cmd(_LCD_CLEAR); //pulisci LCD  while(1){ //Ciclo infinito  StartSignal(); //Invia segnale di partenza  CheckResponse(); //Verifica la risposta del sensore  if(Check == 1){ //Se la risposta è positiva  RH_byte1 = ReadData(); //Leggi i 5 Byte del sensore  RH_byte2 = ReadData();  T_byte1 = ReadData();  T_byte2 = ReadData();  Sum = ReadData();  if(Sum == RH_byte1+RH_byte2+T_byte1+T_byte2){  Temp = T_byte1;  RH = RH_byte1; //Se la lettura è corretta  Lcd_Out(1, 6, "Temp: C"); //Visualizza a schermo i valori  Lcd_Out(2, 2, " Humidity: %");  LCD_Chr(1, 12, 48 + ((Temp / 10) % 10));  LCD_Chr(1, 13, 48 + (Temp % 10));  LCD_Chr(1, 14, 223);  LCD_Chr(2, 12, 48 + ((RH / 10) % 10));  LCD_Chr(2, 13, 48 + (RH % 10));  }  else{ //Se il Checksum è fallito  Lcd_Cmd(_LCD_CURSOR_OFF);  Lcd_Cmd(_LCD_CLEAR);  Lcd_Out(1, 1, "Errore"); //Mostra errore di checksum  Lcd_Out(2, 1, "di checksum");  }  }  else { //Se il sensore non risponde  Lcd_Out(1, 3, "No risposta"); //Mostra le seguenti stringhe  Lcd_Out(2, 1, "dal sensore");  }  delay_ms(1000); //Ripeti lettura ogni secondo  } } 

Prima di tutto si vanno a definire le connessioni del DHT11 e del display LCD, poi si vanno a definire le variabili e si inizializzano alcune sottofunzioni utili al funzionamento del codice.

La prima è “StartSignal” che configura l’uscita per il sensore e invia il segnale di start della comunicazione. “CheckResponse” verifica se il segnale è stato inviato dal DHT11. “ReadData” è la sottofunzione usata per leggere i dati ricevuta dal DHT11.

Nel programma principale Viene inizializzato LCD e nel ciclo infinito si va inviare il segnale di start, si aspetta la risposta e se arriva una risposta si vanno a leggere i dati di umidità e temperatura, inoltre si legge il dato di controllo. Se il dato di controllo è uguale alla somma dei dati di umidità e temperatura allora i dati ricevuti sono corretti e si va a visualizzare la temperatura e umidità sul display LCD oltre che visualizzare le scritte “TEMP °C” e “Humidity %”

Se la somma dei dati non è uguale al dato di controllo allora vi è un errore del sensore e della trasmissione, e in particolare l’errore viene indicato a schermo. Se invece la sottofunzione “CheckResponse” non ha dato esito positivo viene mostrato a schermo una stringa che indica l’errore del sensore.

Si va a leggere il valore del sensore ogni secondo.
 

SCHEMA

Lo schema è il seguente:

La tensione di alimentazione è 5V stabilizzati o filtrati a basso ripple con un assorbimento di circa 100mA al massimo. Il sensore DHT11, microcontrollore e LCD vengono alimentati direttamente dai 5V. C3 fa da ulteriore filtro.

Il microcontrollore ha la tensione di alimentazione connessa con il positivo al pin 20 e il negativo ai pin 19 e 8. Il circuito di oscillazione è composto da C1, C2 e X1 e si usa una frequenza di oscillazione a 4MHz. Il microcontrollore viene mantenuto non resettato grazie a R2.

Il bus dati del DHT11 ha una resistenza di Pull-up da 4.7KOhm ed è connesso a RB0.

Il display LCD è connesso alle porte PB2, PB3, PB4, PB5, PB6 e PB7 rispettivamente a RS, E, D4, D5, D6 e D7 mentre al pin VEE è connessa l’uscita di un potenziometro per regolare il contrasto e gli altri pin sono connessi a massa.  La retroilluminazione è connessa a 5V con una resistenza di protezione da 470 Ohm.

Lo schema montato su breadboard è il seguente:


 

DOWNLOAD

Potete scaricare la simulazione del circuito con PROTEUS e il codice con MIKROC al seguente LINK!!!




 

1422 Visite totali 7 Visite di oggi
TEMPERATURA E UMIDITÀ SU LCD CON DHT11 ultima modifica: 2017-07-26T16:28:55+00:00 da ne555

Lascia un commento

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