Schlagwort-Archive: dht22

Wer viel misst, misst viel Mist

Im Falle dieses Artikels bezieht sich der Titel auf das Messen von Temperatur und relativer Luftfeuchtigkeit mit einem DHT22-Sensor (AM2302).

Im Rahmen eines kleinen Wochenend-Projekts möchte ich mit Hilfe des genannten Sensors, der Open-Source-Plattform NodeMCU V3 und einem Raspberry Pi eine Raumklimaüberwachung für unsere Wohnung basteln. Der NodeMCU V3 mit aufgesetztem ESP8266 scheint dazu gut geeignet, da er dank integriertem WLAN die aufgezeichneten Messdaten direkt an eine zentrale Instanz übertragen kann. An dieser Stelle beschreibe ich, wie ich dabei vorgegangen bin, welche Komponenten zum Einsatz kamen, wie der Prototyp funktioniert, welche Erkenntnisse ich dabei gewonnen habe und was ich damit in Zukunft anzustellen gedenke.

Vorwort zum Prototyp

Für meine Bastelei verwende ich am liebsten den DHT22-Sensor. Dieser ist günstig und liefert eine hinreichende Genauigkeit. Mir ist jedoch in der Vergangenheit aufgefallen, dass einzelne Exemplare in ihren Messwerten teils deutlich nach oben oder unten ausreißen.

Um nun herauszufinden, ob sich in der jüngsten Charge wieder ein paar Ausreißer befinden, habe ich mich für einen demokratischen Ansatz entschieden. Dabei schließe ich mehrere Sensoren an den gleichen Mikrocontroller an und messe mit ihnen am gleichen Ort. Theoretisch dürfen die Messwerte nur in dem angegebenen Toleranzbereich von maximal +/- 5% RH und +/- 0,5 °C abweichen. Mit der parallelen Anordnung von vier Sensoren kann ich erkennen, ob einer aus der Reihe tanzt.

Vorbereitung der Plattform

Als Firmware für den ESP8266 habe ich ESPEasy ausgewählt. Das Projekt verfügt über ein gut strukturiertes Wiki, welches in englischer Sprache erklärt, wie man die Firmware auf den ESP8266 installiert.

Aufbau des Prototyps

Für den Aufbau habe ich zwei kĺeine Steckbretter und ein NodeMCU V3 verwendet. Der Aufbau wird im folgenden Bild dargestellt. Da dies mein erster Versuch war, einen Aufbau zu modellieren, bitte ich um etwas Nachsicht.

dht22-on-esp8266

Aufbau des Prototypen

Es wurden Pull-Up-Widerstände mit einem Widerstand von 10k Ohm verwendet und an die GPIO-PINs 12, 13, 14 und 16 angeschlossen.

Eine Übersicht über alle zur Verfügung stehenden PINs bietet das folgende Bild:

PIN-Belegung des NodeMCU

Wurde die Schaltung wie im obigen Bild aufgebaut, verbindet man sich mit der Weboberfläche des ESPEasy und konfiguriert diesen entsprechend. Eine ausführliche Dokumentation zum Webinterface findet man unter der URL https://www.letscontrolit.com/wiki/index.php/ESP_Easy_web_interface.

In meinem Aufbau erscheinen die Sensoren nach erfolgreicher Konfiguration wie folgt unter „Devices“ im Webinterface.

Devices im Webinterface des ESPEasy

Die meisten Schritte sind intuitiv zu bearbeiten. Lediglich zur Konfiguration des Template-Strings, welcher zur Übertragung der Messwerte an einen Webserver verwendet wird, habe ich etwas länger gebraucht. Ich verwende dazu folgenden Publish-Template-String, welcher unter Tools -> Advanced -> Publish Template eingetragen wird.

import.php?name=%sysname%&task=%tskname%&valuename=%valname%&value=%value%

Das folgende Listing zeigt, wie die HTTP-GET-Anfragen beim Webserver ankommen:

192.168.x.x 192.168.x.x - [07/Jun/2017:20:44:05 +0200] "GET /import.php?name=esp8266%5fdht22%5f2&task=DHT22%2d1&valuename=Temperature&value=22.00 HTTP/1.1" 200 411 "-" "-"
192.168.x.x 192.168.x.x - [07/Jun/2017:20:44:06 +0200] "GET /import.php?name=esp8266%5fdht22%5f2&task=DHT22%2d1&valuename=Humidity&value=43.60 HTTP/1.1" 200 411 "-" "-"
192.168.x.x 192.168.x.x - [07/Jun/2017:20:44:07 +0200] "GET /import.php?name=esp8266%5fdht22%5f2&task=DHT22%2d2&valuename=Temperature&value=22.00 HTTP/1.1" 200 411 "-" "-"
192.168.x.x 192.168.x.x - [07/Jun/2017:20:44:08 +0200] "GET /import.php?name=esp8266%5fdht22%5f2&task=DHT22%2d2&valuename=Humidity&value=44.30 HTTP/1.1" 200 411 "-" "-"
192.168.x.x 192.168.x.x - [07/Jun/2017:20:44:09 +0200] "GET /import.php?name=esp8266%5fdht22%5f2&task=DHT22%2d3&valuename=Temperature&value=22.10 HTTP/1.1" 200 411 "-" "-"
192.168.x.x 192.168.x.x - [07/Jun/2017:20:44:10 +0200] "GET /import.php?name=esp8266%5fdht22%5f2&task=DHT22%2d3&valuename=Humidity&value=55.20 HTTP/1.1" 200 411 "-" "-"
192.168.x.x 192.168.x.x - [07/Jun/2017:20:44:11 +0200] "GET /import.php?name=esp8266%5fdht22%5f2&task=DHT22%2d4&valuename=Temperature&value=22.00 HTTP/1.1" 200 411 "-" "-"
192.168.x.x 192.168.x.x - [07/Jun/2017:20:44:12 +0200] "GET /import.php?name=esp8266%5fdht22%5f2&task=DHT22%2d4&valuename=Humidity&value=44.30 HTTP/1.1" 200 411 "-" "-"

Der Aufbau des Prototyps ist damit im Wesentlichen abgeschlossen.

Erstellung der import.php

In meinem Heimnetzwerk befindet sich bereits ein Raspberry Pi, auf welchem ein kleiner Webserver (lighttpd) läuft. Für diesen erstelle ich ein kleines Import-Skript, welches die Messdaten einsammelt und in eine Datei schreibt.

Für die Erstellung der Datei „import.php“ nehme ich an, dass die Ergebnisse der vier Sensoren stets in der gleichen Reihenfolge übermittelt werden. Da jeweils Temperatur und Luftfeuchtigkeit gemessen werden, überträgt der ESP8266 acht Werte pro Messintervall. Diese sollten mit einem Zeitstempel in eine Zeile einer CSV-Datei geschrieben werden. Dafür kommt aktuell das folgende Skript zum Einsatz:

switch ($_GET[„task“]) {
case „DHT22-1“:
if ($_GET[„valuename“] == ‚Temperature‘) {
$data = date(‚Y-m-d‘). „T“ . date(‚H:i:s‘, time()) . „,“ . $_GET[„value“] . „,“;
} else {
$data = $_GET[„value“] . „,“;
}
break;
case „DHT22-2“:
if ($_GET[„valuename“] == ‚Temperature‘) {
$data = $_GET[„value“] . „,“;
} else {
$data = $_GET[„value“] . „,“;
}
break;
case „DHT22-3“:
if ($_GET[„valuename“] == ‚Temperature‘) {
$data = $_GET[„value“] . „,“;
} else {
$data = $_GET[„value“] . „,“;
}
break;
case „DHT22-4“:
if ($_GET[„valuename“] == ‚Temperature‘) {
$data = $_GET[„value“] . „,“;
} else {
$data = $_GET[„value“] . „\n“;
}
break;
}

print($data);
file_put_contents(‚/var/www/dht22data.csv‘, $data, FILE_APPEND);

 

Erste Erkenntnisse

Im aktuellen Aufbau werden die Messwerte alle 5 Minuten an den Webserver übertragen. Die empfangenen Daten habe ich mit LibreOffice Calc geöffnet und etwas aufbereitet:

Erste Messergebnisse (aufbereitet)

Die Messwerte wurden auf ganze Zahlen gerundet. Es lässt sich erkennen, dass tatsächlich ein Sensor aus der Reihe tanzt. Der DHT22-3 weicht bei der Luftfeuchtigkeit um 9-11 Prozentpunkte nach oben ab. Das ist erstmal nicht weiter schlimm, jedoch gut zu wissen. Ich werde die nächste Zeit beobachten, wie sich diese Abweichung bei wechselnden Temperaturen entwickelt.

Entweder passe ich die gemessenen Werte an, indem ich in der Weboberfläche einen festen Faktor zu den gemessenen Werten hinzurechne bzw. abziehe oder ich sondere den Sensor aus, sollte die Abweichung zu stark schwanken.

Ausblick

Die nächsten Tage werde ich den Prototyp in seiner aktuellen Konfiguration weiterlaufen lassen. Anschließend beschaffe ich mir ein paar kleine Gehäuse, um jeweils einen Sensor mit einem Controller zusammen einzusetzen und in der Wohnung aufzustellen. So weiß ich in Zukunft schon vorher, ob es sich lohnt, die Wohnung zu betreten oder ich lieber gleich in den Garten gehe.

Darüber hinaus habe ich noch eine Handvoll weiterer DHT22-Sensoren. Diese werde ich ebenfalls auf einem Steckbrett anordnen und sie an einen Raspberry Pi anschließen. Ich werde bei diesen das gleiche Verfahren anwenden, um Ausreißer erkennen zu können.