DHT21 / AM2301 Sensor misst keine Feuchtigkeit

Ich versuche, ein DHT21 mit einem Lamobo R1 alias Banana PI R1 zu verwenden, um Temperatur und Luftfeuchtigkeit zu lesen, mit Armbian/Jessie und einem 4.5.2-Kernel. Ein Lamobo R1 ist im Grunde ein A20-Board, das mit einem Raspberry Pi kompatibel ist, mit einem umgekehrt kompatiblen Raspberry Pi 2-Bus.

Ich habe es in GPIO5, Himbeer-Pin-kompatibel 24, WirinPi 5, physischer Pin 18, gemäß einer Tabelle hier , plus den GND- und +5V-Pins eingerichtet.

Ich habe versucht, die Temperatur und Luftfeuchtigkeit mit und ohne den empfohlenen Widerstand abzulesen. Während die Temperatur gut abgelesen wird und auch durch einen an GPIO2 angeschlossenen DS18b20-Sensor bestätigt wird, liegt die Luftfeuchtigkeit immer bei 99,9 %.

Ich habe die WiringPi-kompatible Bibliothek aus dem WiringBP- Repository installiert.

Wenn ich jedoch zum Beispiel DHT21-AM2301 oder lol_dht22 verwende , habe ich immer die Ausgabe der Luftfeuchtigkeit als 99,9 % oder 99,90 %

Ein benutzerdefiniertes Kernel-Modul für diesen Chip, am2301 hängt einfach die Maschine auf.

Was ich bisher gefunden habe ist:

  • Es scheint mit Raspberry und Arduino zu funktionieren;
  • Das DHT21 reagiert sehr empfindlich auf Timings, selbst in der ursprünglichen Himbeere;
  • Einige Leute berichteten, dass es nur in GPIO1 und GPIO2 in der ursprünglichen Himbeere funktionierte, während die anderen GPIOs eine viel größere Latenz hatten;
  • Es gibt ein viel komplizierteres Hardware-Setup, um es mit einem I2C zu verbinden, an dem ich nicht besonders interessiert bin;
  • Einige Leute vermuten auch, dass es nur mit Kernel 3 funktioniert;
  • Der Lamobo R1 scheint standardmäßig einen Pullup-Pin-Bus zu haben;
  • Aufgrund von Chipsatz-Beschränkungen können nur alle Sekunden gelesen werden;
  • Die physische Implementierung des R1-Busses im Vergleich zum rpi ermöglicht es mir, ohne den Widerstand auszukommen;
  • Die Grenze des Kabels scheint 25 m zu sein, und es gibt anekdotische Geschichten von Leuten, die mit UTP-Kabeln 60 m erreicht haben. Meine ist nicht länger als 20 cm;
  • Es kann aufgrund der Aufrechterhaltung des chemischen Gleichgewichts nicht direktem Sonnenlicht ausgesetzt werden;
  • Das chemische Gleichgewicht verschlechtert sich mit der Zeit (2-3 Jahre?).

Hat jemand noch etwas hinzuzufügen?

Zusätzliche Anmerkungen gemäß Kommentar:

  • Feuchtigkeit kommt zuerst als Temperatur;
  • Wie @ChrisStratton richtig theoretisiert hat, sind Feuchtigkeitsbits alle 1;
  • Ich habe bereits zwei DHT21-Sensoren mit den gleichen Ergebnissen getestet.

Die Ausgabe von

gpio readall

Ist

+----------+-Rev3-+------+--------+------+-------+  
| wiringPi | GPIO | Phys | Name   | Mode | Value |  
+----------+------+------+--------+------+-------+  
|      0   |  17  |  11  | GPIO 0 | IN   | Low   |  
|      1   |  18  |  12  | GPIO 1 | IN   | High  |  
|      2   |  27  |  13  | GPIO 2 | IN   | Low   |  
|      3   |  22  |  15  | GPIO 3 | IN   | Low   |  
|      4   |  23  |  16  | GPIO 4 | IN   | Low   |  
|      5   |  24  |  18  | GPIO 5 | OUT  | High  |  
|      6   |  25  |  22  | GPIO 6 | IN   | Low   |  
|      7   |   4  |   7  | GPIO 7 | IN   | Low   |  
|      8   |   2  |   3  | SDA    | ALT5 | High  |  
|      9   |   3  |   5  | SCL    | ALT5 | High  |  
|     10   |   8  |  24  | CE0    | IN   | Low   |  
|     11   |   7  |  26  | CE1    | IN   | Low   |  
|     12   |  10  |  19  | MOSI   | ALT5 | Low   |  
|     13   |   9  |  21  | MISO   | ALT5 | Low   |  
|     14   |  11  |  23  | SCLK   | ALT5 | Low   |  
|     15   |  14  |   8  | TxD    | ALT0 | Low   |  
|     16   |  15  |  10  | RxD    | ALT0 | Low   |  
|     17   |  28  |   3  | GPIO 8 | IN   | Low   |  
|     18   |  29  |   4  | GPIO 9 | ALT4 | Low   |  
|     19   |  30  |   5  | GPIO10 | OUT  | High  |  
|     20   |  31  |   6  | GPIO11 | ALT4 | Low   |  
+----------+------+------+--------+------+-------+  

r1foto

Der Versuch, einen seriellen Bus von Anwendungssoftware unter einem Multitasking-Betriebssystem zu bitbangen, kann schwierig sein, da es schwierig ist, ein präzises Timing zu erreichen. Im Allgemeinen wäre es besser, die Aufgabe an eine Hardware-Engine (wie den I2C-Block, obwohl dieser Chip nicht nativ I2C ist) oder einen Kernel-Modus-Treiber zu delegieren. Das Debuggen des Kernel-Treibers könnte ein lohnendes Projekt sein - holen Sie sich printk's hinein und sehen Sie, was passiert. Sie können auch ein Oszilloskop auf der Datenleitung verwenden. In vielen Fällen hilft ein billiger cy7c68013-basierter Logikanalysator, aber dieses Signal könnte analoge Probleme haben, die einen Oszilloskop erfordern.
Wenn Sie verzweifelt sind und nur Ergebnisse wünschen, können Sie eine billige MCU als Delegierten verwenden, um den Sensor zu lesen und dann über ein UART, I2C, SPI usw. an das eingebettete Linux-Board zurückzumelden - dies gibt Ihnen auch einen einfachen Punkt der Kompatibilität zum Austauschen von Systemen auf beiden Seiten, ein einziger Punkt für jede erforderliche Spannungsumwandlung usw.
Sie können auch versuchen, den Code rückwärts durchzuarbeiten und zu sehen, welche Art von rohem Bitmuster vom Sensor für eine angebliche 99% Luftfeuchtigkeit verantwortlich wäre. Muster wie nur Einsen oder Nullen sind als Kommunikationsprobleme höchst verdächtig.
@ChrisStratton Ich habe den Code tatsächlich befolgt. Interessanter Leckerbissen, Feuchtigkeit kommt zuerst und Temperatur zuletzt. Es scheint tatsächlich eine Situation für alle zu sein. Ich werde in den nächsten Tagen eine andere DHT21 testen, um zu sehen, ob es sich zufällig um ein defektes Gerät oder ein Timing-Problem handelt. Ich kenne Lamobo auch standardmäßig als Pullup-Bus ... vielleicht eine Codezeile oder ein Setup. werde erstmal eine andere DHT21 ausprobieren.

Antworten (3)

Laut Datenblatt sind die DHT21 -Timings mit 3,3 V kürzer und mit 5 V länger. Ich habe es von 5 V auf 3,3 V umgestellt und jetzt liest es die Luftfeuchtigkeit richtig ab. Es scheint, dass, während Sie es im Arduino bei 5 V haben, die Softwareseite / Routinen für den Bananen-Pi und die Himbeere davon ausgehen, dass es bei 3,3 V angeschlossen ist.

Von der in der Frage erwähnten Software scheint die schnellste lol_dht22 zu sein. Ich verwende eine leicht geänderte Version davon (von mir selbst), die ungefähr alle 9-10 Sekunden Dateien in /var/run erstellt, um rpimonitor zu füttern .

Temp

Wie @ChrisStratton richtig sagt, ist diese Methode des Bit-Banging/Polling sehr fehleranfällig, insbesondere wenn sie im Benutzerland ausgeführt wird.

Die vom DHT21 implementierte einfache Protokollprüfsumme ist eindeutig nicht stark genug, um die meisten Fehler/Spitzen (und es gibt viele) auszusortieren. Ich musste einfache Software-Korrekturroutinen hinzufügen, um falsche Werte zu ignorieren, und selbst dann gibt es Spitzen.

Der Code zum Auslesen der DHT11/DHT21/DHT22-Sensoren befindet sich auf meinem Github https://github.com/ruyrybeyro/rdht .

Graph

Ich war auch im Zweifel, ob ich die R1-Gerätebaumkonfiguration berühren müsste, wie ich es getan habe, um das 1Wire-Protokoll mit einem anderen Temperatursensor zu konfigurieren. Es wurde nicht benötigt.

Als zusätzlicher Hinweis ist Vorsicht geboten, wenn Sie Schaltplänen online blind folgen. Während der Arduino-Bus mit +5 V arbeitet, arbeiten Raspberry und kompatible Geräte mit +3 V; Während dies beim DHT21 anscheinend nicht der Fall ist (ich betone anscheinend, da der R1-Bus widerstandsfähiger ist als der RPI-Bus), kann die Speisung zufälliger Geräte / Sensoren von + 5 V, die an einen RPI-Bus angeschlossen sind, potenziell schädlich für Ihren SBC sein.

Die gemessene(n) Temperatur(en) scheinen auch durchgängig höher als +2 Grad Celsius zu sein, als sie sein sollten, und diese Temperaturinkonsistenzen werden von vielen anderen gemeldet, die DHT21-Geräte verwenden.

Ich freue mich zu hören, dass Sie einigen Erfolg hatten, aber ich möchte weiterhin im Allgemeinen davor warnen, etwas mit bestimmten Timing-Anforderungen aus Code im Benutzermodus zu bitbangen, der variablen Verzögerungen hinter den Kulissen unterliegt. Sie riskieren ein System, das zeitweise ausfällt, oder eines, das erheblich ausfällt, wenn sich etwas scheinbar Unabhängiges ändert - zum Beispiel funktioniert es möglicherweise nicht, wenn der Kernel in einem Netzwerk mit vielen Broadcast-Paketen berücksichtigt werden muss.
@ChrisStratton Danke für all die Einblicke und für deine Zeit.
möglicherweise kann diese Bibliothek auch helfen: github.com/RobTillaart/DHTNEW , insbesondere bei der ESP32-Neublockierung

Der Feuchtigkeitsmesswert beträgt 99,9 %, wenn Sie den Sensor mit 5 V versorgen. Versuchen Sie, es mit 3,3 V zu versorgen, und es wird funktionieren. Ich habe eine Schaltung mit einer MCU auf 5 V getestet und nur wenn der AM2301 auf 3,3 V liegt, funktioniert er wie erwartet.

Das sagt meine eigene Antwort im 1. Absatz. Es könnte mehr sein, es hängt von den Eigenschaften des Sensors, der Ausstattung und davon ab, wie stark die CPU mit dieser Lesemethode belastet wird.

Ich denke, das Hauptproblem liegt nicht in der Versorgungsspannung oder einem zusätzlichen Widerstand. Das Hauptproblem ist die Verzögerungszeit. Docs sagt

  • Die Erfassungsperiode sollte sein: >1,7 Sekunden.

Wenn Sie also eine Verzögerungszeit von 5000 ms hinzufügen, wurde mein Problem behoben. Ich habe mit dht21 getestet

Danke, ich bin mir der Wartezeit zwischen den Abfragen bewusst. Außerdem variieren die Timings mit der Spannung und einige APIs sind mit festen Zeiten fest codiert. Das war eines der Probleme.