Inhaltsverzeichnis

Der DHT22

Der DHT22 ist ein Luftfeuchtigkeitssensor, der auch die Temperatur messen kann. Der Messbereich liegt zwischen -40 und +80 Grad Celsius bei einer Abweichung (laut Datenblatt) von +/- 0,5 Grad Celsius. Auch hier ändert sich abhängig von der Luftfeuchtigkeit der Widerstand des Sensors. Dieser Widerstand wird aber intern noch mit der Temperatur verrechnet, aufgearbeitet und die Luftfeuchtigkeit und die Temperatur werden digital an den Arduino übertragen.

Der DHT-Sensor besitzt ein kapazitives Feuchtesensorelement und einem temperaturabhängigen Halbleiter zur Temperaturmessung. Eine Änderung des Kapazitätswertes tritt mit der Änderung der Luftfeuchtigkeit auf, da sich das Dielektrikum, welches zwischen den Elektroden befindet, sich ändert.

Außerdem hat der Sensor ein elektronisches Bauteil, der das analoge Signal (Luftfeuchtigkeit und Temperatur) verarbeitet, eine Analog-Digital-Wandlung durchführt und dieses digital an die Datenleitung ausgibt.

Datenblatt

https://www.didaktik.physik.uni-muenchen.de/materialien/sensorik/aas/index.html

https://nerdyelectronics.com/working-of-dht-sensor-dht11-and-dht22/

Anschluss

Der linke Pin wird an VCC, der rechte Pin an Ground angeschlossen. Der 2. Pin von links ist die Datenleitung, über die die gesamte Kommunikation läuft. Damit dieser auf jeden Fall sauber auf HIGH gezogen wird, schaltet man zwischen der Datenleitung und VCC einen 10 kOhm Pullup- Widerstand.

Bibliotheken

Um die Bibliothek zu installieren, navigiert man über Sketch > Bibliothek einschließen > Bibliotheken verwalten…

Man installiert folgende Bibliotheken:

  1. „DHT“(von Adafruit).
  2. „Adafruit Unified Sensor“

https://lastminuteengineers.com/esp8266-dht11-dht22-web-server-tutorial/

Eigenschaften DHT22

Die Kommunikation zwischen dem Sensor und dem Mikrocontroller funktioniert über eine Leitung. Normalerweise liegt am Datenpin eine HIGH- Spannung an. Zum Start einer Abfrage, wird diese kurzzeitig auf Ground gezogen. Dann startet der Sensor eine Abfrage und sendet sein Ergebnis als ein 40bit langes Datenpaket, in denen Luftfeuchtigkeit und Temperatur codiert sind, an den Mikrocontroller. Die Daten werden mit Hilfe unterschiedlich langer Impulse übertragen, so entspricht einer 1 eine Impulslänge von 70 microsec Länge und einer 0 einer Impulslänge von 26-28 microsec.

Abfragen des DHT22 ohne Verwendung des Biblitothek

Hier kann man sehen, wie die Kommunikation zwischen Mikrocontroller und DHT22 funktioniert.

// nach https://nerdyelectronics.com/working-of-dht-sensor-dht11-and-dht22/
// abgeändert mit Hilfe der Dokumentation 
// https://cdn-shop.adafruit.com/datasheets/Digital+humidity+and+temperature+sensor+AM2302.pdf


int datapin=4;                                    //Data Pin
volatile unsigned int duration=0;
unsigned int j[40];                                //declare a array of size 40 to store the 40bits of data from the sensor
int z=0;  

void setup() {
   Serial.begin(115200);  
}
 
void loop() {
 delay(3000); 
 Serial.println("");
 Serial.println("Neue Messung");
 pinMode(datapin,OUTPUT);                //Pin als Ausgang 
 digitalWrite(datapin,LOW);              //Mikrocontoller sendet ein LOW - Signal 
 delay(20);                              //für mindestens 18 ms      
 digitalWrite(datapin,HIGH);
 pinMode(datapin,INPUT_PULLUP);          //Der Pin ist jetzt auf HIGH und wartet auf Antwort vom DHT22
 duration=pulseIn(datapin, LOW);
 if(duration <= 84 && duration >= 72){   // Der DHT hat mit einem Signal der Länge ca. 80µs geantwortet
    z=0;
    while(z<40){
      j[z] =pulseIn(datapin, HIGH); //der DHT setzt den Pin auf LOW und sendet HIGH- Impulse unterschiedlicher Länge,                                                 
      z++; 
      } // ende der inneren While
  } 
      
  for(int k=0; k<40;k++){
  Serial.print(j[k]); 
  Serial.print(" "); 
  if(k== 7 || k==15 || k == 23 || k== 31){
  Serial.println(" "); 
  }
}    
        } // ende loop
     

etwas unfangreicher

// nach https://nerdyelectronics.com/working-of-dht-sensor-dht11-and-dht22/
// abgeändert mit Hilfe der Dokumentation 
// https://cdn-shop.adafruit.com/datasheets/Digital+humidity+and+temperature+sensor+AM2302.pdf


float temperatur;
float feuchtigkeit;

int datapin=4;                                    //Data Pin

volatile unsigned int duration=0;
unsigned char i[5];                                //array to hold 5 formats of data                                    
unsigned int j[40];                                //declare a array of size 40 to store the 40bits of data from the sensor
unsigned char value=0;                             //Declare and initialize value Variable that is received 
unsigned char checksum=0;                               //Declare and initialize Checksum Variable
int z=0;  

void setup()
{
   Serial.begin(115200);
   delay(2000);  
}
 
void loop() {
     while(1){                             // Sensor braucht mind. 2 Sekunden
          delay(3000); 
          Serial.println();
          Serial.println("Neue Messung");
          
          pinMode(datapin,OUTPUT);                //Pin als Ausgang 
          digitalWrite(datapin,LOW);              //Mikrocontoller sendet ein LOW - Signal 
          delay(20);                              //für mindestens 18 µs      
          digitalWrite(datapin,HIGH);
          pinMode(datapin,INPUT_PULLUP);          //Der Pin ist jetzt auf HIGH und wartet auf Antwort vom DHT22
          duration=pulseIn(datapin, LOW);
          if(duration <= 84 && duration >= 72){   // Der DHT hat mit einem Signal der Länge ca. 80µs geantwortet
               while(1){
                    duration=pulseIn(datapin, HIGH);           //der DHT sendet HIGH- Impulse unterschiedlicher Länge, 
                                                                //  zwischen den HIGH-Signalen ist der Pin  für ca. 50µs auf LOW
                    if(duration <= 33 && duration >= 20)       //if duration is in between 26µs and 20µs then bit 0 is transmitted by sensor
                    {
                         value=0; //Bit 0 is received
                    }
                    else if(duration <= 74 && duration >= 65)  //if duration is in between 74µs and 65µs then bit 1 is transmitted by sensor
                    {
                         value=1; //Bit 1 is received
                    }
                    else if(z==40){
                      break;
                    }

                    i[z/8]|=value<<(7- (z%8));                 //leftshift each bit of data und mit or verknüpfen 
                            
                    j[z]=value;                                //store the data in the array variable j
                    z++; //increment length 
               } // ende der inneren While
         } // Messung beendet
         
         checksum=i[0]+i[1]+i[2]+i[3];                         //checksum should be equal to addition of high and low byte of humidity and temperature
         if(checksum==i[4] && checksum!=0)                     //checksum should be equal to last byte of 40 bits data and it should not be 0 
         {
             Serial.println("Checksumme OK");                                //print high Humidity byte in decimal form

             Serial.print("Luftfeuchtigkeit:  ");
             Serial.println((i[0]*256+i[1])*0.1);
             Serial.print("Temperatur:  ");
             Serial.println((i[2]*256+i[3])*0.1);
          }
          
        for(int k=0; k<40;k++){
          Serial.print(j[k]); 
          if(k==15 || k ==31){
            Serial.print(" "); 
          }
         }
        
        
         z=0;                                                  //set length of bits =0 
         i[0]=i[1]=i[2]=i[3]=i[4]=0;                           //set the 5 data formats to 0
         } 
     }


Abfragen des DHT22 mit Verwendung des Biblitothek

#include "DHT.h"                                  
#define DHTPIN 4                                 
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);                          
void setup(){                                      
     Serial.begin(9600);                           
     dht.begin();
}
void loop(){
     float h = dht.readHumidity();
     float t = dht.readTemperature();
     Serial.println(h);
     Serial.println(t);
     delay(3000);
}