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