Forum: Mikrocontroller und Digitale Elektronik DHT22 mit NodeMCU auslesen


von Borislav B. (boris_b)


Lesenswert?

Hi,
ich versuche gerade meine NodeMCU (ESP8266) mit einem DHT22 
Temperatursensor in Betrieb zu nehmen. Mein Skript sieht so aus:
1
function GetSensorData()
2
    print( "Trying to get temperature..." )
3
    pin = 4
4
    status, temp, humi, temp_dec, humi_dec = dht.read(pin)
5
    if status == dht.OK then
6
        print("DHT Temperature:"..temp..";".."Humidity:"..humi)
7
    elseif status == dht.ERROR_CHECKSUM then
8
        print( "DHT Checksum error." )
9
    elseif status == dht.ERROR_TIMEOUT then
10
        print( "DHT timed out." )
11
    end
12
end
13
14
-- MAIN
15
tmr.alarm(1, 1000, 1, function() GetSensorData() end)

Das ist quasi 1:1 aus der NodeMCU Doku übernommen.
Verkabelt ist der DHT22 wie folgt:
 + DHT22-VCC -> NodeMCU-3.3V
 + DHT22-GND -> NodeMCU-GND
 + DHT22-DATA -> NodeMCU-D0, D1, D2, D3, D4 (habe alle probiert)

Leider bekomme ich immer nur ein "DHT timed out." :-(
Die Spannung (3.3V) liegt am DHT22 an, das habe ich bereits 
nachgemessen. Mit dem Wert von "pin" habe ich auch herumgespielt, und 
den DHT22 auch schon an andere GPIOs angeschlossen. Alles ohne Erfolg.

Kann mir jemand weiterhelfen?

von Dirk K. (dekoepi)


Lesenswert?

Pin 4 ist GPIO2 - auf dem ESP-01; wo das auf deinem ESP12 (? ist auf den 
meisten NodeMCUs drauf) gemapt ist, weiß ich nicht. Versuche mal, auf 
der Platine den Pin zu finden: 
http://l0l.org.uk/wp-content/uploads/2014/12/ESP12pinout.jpg . Da muss 
Data ran.
Der DHT22 läuft zwar auch ohne, aber gibt schwankende Werte aus, wenn du 
keine 100nF über Vcc und GND lötest.

Auslesen dann via
1
status,temp,humi = dht.readxx(pin)

Ich habe die floating point NodeMCU geflasht.

: Bearbeitet durch User
von Borislav B. (boris_b)


Lesenswert?

Hi Dirk,
ich habe ebenfalls floating point drauf.
Habe anhand deines Schaltplans noch mal gemessen, und es sieht 
eigentlich alles gut aus. Der DHT hängt nun an GPIO2.
Das read habe ich, wie von dir vorgeschlagen, auf readxx geändert.

Leider alles ohne Erfolg :-(
Nach wie vor nur Timeouts...

PS: Einen anderen Sensor habe ich auch ausprobiert, um auszuschließen, 
dass es am DHT22 liegt. Der will aber genausowenig.

PPS: An einem Arduino Uno funktioniert der Sensor bei gleichartigem 
Anschluss auf Anhieb.

: Bearbeitet durch User
von Dirk K. (dekoepi)


Lesenswert?

Hast du ein vollständiges NodeMCU-Board oder einen ESP-12?
Ohne NodeMCU-Peripherie wie LDO und Kondensatoren solltest du noch 
Kapazität an Vcc gen GND packen. Bei meinen ESP-01 habe ich über Vcc 
nach GND: 10+100uF KerKo+100uF Tantal. Damit laufen die dann stabil, 
egal, ob ich die aus einem kleinen LDO oder mit einem Schaltregler auf 
3,3V aus einer 5V-USB-Wandwarze speise. Die 0,1uF für den DHT22 sind 
tatsächlich ein Muss, verbaue die auch mal.

: Bearbeitet durch User
von Borislav B. (boris_b)


Angehängte Dateien:

Lesenswert?

Moin moin,
ich habe eine NodeMCU => Was genau ist denn dann noch an Peripherie 
erforderlich?

Die ganzen Bastel-Anleitungen, die man so im Internet findet, kommen 
komplett ohne zusätzliche Bauteile aus (manchmal 10k Ohm zwischen DATA 
und VCC). Siehe Bild. Daher hätte ich eigentlich erwartet, dass das 
ganze ohne Cs und Rs funktioniert...
Wäre ja seltsam, wenn meine NodeMCU anders wäre, als die der anderen 
Leute ;-)

von Harald (Gast)


Lesenswert?

Steck mal zwischen rot und gelb einen 4,7 kOhm Widerstand.

von Borislav B. (boris_b)


Lesenswert?

Harald schrieb:
> Steck mal zwischen rot und gelb einen 4,7 kOhm Widerstand.

Moin, der PullUp macht keinen Unterschied.
Mittlerweile habe ich das Problem aber gelöst :-)

Was es genau war kann ich leider nicht sagen, da ich zu viele Variablen 
auf einmal geändert habe:
 - Firmware noch mal frisch bauen und flashen. Dabei unbedingt das 
DHT-Modul einziehen. Zusätzlich empfiehlt es sich, die floating-point 
Variante zu wählen.
 - Als Library das original DHT-Modul verwenden. Die anderen Libs die 
man so auf GitHub findet wollten (zumindest bei mir) nicht 
funktionieren.
 - Pinbelegung beachten (ESP8266 vs. NodeMCU vs. Platinenaufdruck), 
siehe oben.

Weitere Bauteile habe ich keine in der Schaltung (weder Cs noch Rs).
Trotzdem läuft es nun stabil, und die Messwerte sind recht genau.

Vielen Dank an euch für die Hilfe!

von Kabelrolle (Gast)


Lesenswert?

> Ich habe die floating point NodeMCU geflasht.

Muss man die selbst zusammenstellen und compilieren oder kann man die 
irgendwo herunterladen?

von Borislav B. (boris_b)


Lesenswert?

Kabelrolle schrieb:
> Muss man die selbst zusammenstellen und compilieren oder kann man die
> irgendwo herunterladen?

Das kannst du ganz einfach online machen:
http://nodemcu-build.com/

Da hakst du die Module an, die du brauchst, startest den Build, und 
wartest ein bisschen. dann kommt ein paar Minuten später eine E-Mail mit 
den Download-Links zu deinem Build (als Integer und FP Version).

Es lebe das Web 2.0 (oder so) ;-)

von Kabelrolle (Gast)


Lesenswert?

Boris P. schrieb:

> Das kannst du ganz einfach online machen:
> http://nodemcu-build.com/

Vielen Dank :)

von Nodemcu-Fan (Gast)


Lesenswert?

Boris P. schrieb:
> - Als Library das original DHT-Modul verwenden. Die anderen Libs die
> man so auf GitHub findet wollten (zumindest bei mir) nicht
> funktionieren.

Welche Datei hast du konkret verwendet? Die originale erzeugt bei mir 
Fehler...

von Nodemcu-Fan (Gast)


Lesenswert?

Ok hat sich erledigt, einfach die eingebaute dht-Routine nehmen...

von Thomas S. (thomasschattat)


Lesenswert?

Hallo,
auch ich hab den DHT22 hier und will damit messen. Mein Problem ist, 
dass ich es wie oben dokumentiert ist angeschlossen habe, 4,7K Pullup 
ist dran, aber der Sensor schweigt.

Mein Messinterval ist 4 Sekunden, dann ziehe ich für etwa 34ms auf GND, 
und der DHT22..... schweigt.

Was ich im Netz gefunden habe, so soll das Startsignal mindestens 18ms 
Low sein, dann sollen die Daten sprudeln.

Mit meinem Scope sehe ich die 34ms GND, dann ein High und das wars.
Muss ich länger/kürzer warten?
Sollte doch alles stimmen, man kann maximal alle 2 Sekunden messen. 
Mindestens 18ms Low hab ich, warum kommt nix?
Klemm ich den Sensor und Pullup ab, so hab ich 0V auf der leitung, also 
mein Pin ist Eingang und der H Pegel kommt vom Pullup.

Hat da jemand einen Tip?

Danke sehr, Gruß
Thomas

von Thomas S. (thomasschattat)


Lesenswert?

Da bin ich nochmal,
die Info mit MINDESTENS 18ms scheint wohl falsch zu sein.
Hab nun etwa 15,6ms und es sprudeln dann Daten.
Also sieht es so aus als wenn man MAXIMAL 18m auf GND darf, dann 
reagiert das Teil.

Guten Abend noch..

Thomas

von Thomas S. (thomasschattat)


Lesenswert?

Und noch eine Effekt:
Sollte man zu lang auf Low ziehen so scheint der Sensor "bockig" zu 
sein.
Es kommt dann auch nichts mehr wenn man wieder korrekt started.
Es muss mal ausgeschaltet werden, dan klappt es wieder.
Also: Start Low muss zwischen 0,5 und 18ms sein.

Thomas

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
Noch kein Account? Hier anmelden.