Möchtest du Feuchtigkeit und Temperatur in einem deiner Projekte messen? Der DHT11 und DHT22 sind eine beliebte Lösung dafür.
Die Sensoren DHT11 und DHT22 sind eine beliebte Wahl für die Messung der Luftfeuchtigkeit mit dem Arduino. Insbesondere der DHT11 ist Bestandteil vieler Arduino-Bausätze. Die Sensoren selbst werden vom chinesischen Sensorhersteller Aosong Electronics hergestellt, der auch unter dem Namen ASAIR bekannt ist. Beide Sensoren ermöglichen die Messung von Temperatur und relativer Luftfeuchtigkeit. Dies ist ein guter Ausgangspunkt für den Bau einer einfachen Wetterstation. Man könnte sie auch zur Überwachung des Raumklimas verwenden. Die kalte Jahreszeit hat gerade erst begonnen und die Luft in vielen Räumen ist entweder trocken oder feucht und stickig, da niemand mehr ein Fenster öffnet. Somit könnten diese Module ein Ausgangspunkt für interessante Projekte sein. Schauen wir uns an, wie die Sensoren funktionieren und wie wir sie mit dem Arduino nutzen können.
Wenn man über die Messung der Luftfeuchtigkeit spricht, muss man klar zwischen relativer und absoluter Luftfeuchtigkeit unterscheiden. Die absolute Luftfeuchtigkeit ist die Menge an Wasserdampf in der Luft und wird in Gramm pro Kubikmeter (g/m³) gemessen. Die relative Luftfeuchtigkeit ist die Wasserdampfmenge bezogen auf die maximal mögliche Wasserdampfmenge vor Erreichen des Sättigungspunktes. Mit steigender Temperatur nimmt die mögliche Wasserdampfmenge zu. Sobald die Luft gesättigt ist, beginnt das Wasser an Oberflächen und Partikeln in der Luft zu kondensieren. Es wird neblig und beginnt schließlich zu regnen, wenn sich größere Wassertropfen bilden.
Die meisten Sensoren messen die relative Luftfeuchtigkeit. Dies gilt auch für den DHT11 und den DHT22. Sie verwenden eine kapazitive Messtechnik, die zwei Metalloberflächen mit einem dielektrischen Material dazwischen nutzt. Diese Konstruktion verhält sich wie ein Kondensator. Das dielektrische Material kann Wasser aus der Umgebungsluft absorbieren, wodurch sich die Kapazität ändert. Je höher die relative Luftfeuchtigkeit, desto mehr Wasser absorbiert das dielektrische Material. Ein kleiner Mikrocontroller im Sensor misst die Kapazität und verwendet sie zur Berechnung der relativen Luftfeuchtigkeit. Die relative Luftfeuchtigkeit ist nicht sehr aussagekräftig, wenn man nicht weiß, bei welcher Temperatur sie gemessen wurde. Jeder mir bekannte Luftfeuchtigkeitssensor verfügt über einen eingebauten Temperatursensor. Dieser wird oft auch für eine sensorinterne Temperaturkompensation benötigt. Wenn man beide Messungen kombiniert, kann man außerdem die absolute Luftfeuchtigkeit und den Taupunkt berechnen. Der Taupunkt ist die Temperatur, bei der Wasser anfangen würde zu kondensieren. Die erforderlichen Formeln sind jedoch alles andere als einfach, deshalb werden wir sie in diesem Tutorial nicht behandeln. Ich möchte mit einer Warnung abschließen: Da die relative Luftfeuchtigkeit stark von der Temperatur abhängt, ist es wichtig, sicherzustellen, dass der Sensor nicht durch umliegende Komponenten erwärmt wird.
Die DHT-Sensoren nutzen ein proprietäres Protokoll zur Übertragung der Messwerte über eine einzige Datenleitung. Um aus unserem Arduino-Programm heraus mit dem Sensor kommunizieren zu können, werden wir die von Adafruit zur Verfügung gestellte Bibliothek für DHT-Sensoren nutzen. Sofern dies noch nicht bereits geschehen ist, muss sie noch installiert werden. Öffne dazu den Bibliotheksverwalter unter Werkzeuge
> Bibliotheken verwalten ...
und suche nach "DHT". Wähle die "DHT sensor library" aus und installiere sie. Es erscheint die Aufforderung, die Adafruit Unified Sensor-Bibliothek zusammen mit der DHT Bibliothek zu installieren. Dies ist für den Zweck dieses Tutorials nicht unbedingt erforderlich, aber es schadet auch nicht. Ich würde empfehlen, sie ebenfalls von der Arduino-IDE installieren zu lassen.
Unser erster Sensor ist der DHT11. Er ist preiswert, aber auch weniger genau als die anderen Sensoren. Er kann eine Luftfeuchtigkeit von 20 % bis zu 90 % in einem Temperaturbereich von 0 °C bis 50 °C erfassen. Die Luftfeuchtigkeitsmessung hat eine Genauigkeit von ± 5 %, und die Temperatur wird mit einer Genauigkeit von ± 2 °C gemessen. Der Sensor selbst lässt keine hohe Abtastrate zu. Man kann alle 2 Sekunden einen neuen Wert lesen. Die DHT-Sensorbibliothek kümmert sich darum und liefert den alten Wert, wenn man versucht, mit einer höheren Geschwindigkeit zu lesen.
Schauen wir mal, wie der Sensor an den Arduino angeschlossen werden kann. Ich habe das Modul KY-015 verwendet. Dieses Modul enthält bereits den Pullup-Widerstand, der für die Datenleitung der Sensoren erforderlich ist. Damit ist es möglich, die Datenleitung direkt an einen digitalen Pin des Arduino anzuschließen. Wie im Bild unten zu sehen ist, habe ich Pin 8
für die Datenleitung gewählt. Außerdem muss die Versorgungsspannung an 5V
und der Masse-Pin an GND
angeschlossen werden.
Um die Bibliothek nutzen zu können, müssen wir die DHT.h
Header-Datei einbinden. Anschließend erzeugen wir eine Sensor-Instanz für Pin 8
und unseren Sensortyp DHT11
.
Dies kann wie folgt realisiert werden:
#include <DHT.h>
DHT sensor(8, DHT22);
Außerdem müssen wir in der setup
-Prozedur sensor.begin()
aufrufen, um den Sensor zu initialisieren. In unserer Hauptschleife können wir die Methoden readTemperature
und readHumidity
verwenden, um unsere Messungen durchzuführen.
Hier ist ein Beispielcode, der die Messwerte alle 5 Sekunden ausgibt:
#include <DHT.h>
DHT sensor(8, DHT11);
void setup() {
Serial.begin(9600);
sensor.begin();
}
void loop() {
float temperature = sensor.readTemperature();
float temperatureF = sensor.convertCtoF(temperature);
float humidity = sensor.readHumidity();
Serial.print("Temperature (°C): ");
Serial.println(temperature);
Serial.print("Temperature (°F): ");
Serial.println(temperatureF);
Serial.print("Humidity (%RH): ");
Serial.println(humidity);
delay(5000);
}
Wenn du den Code auf das Arduino hochlädst, kannst du die Messungen im seriellen Monitor nachverfolgen. Sie sollten wie folgt aussehen:
Temperature (°C): 20.20
Temperature (°F): 68.36
Humidity (%RH): 53.00
Kommen wir nun zu unserem zweiten Modul, dem DHT22, das auch als AM2302 oder CM2302 bekannt ist. Die Schaltung ist im Prinzip die gleiche. Das Modul, das ich in diesem Fall verwendet habe, hat jedoch eine andere Pinbelegung. Seine Datenleitung liegt in der Mitte. Wie ich das Modul angeschlossen habe, kannst du im Bild unten sehen.
Der DHT22 ist genauer als der DHT11 und ermöglicht zudem einen größeren Messbereich. Er kann eine Luftfeuchtigkeit von 0 % bis 99,9 % in einem Temperaturbereich von -40 °C bis 80 °C messen. Die Luftfeuchtigkeitsmessung hat eine Genauigkeit von ± 2 %, und die Temperatur wird mit einer Genauigkeit von ± 0,5 °C gemessen.
Über den Code gibt es nicht viel zu sagen. Es genügt, den Sensortyp auf DHT22
zu ändern, und fertig. Die Bibliothek kümmert sich um die Unterschiede zwischen den beiden Sensoren.
Hier ist der angepasste Beispielcode:
#include <DHT.h>
DHT sensor(8, DHT22);
void setup() {
Serial.begin(9600);
sensor.begin();
}
void loop() {
float temperature = sensor.readTemperature();
float temperatureF = sensor.convertCtoF(temperature);
float humidity = sensor.readHumidity();
Serial.print("Temperature (°C): ");
Serial.println(temperature);
Serial.print("Temperature (°F): ");
Serial.println(temperatureF);
Serial.print("Humidity (%RH): ");
Serial.println(humidity);
delay(5000);
}
Sobald der Code auf den Arduino hochgeladen ist, kann man die Messwerte auf dem seriellen Monitor ansehen. Wie man sieht, gibt das DHT22-Modul den Temperaturmesswert mit einer Dezimalstelle aus. Beim DHT11 werden nur ganzzahlige Werte ausgegeben, da der Sensor ohnehin nicht ausreichend genau ist.
Temperature (°C): 20.10
Temperature (°F): 68.18
Humidity (%RH): 52.70
Vorsicht vor Fälschungen
Es gibt einige "alternative" Versionen dieses Sensors. Die Verkäufer sagen nicht unbedingt immer, dass man keinen DHT22 kauft, sondern nur ein kompatibles Produkt.
Mein Sensor kam mit einem SHTC3-Sensor von Sensirion (einer Schweizer Sensorfirma) in dem grauen Plastikgehäuse. Ein kleiner Mikrocontroller emuliert das DHT22-Protokoll, was es dem Sensor erlaubt, mit der DHT22-Bibliothek zu funktionieren.
Dies ist nicht so schlimm, wie es sich zunächst anhört, da der SHTC3 höchstwahrscheinlich der bessere Sensor ist, aber es ist definitiv nicht das, was man erwarten würde.