Hallo. Ich habe mir ein DHT22 Sensor gekauft und wollte Temperatur und Luftfeuchte messen. Dazu verwende ich diesen Code: #include "DHT.h" #define DHTPIN 12 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.print("Reading sensor"); dht.begin(); Serial.begin(9600); } void loop() { float humidity = dht.readHumidity(); float temp= dht.readTemperature(); Serial.print("T:"); Serial.print(temp); Serial.print("C "); Serial.print("H: "); Serial.print(humidity); Serial.println("%"); } Im Seriellen Monitor wird aber immer nur nan bei temp und und humidity angezeigt. Ich verstehe nicht wo mein Fehler ist. Hat jemand Tipps, die mir eiter helfen? Fg. Heike
Wann bekommt man das im Leben schon mal gesagt: Du bist zu schnell :-) Der Sensor benötigt nach der Initialisierung etwas Zeit, um sich zu sortieren. Spendier also nach dem dht.begin() mal ein bißchen delay:
1 | dht.begin(); |
2 | delay(1000); |
Sodann bist Du auch beim Abfragen in der Schleife zu fix. Spendier auch dort delay's. Wieviel delay minimal benötigt wird, kannst Du dem Datenblatt des DHT22 entnehmen. Alternativ findest Du aber auch 1000 Beispiel-Codes für den DHT22 im Internet. Wenn's dann noch immer nicht klappt, so gab's nach meiner Erinnerung noch einen Bug in der DHT-Library. Den schau ich gerne nach, wenn's nach dem delay's-Einfügen immer noch nicht klappt. Viele Grüße & good luck Igel1
Ah ja - hab's gefunden: https://github.com/adafruit/DHT-sensor-library/issues/48 Dort wird sehr schön aufgezeigt, wo ein Bug in der DHT-Library von adafruit steckt (die verwendest Du vermutlich, gelle?). Empfohlen wird eine Korrektur in der Library:
1 | Luckily this bugfix is as easy as commenting out two lines, see below: |
2 | |
3 | ''' |
4 | // End the start signal by setting data line high for 40 microseconds. |
5 | // digitalWrite(_pin, HIGH); |
6 | // delayMicroseconds(40); |
7 | // WEB: This is an error. DHT tries to pull the line low as soon as it came back to high. |
8 | // therefore the low-high transition after the start signal "low" needs to be realised by |
9 | // the pullup resistor only, uC pin must already be in INPUT mode. |
10 | ''' |
11 | See attached before-after scope screenshots |
Viel Glück Andreas
heike schrieb: > Serial.print("Reading sensor"); > dht.begin(); > Serial.begin(9600); es ist sinnvoll Serial.begin aufzurufen vor Serial.print
Danke erstmal. Ich habe mir dazu das geladen https://github.com/adafruit/DHT-sensor-library/releases . Läuft drotzdessen nicht Ich verstehe nicht wie ich den bug beheben kann?!
Walter S. hat Recht, der Setup-Teil muß so aussehen:
1 | void setup() { |
2 | Serial.begin(9600); |
3 | Serial.print("Reading sensor"); |
4 | dht.begin(); |
5 | delay(1000); |
6 | } |
Bitte prüfe aber auch noch einmal die Verdrahtung Deines Sensors. Wenn Du auf den Sensor von vorne auf das "Gitter" draufschaust, so ist: Pin1 (ganz links): VCC - der muß also an Betriebsspannung (irgendwas zwischen 3,3V - 5,3V) Pin2: Data - der muß also mit PIN12 auf Deinem Arduino verbunden werden Pin3: NC - NC=not connected, will sagen: einfach frei lassen Pin4 (ganz rechts): GND - Ground oder Masse oder 0V - alles dasselbe. Muss mit GND des Arduino verbunden werden. Und wichtig: Widerstand nicht vergessen. Laut Datenblatt .... https://cdn-shop.adafruit.com/datasheets/Digital+humidity+and+temperature+sensor+AM2302.pdf ... gehört ein 1k Widerstand zwischen VCC (also der Versorungsspannung) und Data (also Pin2) vom Sensor. Wenn Du alles geprüft hast, so probier Dein modifiziertes Programm nochmals. Viele Grüße Igel1
:
Bearbeitet durch User
Und was den Bugfix der Library angeht, so funktioniert das wie folgt: 1.) Du gehst in dasjenige Verzeichnis, in dem Du das DHT.zip, also Deine Library, entpackt hast. 2.) Dort findest Du eine Datei DHT.cpp, die den eigentlichen Code Deiner Library enthält. 3.) In besagter Datei DHT.cpp findest Du in Zeile 154-156 die folgenden Zeilen:
1 | // End the start signal by setting data line high for 40 microseconds. |
2 | digitalWrite(_pin, HIGH); |
3 | delayMicroseconds(40); |
Dort kommentierst Du die 2 unteren Zeilen aus:
1 | // End the start signal by setting data line high for 40 microseconds. |
2 | // digitalWrite(_pin, HIGH); |
3 | // delayMicroseconds(40); |
4.) Abspeichern 5.) Sketch neu kompilieren und flashen Bitte diese Anpassung als letztes anwenden - also dann, wenn alles andere nicht mehr hilft. Viele Grüße Igel1
heike schrieb: > Juhhu jetzt funktioniert. > Tausend Dank dafür!!! Supi - Gratulation zu Deinem Erfolg! Mit funktionierendem DHT22 wird eine große Klimaforscherin aus Dir werden :-) Aber bitte verrate uns noch, woran es letztendlich gelegen hat ... Viele Grüße Igel1
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.