DHT22

DHT 22

Il mio primo approccio con la stazione metereologica è stato con questo sensore DHT22.

È un sensore di temperatura e umidità molto facile da usare e abbastanza preciso (per la precisione voluta) dato il prezzo. Comunica solamente con 3 collegamenti totali senza problemi con la distanza.

Lo schema di collegamento è il seguente:

L'immagine è presa dalla rete. Si vede che i collegamenti sono semlicissimi, basta inserire una resistenza, come segnato, da 4,7kohm o 10kohm.

 

Il codice per iniziare può essere il seguente che interfaccia il sensore con un display lcd.

Il codice è stato preso da esempi in rete e poi successivamente modificato:

 


//Primo Test del sensore DHT22 con dispaly LCD 16x1 (che viene gestito come un 8x2)

#include <dht.h>   //includo la libreira per il sensore

#include <LiquidCrystal.h>    //includo la libreria per l'LCD

dht DHT;    //dichiaro una variabile globale per la classe del sensore

#define DHT22_PIN 8    //imposto il pin a cui è connesso il sensore

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);    //dichiaro la variabile lcd definendo i pin utilizzati

void setup()
{
   lcd.begin(16, 2); //inizializzo l'LCD
}

void loop()
{
  int chk = DHT.read22(DHT22_PIN);   //leggo dal sensore e ritorna un valore corrispondente all'andamento della lettura
 

  switch (chk)  //controllo
  {
     case 0: //valore di ritorno : 0 -> Lettura andata a buon fine


             lcd.setCursor(0,0);//stampo sull'lcd i dati letti
             lcd.print("T:");
             lcd.print(DHT.temperature,1);//scrivo il dato della temperatura, specificando che voglio un solo decimale
             lcd.print("C");
             lcd.setCursor(8,0);

             lcd.print("U:");
             lcd.print(DHT.humidity,1);//scrivo il dato dell'umiditò, specificando che voglio un solo decimale
             lcd.print("%");
        break;


     case -1: //valore di ritorno : -1 -> Sono stati letti dei dati, ma risultano corrotti

             lcd.print("Checksum error");
        break;

     case -2: //valore di ritorno : -2 -> Nessuna lettura effettuata, ho atteso troppo tempo

             lcd.print("Time out error");
        break;

     default: //qualsiasi altro valore di ritorno definisce un errore diverso

            lcd.print("Unknown error"); 
        break; 

  }
  delay(2000);   //attendo 2sec tra una lettura e l'altra. Dato che il DHT22 effettua una campionatura ogni 2sec
                       //non serve effettuare letture più rapide.
}

Successivamente, nel corso dell'inverno, mi sono accorto che non misurava le temperature sotto lo zero e restava bloccato apparentemente. Leggendo dalla seriale mi dava l'errore "Checksum error". Alquanto dispiaciuto mi sono chiesto perché visto che il sensore può leggere fino a -40°C. Andando a fondo del problema, ne è uscito che la libreria usata per il sensore non era scritta correttamente. facendo un po di ricerca ho trovato quella giusta su Adafruit. Ecco uno sketch di esempio preso dal sito per testare il sensore:

// Example testing sketch for various DHT humidity/temperature sensors

// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 2 // what pin we're connected to

#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

void setup() {

Serial.begin(9600);
Serial.println("DHTxx test!");

dht.begin();
}

void loop() {
// Wait a few seconds between measurements.
delay(2000);

// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius
float t = dht.readTemperature();

// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}

Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C ");
}

L'esempio completo lo potete trovare qui assieme alla libreria da aggiungere alla cartella di Arduino.
L'esempio qui sopra è un estratto dell'originale.