Forum: Mikrocontroller und Digitale Elektronik nan im seriellen-Monitor


von heike (Gast)


Lesenswert?

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

von heike (Gast)


Lesenswert?

Dritte Zeile natürlich DHT22 statt 11

von Andreas S. (igel1)


Lesenswert?

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

von Andreas S. (igel1)


Lesenswert?

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

von Walter S. (avatar)


Lesenswert?

heike schrieb:
> Serial.print("Reading sensor");
>   dht.begin();
>   Serial.begin(9600);

es ist sinnvoll Serial.begin aufzurufen vor Serial.print

von heike (Gast)


Lesenswert?

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?!

von Andreas S. (igel1)


Lesenswert?

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
von Andreas S. (igel1)


Lesenswert?

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

von heike (Gast)


Lesenswert?

Juhhu jetzt funktioniert.
Tausend Dank dafür!!!

von Andreas S. (igel1)


Lesenswert?

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