- DHT11 - Specifiche e funzionamento
- Comunicazione con il sensore DHT11
- Componenti necessari
- Schematico
- DHT11 con spiegazione del codice PIC MPLABX
La misurazione della temperatura e dell'umidità è spesso utile in molte applicazioni come automazione domestica, monitoraggio ambientale, stazione meteorologica, ecc. Pi e molte altre schede di sviluppo. In questo articolo, impareremo come interfacciare questo DHT11 con PIC16F87A che è un microcontrollore PIC a 8 bit. Useremo questo microcontrollore per leggere i valori di temperatura e umidità utilizzando DHT11 e visualizzarli su un display LCD. Se sei completamente nuovo nell'uso dei microcontrollori PIC puoi utilizzare la nostra serie di tutorial PIC per imparare a programmare e utilizzare il microcontrollore PIC, detto questo, iniziamo.
DHT11 - Specifiche e funzionamento
Il sensore DHT11 è disponibile sotto forma di modulo o sotto forma di sensore. In questo tutorial stiamo usando il sensore, l'unica differenza tra i due è che in forma di modulo il sensore ha un condensatore di filtraggio e un resistore di pull-up collegato al pin di uscita del sensore. Quindi, se stai usando il modulo, non è necessario aggiungerli esternamente. Di seguito è mostrato il DHT11 sotto forma di sensore.
Il sensore DHT11 viene fornito con un involucro di colore blu o bianco. All'interno di questo involucro, abbiamo due componenti importanti che ci aiutano a rilevare l'umidità relativa e la temperatura. Il primo componente è una coppia di elettrodi; la resistenza elettrica tra questi due elettrodi è determinata da un substrato che trattiene l'umidità. Quindi la resistenza misurata è inversamente proporzionale all'umidità relativa dell'ambiente. Maggiore è l'umidità relativa minore sarà il valore di resistenza e viceversa. Inoltre, notare che l'umidità relativa è diversa dall'umidità effettiva. L'umidità relativa misura il contenuto di acqua nell'aria rispetto alla temperatura nell'aria.
L'altro componente è un termistore NTC a montaggio superficiale. Il termine NTC sta per il coefficiente di temperatura negativo, per l'aumento della temperatura il valore della resistenza diminuirà. L'uscita del sensore è calibrata in fabbrica e quindi come programmatori non dobbiamo preoccuparci di calibrare il sensore. L'uscita del sensore data dalla comunicazione 1-Wire, vediamo il pin e lo schema di collegamento di questo sensore.
Il prodotto è in un pacchetto a fila singola a 4 pin. Il primo pin è collegato al VDD e il quarto pin è collegato al GND. Il 2 ° pin è il pin dati, utilizzato per scopi di comunicazione. Questo pin dati necessita di una resistenza pull-up di 5k. Tuttavia, possono essere utilizzati anche altri resistori di pull-up come da 4.7k a 10k. Il 3 ° pin non è collegato a nulla. Quindi viene ignorato.
La scheda tecnica fornisce le specifiche tecniche e le informazioni sull'interfaccia che possono essere visualizzate nella tabella sottostante-
La tabella sopra mostra l' intervallo e la precisione di misurazione della temperatura e dell'umidità. Può misurare la temperatura da 0-50 gradi Celsius con una precisione di +/- 2 gradi Celsius e l'umidità relativa dal 20-90% di umidità relativa con una precisione di +/- 5% di umidità relativa. La specifica dettagliata può essere vista nella tabella sottostante.
Comunicazione con il sensore DHT11
Come accennato in precedenza, per leggere i dati da DHT11 con PIC dobbiamo utilizzare il protocollo di comunicazione PIC one wire. I dettagli su come eseguire ciò possono essere compresi dallo schema di interfacciamento del DHT 11 che si trova nella sua scheda tecnica, lo stesso è riportato di seguito.
DHT11 necessita di un segnale di avvio dall'MCU per avviare la comunicazione. Pertanto, ogni volta che l'MCU deve inviare un segnale di avvio al sensore DHT11 per richiedergli di inviare i valori di temperatura e umidità. Dopo aver completato il segnale di avvio, il DHT11 invia un segnale di risposta che include le informazioni sulla temperatura e sull'umidità. La comunicazione dei dati avviene tramite il protocollo di comunicazione dati a bus singolo. La lunghezza totale dei dati è di 40 bit e il sensore invia prima il bit di dati più alto.
A causa della resistenza pull-up, la linea dati rimane sempre al livello VCC durante la modalità inattiva. L'MCU deve abbassare questa tensione da alto a basso per un intervallo minimo di 18 ms. Durante questo periodo, il sensore DHT11 rileva il segnale di avvio e il microcontrollore rende alta la linea dati per 20-40us. Questo tempo di 20-40us è chiamato periodo di attesa in cui il DHT11 inizia alla risposta. Dopo questo periodo di attesa, DHT11 invia i dati all'unità microcontrollore.
Formato DATI del sensore DHT11
I dati sono costituiti da parti decimali e integrali combinate insieme. Il sensore segue il formato dati seguente:
Dati RH integrali a 8 bit + dati RH decimali a 8 bit + dati T integrali a 8 bit + dati T decimali a 8 bit + checksum a 8 bit.
È possibile verificare i dati controllando il valore di checksum con i dati ricevuti. Questo può essere fatto perché, se tutto è corretto e se il sensore ha trasmesso dati corretti, il checksum dovrebbe essere la somma di "dati RH integrale a 8 bit + dati RH decimale a 8 bit + dati T integrale a 8 bit + dati T decimale a 8 bit".
Componenti necessari
Per questo progetto, di seguito sono richieste le cose:
- Configurazione della programmazione del microcontrollore PIC (8 bit).
- Breadboard
- Alimentatore 5V 500mA.
- Resistore 4.7k 2 pezzi
- Resistenza da 1k
- PIC16F877A
- Cristallo da 20 mHz
- Condensatore 33pF 2 pz
- LCD 16x2 caratteri
- Sensore DHT11
- Cavi jumper
Schematico
Di seguito è riportato lo schema del circuito per l'interfacciamento di DHT11 con PIC16F877A.
Abbiamo utilizzato un LCD 16x2 per visualizzare i valori di temperatura e umidità che misuriamo da DHT11. L'LCD è interfacciato in modalità 4 fili e sia il sensore che l'LCD sono alimentati da un alimentatore esterno da 5V. Ho utilizzato una breadboard per effettuare tutti i collegamenti richiesti e ho utilizzato un adattatore 5V esterno. È inoltre possibile utilizzare questa scheda di alimentazione della breadboard per alimentare la scheda con 5V.
Una volta che il circuito è pronto, non ci resta che caricare il codice fornito in fondo a questa pagina e possiamo iniziare a leggere la temperatura e l'umidità come mostrato di seguito. Se vuoi sapere come è stato scritto il codice e come funziona leggi oltre. Inoltre potete trovare il funzionamento completo di questo progetto nel video fornito in fondo a questa pagina.
DHT11 con spiegazione del codice PIC MPLABX
Il codice è stato scritto utilizzando MPLABX IDE e compilato utilizzando il compilatore XC8, entrambi forniti da Microchip stesso ed è gratuito da scaricare e utilizzare. Fare riferimento ai tutorial di base per comprendere le basi della programmazione, di seguito vengono discusse solo le tre importanti funzioni richieste per la comunicazione con il sensore DHT11. Le funzioni sono:
void dht11_init (); void find_response (); char read_dht11 ();
La prima funzione è utilizzata per il segnale di avvio con dht11. Come discusso in precedenza, ogni comunicazione con DHT11 inizia con un segnale di avvio, qui la direzione del pin viene inizialmente cambiata per configurare il pin dati come uscita dal microcontrollore. Quindi la linea dati viene abbassata e continua ad aspettare i 18mS. Dopodiché di nuovo la linea è resa alta dal microcontrollore e continua ad aspettare fino a 30us. Dopo quel tempo di attesa, il pin dati impostato come input per il microcontrollore per ricevere i dati.
void dht11_init () { DHT11_Data_Pin_Direction = 0; // Configura RD0 come uscita DHT11_Data_Pin = 0; // RD0 invia 0 al sensore __delay_ms (18); DHT11_Data_Pin = 1; // RD0 invia 1 al sensore __delay_us (30); DHT11_Data_Pin_Direction = 1; // Configura RD0 come input }
La funzione successiva viene utilizzata per impostare un bit di controllo a seconda dello stato del pin dati. Viene utilizzato per rilevare la risposta dal sensore DHT11.
void find_response () { Check_bit = 0; __delay_us (40); if (DHT11_Data_Pin == 0) { __delay_us (80); if (DHT11_Data_Pin == 1) { Check_bit = 1; } __delay_us (50);} }
Infine la funzione di lettura dht11; qui i dati vengono letti in un formato a 8 bit in cui i dati vengono restituiti utilizzando l'operazione di spostamento dei bit a seconda dello stato del pin dati.
char read_dht11 () { char data, for_count; for (for_count = 0; for_count <8; for_count ++) { while (! DHT11_Data_Pin); __delay_us (30); if (DHT11_Data_Pin == 0) { data & = ~ (1 << (7 - for_count)); // Cancella bit (7-b) } else { data- = (1 << (7 - for_count)); // Imposta bit (7-b) while (DHT11_Data_Pin); } } restituire dati; }
Dopodiché, tutto viene eseguito nella funzione principale. Innanzitutto, l'inizializzazione del sistema viene eseguita dove viene inizializzato l'LCD e la direzione della porta dei pin LCD è impostata sull'uscita. L'applicazione è in esecuzione all'interno della funzione principale
void main () { system_init (); while (1) { __delay_ms (800); dht11_init (); find_response (); if (Check_bit == 1) { RH_byte_1 = read_dht11 (); RH_byte_2 = read_dht11 (); Temp_byte_1 = read_dht11 (); Temp_byte_2 = read_dht11 (); Somma = read_dht11 (); if (Somma == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Umidità = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((Umidità / 10)% 10)); lcd_data (48 + (Umidità% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Umidità:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } else { lcd_puts ("Errore di checksum"); } } altro { clear_screen (); lcd_com (0x80); lcd_puts ("Errore !!!"); lcd_com (0xC0); lcd_puts ("Nessuna risposta."); } __delay_ms (1000); } }
La comunicazione con il sensore DHT11 avviene all'interno del ciclo while dove il segnale di avvio viene inviato al sensore. Successivamente, viene attivata la funzione find_response . Se Check_bit è 1, viene eseguita l'ulteriore comunicazione altrimenti il display LCD mostrerà la finestra di dialogo di errore.
A seconda dei dati a 40 bit, read_dht11 viene chiamato 5 volte (5 volte x 8 bit) e memorizza i dati secondo il formato dati fornito nella scheda tecnica. Lo stato di checksum viene anche controllato e se vengono trovati errori, sarà anche informare sul display LCD. Infine, i dati vengono convertiti e trasmessi al display LCD a 16x2 caratteri.
Il codice completo per questa misurazione della temperatura e dell'umidità del PIC può essere scaricato da qui. Controlla anche il video dimostrativo fornito di seguito.
Spero che tu abbia capito il progetto e ti sia piaciuto costruire qualcosa di utile. Se hai domande, lasciale nella sezione commenti qui sotto o usa i nostri forum per altre domande tecniche.