Auslesen des DHT11-Sensors und Anzeige von Temperatur und Luftfeuchtigkeit auf dem Multi Function Shield

Das Multi Function Shield, das ich ja bereits vorgestellt habe und das mittlerweile ja auch um einen Drehgeber erweitert wurde, bietet mit der Möglichkeit zur einfachen Anzeige von Daten auf seinem 4-fach-7-Segment-Display und den freien Anschlusspins eine gute Grundlage, Sensoren ausprobieren.

Heute wird ein weiteres Bauteil meiner 37-in-one-Sensoren-Bulk-Bestellung behandelt. Es ist das Temperatur und Luftfeuchtigkeit Sensor Modul KY-015.

Hardware: DHT11 (Modul KY-015)


Auch diesmal galt es wieder, das Modul zu identifizieren, denn eine Bezeichnung fehlte mal wieder. Der Vergleich mit Fotos aus dem Internet war diesmal wegen des charakteristischen blauen Gehäuses des DHT11 einfach und ergab, dass es sich um ein KY-015 handelt, einem Kombi-Modul zur Messung von Temperatur und Luftfeuchtigkeit.

Außer dem DHT11 Modul befindet sich auf der Platine nur noch ein 10 kΩ Pullup Widerstand (soll laut Datenblatt DHT11 eigentlich idealerweise 5 kΩ sein). Das DHT11 vereint ein Thermometer und ein Hygrometer in einem Gehäuse. Mit ihm kann man also sowohl Temperatur als auch Luftfeuchtigkeit messen. Allerdings mit eher bescheidener Genauigkeit. Nachkommastellen darf man hier nicht erwarten.

Die technische Daten lesen sich wie folgt: Temperatur Bereich: 0-50 °C Auflösung: 1 °C (8 Bit) Genauigkeit: ± 2 °C Luftfeuchtigkeit Bereich: 20-90 % RH (relative Feuchte (engl. Humidity) Auflösung: 1 % (8 Bit) Genauigkeit: ± 5 % RH sonstige Eigenschaften * Aktualisierung der Daten alle 1000 ms * Ansprechzeit auf neue Umweltbedingungen: 6-30 Sekunden
Die Anschlusspins des KY-015-Moduls sind die folgenden, von oben nach unten sind dies (Vorderseite oben, Pins rechts): und werden wie folgt an das Multi Function Shield angeschlossen: Modul KY-015 Kabelfarbe MFS/Arduino - (GND) blau GND (3x4 Header) + (+5V) rot +5V (3x4 Header) S (Signal) grau 5 (3x4 Header)

Kommunikation mit dem DHT11

Für die Kommunikation mit dem DHT11 kommt das sogenannte Serial Interface (Single-Wire Two-Way) zum Einsatz, also ein serielles, bidirektionales Protokoll über nur eine Leitung.

Die Übertragung eines Datums umfasst 40 Bit und dauert etwa 40 ms, wobei das höherwertigste Bit zuerst gesendet wird. Nacheinander werden gesendet: Dabei wird die Prüfsumme als Summe der vier ersten 8bit-Datensätze berechnet. Übersteigt sie 255, werden nur die 8 unteren Bits genommen. Mit der Prüfsumme kann die Plausibilität der Datensätze bestätigt werden.

Sobald der Mikrocontroller das Start-Signal an den DHT11 schickt, wacht dieser aus seinem stromsparenden Schlafmodus auf. Sobald das Start-Signal fertig gesendet ist, wechselt die Kommunikationsrichtung an das DHT11 sendet nun die oben beschriebenen 40 Bit. Danach fällt es wieder in den Stromsparmodus. Eine typische Kommunikation sieht dabei in etwa so aus:



Arduino Libraries für den DHT11

Zum Glück müssen wir uns über das genaue Timing keine große Gedanken machen, denn es gibt bereits fertige Bibliotheken von Adafruit zu diesem Sensor. Wer es dennoch genau wissen will, dem seien die frei verfügbaren Datenblätter zu dem Bauteil ans Herz gelegt.


Um auf die Bibliotheken zugreifen zu können, müssen wir sie in der Arduino-IDE über den Biliotheksverwalter hinzufügen.

Das wäre zum einen die "DHT sensor library by Adafruit". Ich setze hier die Version 1.3 ein.

Und da der DHT11 zu den Unified Sensors gehört, wird eine weitere Bibliothek namens "Adafruit Unified Sensor by Adafruit" benötigt, die für alle Unified Sensors gültig ist.

Software

Die Anwendung, die ich für diesen Sensor geschrieben habe, liegt auf der Hand: Über die 7-Segment-Anzeige des MFS werden die Temperatur und Luftfeuchtigkeit angezeigt. Da es keine Nachkommastellen gibt, brauchen wir nur 2 Stellen für die Anzeige der Messdaten. Es bleibt also noch genügend Platz für ein vorangestelltes T für Temperatur oder H für Humidity zur Unterscheidung. Außerdem leuchtet, je nach Messgröße, eine andere LED.

Auch den 3 Tastern wurde wieder eine Funktion gegeben. Sie schalten zwischen 3 Modi um. Modus 1 zeigt ständig die aktuelle Temperatur, Modus 2 tut dies für die Luftfeuchtigkeit und Modus 3 wechselt zwischen beiden Anzeigen hin und her. Ein kurzer Piep bestätigt (ggf. mit ein wenig Verzögerung den Tastendruck). Das Ganze sieht dann so aus:



Source-Code

Und hier noch der Source-Code für das gezeigte Programm:

//////////////////////////////////////////////////////// // (C) 2018 by Oliver Kuhlemann // // Bei Verwendung freue ich mich über Namensnennung, // // Quellenangabe und Verlinkung // // Quelle: http://cool-web.de/arduino/ // //////////////////////////////////////////////////////// #include <TimerOne.h> // für Timings und Interrupts #include <MultiFuncShield.h> // API für das Multi Function Shield #include <Adafruit_Sensor.h> // allgemeine Adafruit-Library #include <DHT.h> // Libraries für DHT-11 #include <DHT_U.h> #define PinData 5 // wo ist Data angeschlossen? #define DurPause 2000 // Pause in ms zwischen den Messungen // der DHT11 liefert nur alle 1s neue Daten #define DHTTYPE DHT11 DHT_Unified dht(PinData, DHTTYPE); // DHT Instanz erzeugen void setup() { Timer1.initialize(); MFS.initialize(&Timer1); // initialize multi-function shield library Serial.begin (115200); dht.begin(); // DHT11 initialisieren } void loop() { int btn = 0; int mode = 3; // Abwechselnd anzeigen char msg[10]; sensor_t sensor; sensors_event_t event; MFS.beep(1, 5, 2); // bereit dht.temperature().getSensor(&sensor); Serial.print ("Sensor: "); Serial.println(sensor.name); while (1) { btn = MFS.getButton(); if (btn == BUTTON_1_PRESSED) { mode = 1; // nur Temperatur MFS.beep(5); } else if (btn == BUTTON_2_PRESSED) { mode = 2; // nur Luftfeuchtigkeit MFS.beep(5); } else if (btn == BUTTON_3_PRESSED) { mode = 3; // beides abwechselnd anzeigen MFS.beep(5); } // Temperatur ///////////////////////////////// if (mode == 1 || mode == 3) { dht.temperature().getEvent(&event); sprintf(msg, "T. %d", (int) event.temperature); MFS.write(msg); MFS.writeLeds(LED_1, ON); MFS.writeLeds(LED_2, OFF); delay(DurPause); } // Luftfeuchtigkeit ///////////////////////////////// if (mode == 2 || mode == 3) { dht.humidity().getEvent(&event); sprintf(msg, "H. %d", (int) event.relative_humidity); MFS.write(msg); MFS.writeLeds(LED_1, OFF); MFS.writeLeds(LED_2, ON); delay(DurPause); } } }