DHT22 AM2302 Temperatur- und Luftfeuchtigkeitssensor
Hinter dem 15. Türchen des AZ-Adventskalenders finden Sie den DHT22 und das gleich in dreifacher Ausführung. Mit diesem Sensor ist es möglich, die Feuchtigkeit und Temperatur der Umgebungsluft zu messen. Er hat vier Kontakte, die der Spannungsversorgung von 3,3V bis 6V und der Datenübertragung dienen. Die Pinbelegung sieht wie folgt aus, wenn Sie den Sensor mit der beschrifteten Gitterseite betrachten:
Die Pinbelegung lautet wie folgt:
Pin |
Funktion |
1 |
VDD (Spannung +) |
2 |
Datensignal |
3 |
nicht verwendet |
4 |
GND (Spannung -) |
Eventuell kennen Sie bereits den DHT11 Sensor, der so ähnlich aussieht. Dieser liefert allerdings eine geringere Genauigkeit (keine Gleitkommazahlen), sowie kleinere Messwertebereiche.
Weitere Details entnehmen Sie bitte dem Datenblatt. Eine Beschreibung, wie Sie den Sensor mit einem Uno Mikrocontroller verbinden, finden Sie hier oder hier (die Links sind auch auf der Shopseite verfügbar).
Im AZ-Adventskalender befanden sich bereits der Uno und Nano Mikrocontroller, sowie das LCDisplay mit I²C-Backpack. Ich möchte ihnen zeigen, wie Sie drei DHT-Sensoren zusammen auslesen und auf dem Display anzeigen können.
Eventuell unterhalten Sie mehrere Terrarien oder wollen zentral die Werte von mehreren Räumen anzeigen lassen. Schauen Sie noch einmal in die Adventsbeiträge zu den Türchen drei, vier und fünf für Informationen zur Nutzung der Komponenten.
Hinweis: die maximale Länge der Kabel zwischen Sensor und Mikrocontroller wird nicht in den Datenblättern angegeben. Die Verwendung von Kabelllängen größer als 15 m sollte problemlos möglich sein. Informationen zum 1-Wire-Datenbus finden Sie z.B. hier.
Die Sensoren, das Display und der Mikrocontroller werden wie folgt angeschlossen:
Für die Anschlüsse an die Datenpins werden Pull-up-Widerstände benötigt, um einen eindeutigen Spannungspegel zu erhalten. Die Bibliothek, deren Installation ich weiter unten zeige, schaltet die internen Pull-up-Widerstände ein. Auch die Adafruit-DHT-Bibliothek funktioniert auf diese Weise. Sollten Sie eine andere Bibliothek verwenden, die nicht auf die internen Pull-ups zurückgreift, dann sollten Sie externe Widerstände nutzen. In der Regel werden 4,7 kOhm verwendet oder wie hier im Bild 10 kOhm.
Laut Datenblatt wird noch je ein 100 nF Kondensator zwischen VDD und GND an den Sensoren empfohlen, die hier nicht verwendet wurden. Das Breadboard habe ich in diesem Fritzing-Schaltplan bewusst so gewählt, um noch einmal darauf hinzuweisen, dass die äußeren Bahnen eventuell in der Mitte unterbrochen sind. Schauen Sie dafür noch einmal in den Adventsbeitrag zu Türchen Nummer eins.
Um das Display per I²C-Schnittstelle verwenden zu können, nutze ich die Bibliothek LiquidCrystal_I2C, die Sie über die Bibliotheksverwaltung installieren können. Das ist eine erweiterte Variante der Bibliothek LiquidCrystal:
Für den DHT22 finden Sie verschiedene Bibliotheken, wenn Sie in die Suche DHT eingeben. Ich habe mich für DHTNEW entschieden, da sie automatisch zwischen den Sensor-Varianten unterscheiden kann.
Informationen zur Bibliothek finden Sie hier.
Nach der Installation stehen Ihnen wieder einige Beispiel-Sketches zur Verfügung. Ich empfehle Ihnen den HelloWorld-Sketch für das I²C-Display und den dhtnew_minimum-Sketch für den DHT-Sensor. Diese habe ich als Basis benutzt. Die Beispiele für das Display sind nicht sehr umfangreich. Da die Bibliothek aber stark angelehnt ist an die "normale" LiquidCrystal-Bibliothek, können Sie sich dort in den Beispielen umsehen. Bis auf die Initialisierung sollte alles genauso funktionieren.
Hier folgt nun der Quellcode, den ich erstellt habe, um auf dem Display jeweils Luftfeuchtigkeit (in %) und Temperatur (in °C) auf dem Zwei-Zeilen-Display anzeigen zu lassen. Das Zeichen für °C habe ich mir online mit dem LCD Custom Char Generator erstellt. So konnte ich °C als ein Zeichen nutzen und habe damit Platz auf dem Display gespart. Außerdem kann ich Ihnen auf diesem Weg noch einmal zeigen, wie Sie eigene Zeichen verwenden können.
Hier folgt nun der Quellcode:
#include <dhtnew.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args) write(args);
#else
#define printByte(args) print(args,BYTE);
#endif
DHTNEW mySensor_A(6);
DHTNEW mySensor_B(7);
DHTNEW mySensor_C(8);
const int maxSensors = 3;
unsigned long changeIntervall = 2000;
unsigned long changeTime = 0;
String line_1;
String line_2;
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
// https://maxpromer.github.io/LCD-Character-Creator/
// Definition eigenes Zeichen fuer das Display
byte grad[] = {
B11000,
B11011,
B00100,
B00100,
B00100,
B00100,
B00100,
B00011
};
void setup()
{
Serial.begin(115200);
lcd.init();
lcd.backlight();
lcd.createChar(0, grad);
}
void loop()
{
// nicht-blockierendes Intervall
if (millis() - changeTime > changeIntervall) {
// Sensorwerte auslesen
mySensor_A.read();
mySensor_B.read();
mySensor_C.read();
// Ausgabe Serieller Monitor
Serial.println(" \t 1\t 2\t 3");
Serial.print("HUM in %: \t");
Serial.print(mySensor_A.getHumidity(), 1);
Serial.print("\t");
Serial.print(mySensor_B.getHumidity(), 1);
Serial.print("\t");
Serial.println(mySensor_C.getHumidity(), 1);
Serial.print("TEM in °C: \t");
Serial.print(mySensor_A.getTemperature(), 1);
Serial.print("\t");
Serial.print(mySensor_B.getTemperature(), 1);
Serial.print("\t");
Serial.println(mySensor_C.getTemperature(), 1);
Serial.print("\n");
// Ausgabe LCD
// formatierte Zeilen erzeugen:
line_1 = ("% ") + String(mySensor_A.getHumidity(), 1) + (" ")
+ String(mySensor_B.getHumidity(), 1) + (" ")
+ String(mySensor_C.getHumidity(), 1);
line_2 = (" ") + String(mySensor_A.getTemperature(), 1) + (" ")
+ String(mySensor_B.getTemperature(), 1) + (" ")
+ String(mySensor_C.getTemperature(), 1);
// auf dem Display ausgeben:
lcd.setCursor(0,0);
lcd.print(line_1);
lcd.setCursor(0,1);
// Custom character:
lcd.printByte(0);
lcd.setCursor(1,1);
lcd.print(line_2);
changeTime = millis();
}
}
Es werden die drei Sensoren ausgelesen und auf dem Seriellen Monitor sowie auf dem LCDisplay ausgegeben. Das geschieht "unterbrechungsfrei" im 2-Sekunden-Takt. Das heißt, dass Sie weiteren Programmcode einfügen können, der so ablaufen kann, dass dieser nicht auf das Auslesen der Sensoren warten muss.
Hinweis: Die DHT-Sensoren sollten in einem Takt von nicht weniger als zwei Sekunden abgefragt werden.
Den Quellcode finden Sie außerdem hier als Download
Wir wünschen eine frohe Adventszeit.
Andreas Wolter
für AZ-Delivery Blog