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




 

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

Lascia un commento

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