Come leggere i dati dal sensore DHT11 senza usare una libreria

Il sensore di temperatura e umidità DHT11 è uno tra i più popolari nei progetti Arduino quando è necessario acquisire un valore di temperatura e di umidità. Solitamente per leggere i dati da questo sensore viene utilizzata una libreria che permette con poche linee di codice di ottenere il dato di temperatura e dell’umidità.

Esistono numerosi tutorial che mostrano come impiegare queste librerie, in questo articolo cercheremo di capire invece, come leggere i dati del sensore DHT11 utilizzando direttamente le funzioni di Arduino UNO.

Nello schema seguente potete osservare i collegamenti che ho effettuato tra la UNO e il sensore DHT11

Arduino UNO collegamenti DHT11

Come si può notare i dati vengono ricevuti e trasmessi impiegando un solo filo.

Per prima cosa controlliamo nel datasheet del DHT11 come avviene lo scambio dei dati tra il microcontrollore e il sensore.

Sapendo che i dati transitano su un singolo filo dobbiamo utilizzare una porta digitale della UNO impostandola primariamente come uscita, per inviare la richiesta di acquisizione dati al sensore, secondariamente come ingresso, per ricevere i dati provenienti dal sensore.

Leggendo il datasheet notiamo che per ricevere dati dal sensore DHT11 è necessario inviargli un segnale digitale rispettando determinati tempi tra un livello logico basso ed uno alto; analizziamo nel dettaglio come sono composti questi segnali.

Una volta alimentato il sensore DHT11, questo si pone, dopo circa 1 secondo, in attesa di ricevere un comando. Avendo inserito una resistenza di pull-up, sulla linea dati sarà presente un segnale logico alto.

Per avviare la trasmissione dei dati dobbiamo mettere (tramite la porta della scheda UNO) la linea dati al livello logico basso per almeno 18 ms, e successivamente metterla nuovamente a livello logico alto, come visibile nel diagramma seguente:

invio sequenza di start al dht11

In questa fase dobbiamo configurare la porta digitale come un ingresso. Infatti il sensore risponderà mettendo la linea dati a livello logico basso per 80 microsecondi per poi tenerla a livello alto per altri 80 microsecondi:

dht11 start sequence

ora il sensore invierà al microcontrollore 40 bit di dati composti in questo modo, il bit a livello basso sarà composto da un livello logico basso di 50 us seguito da un livello logico alto di circa 27 us, mentre un bit a livello alto sarà composto da un segnale di livello basso per 50 us seguito da un livello logico alto per 70 us.

dht11 send data

Quindi riepilogando avremmo una sequenza di trasmissione di questo tipo:

dht11 signal diagram

I 40 bit trasmessi sono suddivisi in questo modo:

DHT11 Struttura dati

I primi 8 bit contengono il valore intero del dato di umidità, i seguenti 8 bit contengono il valore decimale del dato di umidità, i successivi 8 bit contengono il valore intero del dato di temperatura, i seguenti 8 bit contengono il valore decimale del dato di temperatura. Gli ultimi 8 bit contengono il valore di CRC.

Il codice seguente permette di acquisire il dato di umidità e di temperatura. I commenti nel codice spiegano in dettaglio le istruzioni utilizzate:

Questo semplice codice ha permesso di capire come acquisiere ed elaborare i dati inviati dal sensore dht11.