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:
- „DHT“(von Adafruit).
- „Adafruit Unified Sensor“
https://lastminuteengineers.com/esp8266-dht11-dht22-web-server-tutorial/
Eigenschaften DHT22
- kostengünstig
- 3 - 5 V Spannungsversorgung und I/O
- 2,5 mA Stromaufnahme
- 0 bis 100 % Luftfeuchtigkeit-Messbereich, mit 2 bis 5 % Genauigkeit
- -40 bis 80° Temperatur-Messbereich, mit +- 0,5°C Genauigkeit
- maximal 0.5 Hz Sampling Rate ( einmal jede zweite Sekunde)
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); }