DHT22 an Raspi mit pigpio einbinden

Begonnen von crusader, 23 Oktober 2018, 02:01:05

Vorheriges Thema - Nächstes Thema

crusader

Die Messgenauigkeit des DHT22 soll angeblich mit wesentlich teureren Sensoren mithalten können (s. https://www.kandrsmith.org/RJS/Misc/Hygrometers/calib_dht22_dht11_sht71.html).

Für lokale Anwendungen mit nicht allzu langem Kabel lässt er sich direkt an den GPIO-Ports eines Raspi betreiben.

Allerdings bringt er eine Reihe von Nachteilen mit sich:

1) Der Kernel-Treiber in Raspbian funktioniert nicht. Man muss den DHT22 also irgendwie im Userland ansteuern und das geht immer dann schief, wenn die Task unterbrochen wird. Die üblichen Treiber versuchen das durch Wiederholversuche zu kompensieren.

2)Mit einer Messwert-Abfrage wird eine neue Messung angestossen, die dann parallel zur Daten-Kommunikation stattfindet. Dadurch ergeben sich leichte Schwankungen des Messwerts. Das muss durch Mittelung über mehrere Messungen kompensiert werden.

3)Der übertragene Messwert ist derjenige, der bei der vorhergehenden Abfrage angestossen wurde und damit nicht mehr aktuell. Bei längeren Pausen zwischen den Abfragen muss der erste Messert also ignoriert werden.

4)Der Sensor kann gelegentlich komplett abstürzen und lässt sich auch durch neue Anfragen nicht mehr zurücksetzen. Es ist dann ein HW-Reset erforderlich.

Die beschriebenen Probleme lassen sich mithilfe des pigpio-Dämons lösen, der eine zeitgenaue Port-Abfrage im µs-Bereich auch im Userland zulässt.
Die dadurch entstehende CPU-Last ist allerdings nicht unerheblich.

Vorgehensweise:

1.
pigpio-module installieren:
apt-get install pigpio python-pigpio python3-pigpio

2.
angehängte Datei DHT22.py auf ein Verzeichnis kopieren, das von FHEM erreichbar ist und ausführbar machen.

3.
DHT22 anschliessen
GND -> Ground
VCC -> freier GPIO-Pin*
DATA -> freier GPIO-Pin

*Der Treiber entdeckt einen abgestürzten Sensor und setzt ihn über den VCC-Pin zurück.

4.
Device anlegen:
define DHT22_<ID> at +*00:02 "<path-to-script>/DHT22.py <DATA-GPIO> <VCC-GPIO>  <ID>&"

<ID> ist eine frei wählbare Bezeichnung zur Unterscheidung bei mehreren angeschlossenen Sensoren.
Das at-Device ruft in regelmäßigen Abständen den Treiber auf.
Dieser nimmt 5 Messungen vor und trägt den Mittelwert als reading 'temperature' bzw. 'humidity' direkt in das device ein (Dauer etwa 20s).
Die Anzahl durchgeführter Resets wird als reading 'resets' ebenfalls eingetragen.

Getestet auf Raspi 3B+ / Stretch.

mumpitzstuff

Deine Devices müssen mit DHT22_ beginnen, damit das Script die Daten richtig schickt. Wäre es nicht sinnvoller anstatt der ID gleich den vollen Namen zu übergeben? Dann wäre das Script universeller. Außerdem würde ich an deiner Stelle etwas robusteres als den Mittelwert verwenden. Bei einem Ausreißer liegst du auch mit dem Mittelwert ziemlich weit daneben. Ich würde stattdessen den Median verwenden.
Das Abstürzen der Sensoren lässt sich vielleicht verhindern, wenn man 3s anstatt 2s zwischen den Abfragen wartet (2s ist grad das absolute Minimum). Damit laufen die Dinger bei mir seit Jahren, ohne jemals abgestürzt zu sein.

crusader

Werde ich gerne ändern, falls Bedarf besteht.

Das Messintervall ist übrigens auf 3 s eingestellt. Resets habe ich dabei auch noch nicht beobachtet.

Wer auf das Reset-Feature verzichten möchte, kann den VCC-Pin auch direkt mit 3.3V verbinden und für den <VCC-GPIO>-Parameter None eintragen.