In diesem Tutorial lernst du, wie DHT11 und DHT22/AM2302 digitale Temperatur- und Feuchtigkeitssensoren funktionieren und wie du sie mit Arduino verwenden kannst. Diese Sensoren sind sehr beliebt für DIY-Elektronikprojekte und eignen sich perfekt für ferngesteuerte Wetterstationen, Hausautomatisierungsprojekte und Pflanzen-/Gartenüberwachungssysteme.
In diesem Artikel habe ich Schaltpläne und mehrere Beispielcodes eingefügt, damit du direkt mit deinem Sensor experimentieren kannst. Nach jedem Beispiel erkläre ich, wie der Code funktioniert, sodass du ihn problemlos an deine Bedürfnisse anpassen kannst.
Zuerst schauen wir uns die Adafruit DHT-Bibliothek an. Danach zeige ich dir, wie du den Sensor mit einem 16×2 LCD kombinieren kannst, um eine einfache Wetterstation zu erstellen.
Materialien
Hardware-Komponenten
| 4 pin DHT11 sensor | × 1 | Amazon |
| 4 pin DHT22/AM2302 sensor | × 1 | Amazon |
| 3 pin DHT11 sensor (empfohlen) | × 1 | Amazon |
| 3 pin DHT22/AM2302 sensor (empfohlen) | × 1 | Amazon |
| 5 – 10 kΩ resistor (nur für 4-Pin-Sensoren) | × 1 | Amazon |
| Arduino Uno Rev3 | × 1 | Amazon |
| Breadboard | × 1 | Amazon |
| Jumper wires | ~ 10 | Amazon |
| USB cable type A/B | × 1 | Amazon |
| 16×2 character I2C LCD (optional) | × 1 | Amazon |
Software
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Wie funktionieren DHT11 und DHT22/AM2302 Temperatur- und Feuchtigkeitssensoren?
Wenn du einen DHT11 oder DHT22/AM2302 Sensor öffnest, siehst du, dass er zwei Messelemente enthält: ein Feuchtigkeitsmess-Element und einen NTC (Thermistor).
Das Feuchtigkeitsmess-Element besteht aus zwei Elektroden mit einem feuchtigkeitsaufnehmenden Substrat dazwischen. Der Sensor misst den Widerstand zwischen den Elektroden, der sich je nach Feuchtigkeitsmenge in der Luft ändert.
Auf der Rückseite des Sensors befindet sich ein kleiner IC, der das analoge Signal misst und verarbeitet. Er speichert auch die Kalibrierungskoeffizienten und führt die Analog-Digital-Wandlung durch.
Was ist relative Luftfeuchtigkeit?
Wenn du dir das Datenblatt der DHTxx-Sensoren ansiehst, wirst du feststellen, dass sie die relative Luftfeuchtigkeit (RH) messen und nicht die absolute Feuchtigkeit. Aber was ist der Unterschied? Die absolute Feuchtigkeit ist die Menge an Wasserdampf in der Luft (ausgedrückt in g/m³), unabhängig von der Temperatur. Die relative Luftfeuchtigkeit berücksichtigt die Temperatur.
Relative Luftfeuchtigkeit ist das Verhältnis zwischen der tatsächlich in der Luft vorhandenen Wasserdampfmenge und der maximalen Menge an Wasserdampf, die die Luft bei einer bestimmten Temperatur aufnehmen kann.
Warme Luft kann mehr Wasser aufnehmen als kalte Luft. Das bedeutet, dass bei der gleichen Menge an Wasserdampf in der Luft die relative Luftfeuchtigkeit in kühler Luft höher ist als in warmer Luft. Bei 100 Prozent relativer Luftfeuchtigkeit ist die Luft gesättigt und befindet sich am Taupunkt.
DHT11 Spezifikationen
| Betriebsspannung | 3,3 – 5,5 V |
| Betriebsstrom | Messung: 0,3 mA, Standby: 60 μA |
| Feuchtigkeitsmessbereich | 5 – 95 % RH ± 5 % RH |
| Temperaturmessbereich | -20 – 60 °C ± 2 °C |
| Kommunikationsprotokoll | 1-Wire |
| Abtastzeit | > 2 Sekunden |
| Gehäusemaße | 15,5 x 12 x 5,5 mm |
| Pin-Abmessungen | 8 mm Länge, 2,54 mm Abstand |
| Vorteil | Sehr kostengünstig |
| Kosten | Check price |
Weitere Informationen findest du im folgenden Datenblatt:
DHT22/AM2302 Spezifikationen
| Betriebsspannung | 3,3 – 5,5 V |
| Betriebsstrom | Messung: 0,5 mA, Standby: 15 μA |
| Feuchtigkeitsmessbereich | 0 – 99,9 % RH ± 2 % RH |
| Temperaturmessbereich | -40 – 80 °C ± 1 °C |
| Kommunikationsprotokoll | 1-Wire-Busprotokoll |
| Abtastzeit | 2 Sekunden |
| Gehäusemaße | 25 x 15 x 7 mm, ⌀ 3 mm Befestigungsloch |
| Pin-Abmessungen | 7 mm Länge, 2,54 mm Abstand |
| Vorteil | Genauer |
| Kosten | Check price |
Das Datenblatt für den DHT22/AM2302 kannst du hier herunterladen:
Beachte, dass der AM2302 einfach eine kabelgebundene Version des DHT22-Sensors mit 3 Leitungen ist.

Wie du siehst, sind die Spezifikationen des DHT11 und des DHT22/AM2302 ziemlich ähnlich. Der Hauptunterschied ist, dass der DHT22 genauer ist und einen größeren Messbereich hat. Der DHT11 ist etwas kleiner als der DHT22 und auch günstiger.
Das Schöne an diesen Sensoren ist, dass sie austauschbar sind, das heißt, du kannst einfach den DHT11 durch einen DHT22 ersetzen oder umgekehrt, die Verkabelung ist genau gleich. Du musst nur eine kleine Änderung im Code vornehmen, wie du später sehen wirst.
Verdrahtung – Anschluss von DHT11 und DHT22/AM2302 an Arduino Uno
Die folgenden Schaltpläne zeigen dir, wie du 3- oder 4-Pin Temperatur- und Feuchtigkeitssensoren an den Arduino Uno anschließt. Ein 10 kΩ Pull-up-Widerstand wird zwischen der Signalleitung und 5 V benötigt, um sicherzustellen, dass das Signal standardmäßig auf High bleibt (siehe Datenblatt für weitere Infos).


Beachte, dass der DHT22/AM2302 Sensor genau wie der DHT11 angeschlossen wird. Die Anschlüsse sind auch in der folgenden Tabelle angegeben. Ich habe die Pins von links nach rechts mit 1 bis 4 nummeriert, wenn die Löcher im Sensor zu dir zeigen.
4-Pin DHT11 und DHT22 Anschlüsse
| DHT11/DHT22 | Arduino |
|---|---|
| Pin 1 | 5 V |
| Pin 2 | Verbinde mit digitalem Pin 2 und über 10 kΩ Widerstand mit 5 V |
| Pin 3 | Nicht verbunden |
| Pin 4 | GND |
Du kannst die Sensoren auch auf einer kleinen Platine (3-Pin-Sensoren) kaufen. Diese Breakout-Boards erleichtern den Anschluss an den Arduino und enthalten bereits einen Pull-up-Widerstand. Achte darauf, das Etikett des Sensors zu prüfen, da die Pin-Reihenfolge je nach Hersteller unterschiedlich sein kann.

3-Pin DHT11 Anschlüsse
| 3-Pin DHT11 | Arduino |
|---|---|
| s | Digitaler Pin 2 |
| + | 5 V |
| – | GND |
Die folgenden Codebeispiele verwenden digitalen Pin 2, um die Sensordaten zu empfangen, aber du kannst jeden beliebigen digitalen Pin verwenden.

3-Pin DHT22/AM2302 Anschlüsse
| 3-Pin DHT22 | Arduino |
|---|---|
| DAT | Digitaler Pin 2 |
| VCC | 5 V |
| GND | GND |
Installation der benötigten Arduino-Bibliotheken
Der folgende Code verwendet die Adafruit DHT Sensorbibliothek, die du von GitHub herunterladen kannst. Diese Bibliothek funktioniert nur, wenn du auch die Adafruit Unified Sensor Bibliothek installiert hast, die ebenfalls auf GitHub verfügbar ist.
Du kannst die beiden Bibliotheken auch herunterladen, indem du auf die untenstehenden Buttons klickst:
Du kannst die Bibliothek installieren, indem du in der Arduino IDE zu Sketch > Include Library > Add .ZIP Library gehst.
Eine andere Möglichkeit ist, zu Tools > Manage Libraries… zu navigieren oder unter Windows Ctrl + Shift + I zu drücken. Der Library Manager öffnet sich und aktualisiert die Liste der installierten Bibliotheken.

Du kannst nach ‘dht’ und ‘adafruit unified sensor’ suchen und die Bibliothek von Adafruit auswählen. Wähle die neueste Version und klicke dann auf Installieren.

DHT11/DHT22 Temperatur- und Feuchtigkeitssensor Arduino Beispielcode
Du kannst den folgenden Beispielcode mit der Arduino IDE auf deinen Arduino hochladen. Danach erkläre ich, wie der Code funktioniert.
Du kannst den Code kopieren, indem du auf den Button oben rechts im Codefeld klickst.
/* Arduino example code for DHT11, DHT22/AM2302
and DHT21/AM2301 temperature and humidity sensors.
www.www.makerguides.com */
#include "Adafruit_Sensor.h"
#include "DHT.h"
// Set DHT pin:
#define DHTPIN 2
// Set DHT type, uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Initialize DHT sensor for normal 16mhz Arduino:
DHT dht = DHT(DHTPIN, DHTTYPE);
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Setup sensor:
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)
// Read the humidity in %:
float h = dht.readHumidity();
// Read the temperature as Celsius:
float t = dht.readTemperature();
// Read the temperature as Fahrenheit:
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again):
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Compute heat index in Fahrenheit (default):
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius:
float hic = dht.computeHeatIndex(t, h, false);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(f);
Serial.print(" \xC2\xB0");
Serial.print("F ");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(hif);
Serial.print(" \xC2\xB0");
Serial.println("F");
}
Du solltest die folgende Ausgabe im Serial Monitor (Strg + Shift + M) sehen:

Code-Erklärung
Der erste Schritt ist, die Adafruit DHT- und Unified Sensor-Bibliothek einzubinden.
#include "Adafruit_Sensor.h" #include "DHT.h"
Als nächstes müssen wir den DHT-Anschluss-Pin am Arduino definieren und auch den Sensortyp festlegen. In unserem Beispiel verwenden wir einen DHT11 Sensor, der an Pin 2 angeschlossen ist.
Die Anweisung #define wird verwendet, um einem konstanten Wert einen Namen zu geben. Der Compiler ersetzt alle Verweise auf diese Konstante durch den definierten Wert, wenn das Programm kompiliert wird. Also überall, wo du DHTPIN erwähnst, ersetzt der Compiler es durch den Wert 2 beim Kompilieren.
// Set DHT pin: #define DHTPIN 2 // Set DHT type, uncomment whatever type you're using! #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301)
Als nächstes musst du eine neue Instanz der DHT-Klasse mit dem passenden DHT-Typ und Anschluss erstellen. Dafür verwenden wir die Funktion DHT(pin,type).
In diesem Fall habe ich den Sensor ‘dht’ genannt, aber du kannst auch andere Namen verwenden, wie ‘temperature_sensor’ oder ‘dht11’ usw. DHT temperature_sensor = DHT(DHTPIN, DHTTYPE);. Du kannst mehrere Instanzen der DHT-Klasse mit unterschiedlichen Namen und Pins/Typen erstellen. So kannst du problemlos 2 oder mehr Sensoren gleichzeitig verwenden.
// Initialize DHT sensor for normal 16mhz Arduino: DHT dht = DHT(DHTPIN, DHTTYPE);
Setup-Funktion
In der setup() starten wir die serielle Kommunikation mit einer Baudrate von 9600. Achte darauf, dass der Serial Monitor ebenfalls auf 9600 eingestellt ist! Wir initialisieren auch den Sensor mit dht.begin().
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Setup sensor:
dht.begin();
}
Loop-Funktion
Der loop() Abschnitt des Codes beginnt mit einer Verzögerung von 2 Sekunden. Diese Verzögerung gibt dem Sensor Zeit, die Messungen durchzuführen. Die maximale Abtastrate des DHT22 beträgt alle 2 Sekunden, die des DHT11 einmal pro Sekunde.
// Wait a few seconds between measurements: delay(2000);
Temperatur- und Feuchtigkeitsmessungen sind super einfach, da die Bibliothek mehrere eingebaute Funktionen hat. Um eine Feuchtigkeitsmessung in ‘%’ zu erhalten, kannst du die Funktion readHumidity()verwenden. In diesem Fall speichern wir die Messung in der Variable ‘h’. Beachte, dass sie vom Typ float ist.
Wenn du eine Funktion auf dem DHT-Objekt verwenden möchtest, musst du zuerst den Namen angeben, den du dem Sensor gegeben hast. In unserem Fall ist das ‘dht’.
// Read the humidity in %: float h = dht.readHumidity();
Temperaturmessungen sind genauso einfach mit der Funktion readTemperature().
// Read the temperature as Celsius: float t = dht.readTemperature();
Wenn du die Temperatur in Fahrenheit statt Celsius erhalten möchtest, hast du zwei Möglichkeiten. Du kannst true an die readTemperature-Funktion übergeben oder die convert-Funktion verwenden:
// Read the temperature as Fahrenheit: float f = dht.readTemperature(true); // Alternative, use convert function: float f = dht.convertCtoF(t);
Als nächstes gibt es einen kleinen Codeabschnitt, der überprüft, ob der Sensor korrekt angeschlossen ist und eine Messung zurückgibt. Falls nicht, wird eine Fehlermeldung im Serial Monitor ausgegeben.
// Check if any reads failed and exit early (to try again):
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Die Bibliothek hat auch eine eingebaute Funktion, die den Hitzeindex berechnet, indem sie Temperatur- und Feuchtigkeitswerte kombiniert. Der heat index ist auch als „gefühlte Lufttemperatur“ oder „scheinbare Temperatur“ bekannt.
// Compute heat index in Fahrenheit (default): float hif = dht.computeHeatIndex(f, h); // Compute heat index in Celsius: float hic = dht.computeHeatIndex(t, h, false);
Schließlich werden die Messwerte im Serial Monitor angezeigt. Beachte, dass die Zeile Serial.print(" \xC2\xB0"); verwendet wird, um das Gradzeichen auszugeben.
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(f);
Serial.print(" \xC2\xB0");
Serial.print("F ");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(hif);
Serial.print(" \xC2\xB0");
Serial.println("F");
Beispielcode für DHT11 und DHT22/AM2302 Temperatur- und Feuchtigkeitssensor mit I2C LCD und Arduino
Indem du einen Temperatur- und Feuchtigkeitssensor mit einem kleinen LCD kombinierst, kannst du eine günstige Wetterstation bauen.
Im folgenden Beispiel verwende ich ein I2C-Zeichen-LCD. Du musst einige zusätzliche Verbindungen zum Arduino herstellen, damit wir das 16×2 Zeichen-LCD steuern können. Der DHT11 oder DHT22/AM2302 Sensor wird wie zuvor angeschlossen.
Das folgende Schaltbild zeigt dir, wie du ein I2C LCD an den Arduino anschließt.

Die Anschlüsse sind auch in der folgenden Tabelle angegeben:
I2C LCD Anschlüsse
| I2C LCD | Arduino |
|---|---|
| GND | GND |
| VCC | 5 V |
| SDA | A4 |
| SCL | A5 |
Wenn du keinen Arduino Uno verwendest, können die SDA- und SCL-Pins an einer anderen Stelle sein. Ein Arduino UNO mit R3-Layout (1.0 Pinout) hat die SDA- (Datenleitung) und SCL- (Taktleitung) Pin-Header in der Nähe des AREF-Pins. Sieh dir die folgende Tabelle für mehr Details an.
| Board | SDA | SCL |
|---|---|---|
| Arduino Uno | A4 | A5 |
| Arduino Nano | A4 | A5 |
| Arduino Micro | 2 | 3 |
| Arduino Mega 2560 | 20 | 21 |
| Arduino Leonardo | 2 | 3 |
| Arduino Due | 20 | 21 |
Der Code verwendet die LiquidCrystal_I2C Bibliothek, die du von GitHub herunterladen kannst. Er beinhaltet auch die Wire.h Bibliothek, die die Kommunikation mit I2C-Geräten ermöglicht. Diese Bibliothek ist normalerweise bereits in der Arduino IDE vorinstalliert.
Der folgende Code ist größtenteils derselbe wie zuvor, aber jetzt zeigen wir die Temperatur und Feuchtigkeit auf dem LCD anstatt im Serial Monitor.
Du kannst den Code kopieren, indem du auf den Button oben rechts im Codefeld klickst.
/* Arduino example code for DHT11, DHT22/AM2302
and DHT21/AM2301 temperature and humidity sensors
with I2C LCD. More info: www.www.makerguides.com */
#include "Adafruit_Sensor.h"
#include "DHT.h"
#include "Wire.h"
#include "LiquidCrystal_I2C.h"
// Set DHT pin:
#define DHTPIN 2
// Define SDA and SCL pin for LCD:
#define SDAPin A4 // Data pin
#define SCLPin A5 // Clock pin
// Set DHT type, uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Initialize DHT sensor for normal 16mhz Arduino:
DHT dht = DHT(DHTPIN, DHTTYPE);
// Connect to LCD via I2C, default address 0x27 (A0-A2 not jumpered):
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); //Change to (0x27,20,4) for 2004 LCD
void setup() {
// Setup sensor:
dht.begin();
// Initiate the LCD:
lcd.init();
lcd.backlight();
}
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)
// Read the humidity in %:
float h = dht.readHumidity();
// Read the temperature as Celsius:
float t = dht.readTemperature();
// Read the temperature as Fahrenheit:
float f = dht.readTemperature(true);
// Compute heat index in Fahrenheit (default):
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius:
float hic = dht.computeHeatIndex(t, h, false);
// Print the temperature and the humidity on the LCD:
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" " "\xDF" "C");
lcd.setCursor(0, 1);
lcd.print("Humid: ");
lcd.print(h);
lcd.print(" %");
}
DHT11/DHT22 Fehlerbehebung
Beim Arbeiten mit diesen Sensoren können folgende Fehlermeldungen auftreten:
„Failed to read from DHT sensor!“
Diese Meldung kann im Serial Monitor erscheinen, wenn der Sensor keine Messwerte zurückgibt. Das kann mehrere Ursachen haben:
- Sensortyp: Stelle sicher, dass du den richtigen DHTTYPE im Code-Setup auskommentiert hast. Sieh dir das obige Beispiel an.
- Abtastrate: Die DHT-Sensoren sind relativ langsam, die maximale Abtastrate liegt bei etwa 2 Sekunden. Eine Erhöhung der Verzögerung zwischen den Messungen kann diesen Fehler beheben.
- Stromversorgung: Obwohl die DHTxx-Sensoren mit 3,3 bis 5 V betrieben werden können, empfiehlt der Hersteller 5 V. In manchen Fällen löst die Versorgung mit 5 V das Problem. Stelle sicher, dass dein Mikrocontroller auch 5 V an den GPIO-Pins unterstützt.
Fatal error: Adafruit_Sensor.h: No such file or directory
Diesen Fehler kannst du beim Kompilieren des Codes erhalten. Das bedeutet, dass du die Adafruit Unified Sensor Bibliothek nicht (richtig) installiert hast.
Scroll einfach etwas nach oben in diesem Beitrag, dort siehst du, wo und wie du die Bibliothek herunterladen und installieren kannst.
Fazit
In diesem Artikel habe ich dir gezeigt, wie DHT11 und DHT22/AM2302 Temperatur- und Feuchtigkeitssensoren funktionieren und wie du sie mit Arduino verwenden kannst.
Ich hoffe, du fandest es nützlich und informativ. Für andere Temperatursensoren schau dir unser LM35 analog temperature sensor with Arduino und TMP36 analog temperature sensor with Arduino Tutorial an.
Wenn du Fragen, Vorschläge hast oder denkst, dass in diesem Tutorial etwas fehlt, hinterlasse bitte unten einen Kommentar.

