Skip to Content

Wie man DHT11- und DHT22-Sensoren mit Arduino verwendet

Wie man DHT11- und DHT22-Sensoren mit Arduino verwendet

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× 1Amazon
4 pin DHT22/AM2302 sensor× 1Amazon
3 pin DHT11 sensor (empfohlen)× 1Amazon
3 pin DHT22/AM2302 sensor (empfohlen)× 1Amazon
5 – 10 kΩ resistor (nur für 4-Pin-Sensoren)× 1Amazon
Arduino Uno Rev3× 1Amazon
Breadboard× 1Amazon
Jumper wires~ 10Amazon
USB cable type A/B× 1Amazon
16×2 character I2C LCD (optional)× 1Amazon

Software

Arduino IDEArduino IDE

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

Betriebsspannung3,3 – 5,5 V
BetriebsstromMessung: 0,3 mA, Standby: 60 μA
Feuchtigkeitsmessbereich5 – 95 % RH ± 5 % RH
Temperaturmessbereich-20 – 60 °C ± 2 °C
Kommunikationsprotokoll1-Wire
Abtastzeit> 2 Sekunden
Gehäusemaße15,5 x 12 x 5,5 mm
Pin-Abmessungen8 mm Länge, 2,54 mm Abstand
VorteilSehr kostengünstig
KostenCheck price

Weitere Informationen findest du im folgenden Datenblatt:

DHT22/AM2302 Spezifikationen

Betriebsspannung3,3 – 5,5 V
BetriebsstromMessung: 0,5 mA, Standby: 15 μA
Feuchtigkeitsmessbereich0 – 99,9 % RH ± 2 % RH
Temperaturmessbereich-40 – 80 °C ± 1 °C
Kommunikationsprotokoll1-Wire-Busprotokoll
Abtastzeit2 Sekunden
Gehäusemaße25 x 15 x 7 mm, ⌀ 3 mm Befestigungsloch
Pin-Abmessungen7 mm Länge, 2,54 mm Abstand
VorteilGenauer
KostenCheck 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.

AM2302 Sensor
AM2302 Sensor

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).

DHT11-with-Arduino-UNO-wiring-diagram-schematic
Verdrahtung 4-Pin DHT11 Temperatur- und Feuchtigkeitssensor an Arduino Uno
DHT22-with-Arduino-UNO-wiring-diagram-schematic
Verdrahtung 4-Pin DHT22 Temperatur- und Feuchtigkeitssensor an Arduino Uno

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/DHT22Arduino
Pin 15 V
Pin 2Verbinde mit digitalem Pin 2 und über 10 kΩ Widerstand mit 5 V
Pin 3Nicht verbunden
Pin 4GND

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.

DHT11-3-pin-with-Arduino-UNO-wiring-diagram-schematic
Verdrahtung 3-Pin DHT11 Temperatur- und Feuchtigkeitssensor an Arduino Uno

3-Pin DHT11 Anschlüsse

3-Pin DHT11Arduino
sDigitaler 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.

DHT22-3-pin-with-Arduino-UNO-wiring-diagram-schematic
Verdrahtung 3-Pin DHT22 Temperatur- und Feuchtigkeitssensor an Arduino Uno

3-Pin DHT22/AM2302 Anschlüsse

3-Pin DHT22Arduino
DATDigitaler Pin 2
VCC5 V
GNDGND

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.

Installing an Arduino library step 1 open Library Manager
Library Manager

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.

Installing an Arduino library step 2 DHT Adafruit
Installation der DHT Adafruit Bibliothek

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:

DHT11 temperature and humidity sensor Serial Monitor output
Ausgabe im Serial Monitor

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.

DHT11-with-I2C-LCD-and-Arduino-UNO-wiring-diagram-schematic
DHT11 Temperatur- und Feuchtigkeitssensor mit 16×2 I2C Zeichen-LCD und Arduino Schaltplan

Die Anschlüsse sind auch in der folgenden Tabelle angegeben:

I2C LCD Anschlüsse

I2C LCDArduino
GNDGND
VCC5 V
SDAA4
SCLA5

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.

BoardSDASCL
Arduino UnoA4A5
Arduino NanoA4A5
Arduino Micro23
Arduino Mega 25602021
Arduino Leonardo23
Arduino Due2021
I2C Pin-Positionen für verschiedene Arduino-Boards

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.