Forum: Mikrocontroller und Digitale Elektronik DHT22: Datenblatt + Pegel passt nicht / ungenau


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Sef C. (sefco)


Angehängte Dateien:

Lesenswert?

Guten Abend,

ich habe mir DHT22 Temperatur/Luftfeutigkeits Sensoren besorgt mit 
1-Wire Interface. Datenblatt im Anhang. Ich nutze einen Atmega328P und 
Microchip Studio. Es gibt verschiedene Bibliotheken im Internet um den 
Sensor anzusteuern.
Im Anhang mal die Pegel der Leitung aufgezeichnet.

Die Probleme fangen schon mit der Startsequenz (Datenblatt Seite 4) an. 
Es soll der Bus zwischen 1 und 18 ms auf low gezogen werden. Mit 1 - 2 
ms langen Pulsen reagiert der Sensor, sonst nicht. Ich ziehe den Bus 
also 2 ms auf low. Laut Datenblatt soll dann 20 - 40 us high folgen und 
abgewartet werden. Man sieht im Anhang, dass dies nur wenige 
Mikrosekunden sind, in diesem Fall 3 us. Das ganze ändert sich je nach 
dem wie lange ich zuvor low gehalten habe. Anschließend soll vom Sensor 
80 us low und 80 us high folgen und dann kann man 40 bits auslesen. 
Diese 80 us los und 80 us high existieren nicht.
Die Bit soll man auslesen, in dem man die high länge misst (26-28 us 
high = 0, 70 us high = 1)

Die Bits sehen an sich okey aus, wobei Ungenauigkeiten von 5 us 
auftreten.

Jetzt stellen sich mir folgende Fragen: Habe ich ein falsches Datenblatt 
oder ist der Sensor einfach nur Müll? Wie bekommen andere sowas 
zuverlässig ans laufen? Keine der von mir runtergeladenen Libraries 
funktioniert und man bekommt sofort Timeout Errors, weil der Sensor 
gefühlt tut was er will, gerade bei der Startsequenz. Ich habe kein 
Problem damit das Protokoll anzupassen aber mir stellt sich zusätzlich 
die Frage wie genau dieser angeblich kalibrierter Sensor ist, wenn nicht 
mal die Startsequenz nach Datenblatt arbeitet.

von Joachim B. (jar)


Lesenswert?

Sef C. schrieb:
> Ich nutze einen Atmega328P

auch Abblock Kondensatoren (VCC-GND)?
wie groß ist der pullup an Data, wie lang die Leitungen?

von Sef C. (sefco)


Lesenswert?

Joachim B. schrieb:
> auch Abblock Kondensatoren (VCC-GND)?
> wie groß ist der pullup an Data, wie lang die Leitungen?

Flying-Wire Verdrahtung mit hübschen 10 cm Leitungen :P
Pull-up 4.7k.

Die Bits kommen ja ganz okey daher mit ein paar us Fehler, deswegen 
glaube ich nicht das ein direkter Abblockkondensator da irgendwas 
rettet.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Sef C. schrieb:
> Man sieht im Anhang
Hast du das Signal auch mal mit dem Oszi angeschaut? Sieht das 
ordentlich aus? Hast du stetige Flanken ohne "Stufen" darin? Ist die 
steigende Flanke "steil" genug?

Da gibts noch mehr dieser eigenartigen Datenblätter, die zwar hübsch 
grafisch aufbereitet sind, aber keine bruachbaren Timing-Spezifikationen 
mit min. und max. Werten beinhalten:
https://www.mikrocontroller-elektronik.de/dht22-am2302-luftfeuchte-und-temperatursensor/

Das Protokoll hinter diesen Dingern ist übrigens an das 
Onewire-Protokoll (1-wire) angelehnt. Wer die Dinger ans Laufen bekommt, 
hat sicher schon mal von diesem Protokoll der Fa. Dallas gehört

von Sef C. (sefco)


Lesenswert?

Joachim B. schrieb:
> auch Abblock Kondensatoren (VCC-GND)?

...falls du den uC meintest, das ist ein Arduino Nano auf Breakout-Board 
mit entsprechenden Kondensatoren.

von Sef C. (sefco)


Lesenswert?

Lothar M. schrieb:
> Da gibts noch mehr dieser eigenartigen Datenblätter, die zwar hübsch
> grafisch aufbereitet sind, aber keine bruachbaren Timing-Spezifikationen
> mit min. und max. Werten beinhalten:
> 
https://www.mikrocontroller-elektronik.de/dht22-am2302-luftfeuchte-und-temperatursensor/

Die Timings sind in den unterschiedlichen Datenblättern die ich 
gesichtet haben gleich gewesen.

von my2ct (Gast)


Lesenswert?

Sef C. schrieb:
> ich habe mir DHT22 Temperatur/Luftfeutigkeits Sensoren besorgt mit
> 1-Wire Interface

Die haben kein 1-Wire Interface, jedenfalls nicht das, was unter der 
Bezeichnung "1-Wire" von Dallas eingeführt wurde.
https://de.wikipedia.org/wiki/1-Wire

von Jens H. (jensh22)


Lesenswert?

Ich habe hier so ein Teil an einem Wemos mit der Adafruit DHT sensor 
library 1.4.2 (https://github.com/adafruit/DHT-sensor-library)laufen. 
Kompiliert mit der Arduino IDE, ging out of the box. Vielleicht ist das 
Teil defekt?

von Torsten (Gast)


Lesenswert?

Vielleicht nimmst dir besser einen anderen Sensor (BME280 zB). Ich habe 
mit dem DHT22 die Erfahrung gemacht, dass die Werte zwar ok sind, der 
jedoch relativ schnell kaputt ist. Im Netz liest man auch davon; ein 
Freund von mir hat das Problem ebenfalls (bleibt aber aus Faulheit 
tapfer beim DHT22).

Nachteil ist aktuell nur, dass BME280 schwerer zu kriegen und daher 
vergleichsweise teuer sind.

von Jens H. aus K. (Gast)


Lesenswert?

Torsten schrieb:
> Vielleicht nimmst dir besser einen anderen Sensor (BME280 zB). Ich
> habe
> mit dem DHT22 die Erfahrung gemacht, dass die Werte zwar ok sind, der
> jedoch relativ schnell kaputt ist. Im Netz liest man auch davon; ein
> Freund von mir hat das Problem ebenfalls (bleibt aber aus Faulheit
> tapfer beim DHT22).

Solange man die Sensoren im Innenraum nutzt, sollten sie eigentlich 
halten. Ich habe einige DHT22 im Keller seit mindestens 5 Jahren und 
noch keinen Ausfall. Im Außenbereich sind sie schnell hinüber, wenn man 
sie nicht vor Wasser und gesättigter Luft, Nebel etc. schützt. Das 
betrifft aber genauso die BME-Sensoren, aus eigener Erfahrung. Der 
größte Nachteil der DHT-Teile ist die nicht vorhandene Adressierbarkeit 
wie beim richtigen 1-wire, d.h. man braucht für jeden Sensor einen 
eignen Datenpin am AVR.

von Sef C. (sefco)


Angehängte Dateien:

Lesenswert?

Jens H. schrieb:
> Vielleicht ist das
> Teil defekt?

Nein, habe gerade den 2ten aus der Verpackung gezogen und der verhält 
sich genauso.

Torsten schrieb:
> Vielleicht nimmst dir besser einen anderen Sensor (BME280 zB).

Ja, vielleicht. Nervt aber hart das man angeblich funktionierende und 
vielseitig genutzte Sensoren kauft und die Dinger nur Schrott machen.

Anbei nochmal die Bus Pegel für ein Startsignal für 1 ms auf Low. Dann 
findet man die zwei 80 us Pulse, aber nicht die 20-40 us nach dem 
Startsignal.
Richtig nervig sowas!

Gekauft habe ich die Sensoren beim Makershop, also nicht mal ein China 
Händler. Dort steht auf der Seite "(DHT22 – Neuste, überarbeitete 
Version aus 2021 Aosong/ASAIR Produktion)". Könnte es hier eine 
Timingänderung gegeben haben? Ich schreibe Makershop mal eine Email...

von Lutz (Gast)


Lesenswert?

Ohne deinen Code geht es wohl nicht weiter. Man vertut sich bei diesen 
Datenblättern gerne damit, wer wann welchen Pegel erzeugt. Die 20-40 
µs müssen vom host erzeugt werden. Deine 3 µs scheinen vom sensor 
erzeugt worden zu sein.

von Sef C. (sefco)


Lesenswert?

Lutz schrieb:
> Ohne deinen Code geht es wohl nicht weiter. Man vertut sich bei diesen
> Datenblättern gerne damit, wer wann welchen Pegel erzeugt. Die 20-40
> µs müssen vom host erzeugt werden. Deine 3 µs scheinen vom sensor
> erzeugt worden zu sein.

Hast du absolut recht und habe ich gerade eben getestet. Wenn der Host 
die 20-40 us auf high zieht schickt der Sensor nicht mal vernünftig die 
Bits raus und es geht gar nichts. Hier mal ein Auszug aus einer 
Bibliothek die ich im Internet gefunden habe. Man sieht, dass auch hier 
der Port auf Input mit Pullup steht für die 20-40 us Sequenz:
1
  //reset port
2
  DHT_DDR |= (1<<DHT_INPUTPIN); //output
3
  DHT_PORT |= (1<<DHT_INPUTPIN); //high
4
  _delay_ms(100);
5
6
  //send request
7
  DHT_PORT &= ~(1<<DHT_INPUTPIN); //low
8
  #if DHT_TYPE == DHT_DHT11
9
  _delay_ms(18);
10
  #elif DHT_TYPE == DHT_DHT22
11
  _delay_us(500);
12
  #endif
13
  DHT_PORT |= (1<<DHT_INPUTPIN); //high
14
  DHT_DDR &= ~(1<<DHT_INPUTPIN); //input
15
  _delay_us(40);
16
17
  //check start condition 1
18
  if((DHT_PIN & (1<<DHT_INPUTPIN))) {
19
    return -1;
20
  }
21
  _delay_us(80);
22
  //check start condition 2
23
  if(!(DHT_PIN & (1<<DHT_INPUTPIN))) {
24
    return -1;
25
  }
26
  _delay_us(80);
27
28
  //read the data
29
  uint16_t timeoutcounter = 0;
30
  for (j=0; j<5; j++) { //read 5 byte
31
    uint8_t result=0;
32
    for(i=0; i<8; i++) {//read every bit
33
      timeoutcounter = 0;
34
      while(!(DHT_PIN & (1<<DHT_INPUTPIN))) { //wait for an high input (non blocking)
35
        timeoutcounter++;
36
        if(timeoutcounter > DHT_TIMEOUT) {
37
          return -1; //timeout
38
        }
39
      }
40
      _delay_us(30);
41
      if(DHT_PIN & (1<<DHT_INPUTPIN)) //if input is high after 30 us, get result
42
        result |= (1<<(7-i));
43
      timeoutcounter = 0;
44
      while(DHT_PIN & (1<<DHT_INPUTPIN)) { //wait until input get low (non blocking)
45
        timeoutcounter++;
46
        if(timeoutcounter > DHT_TIMEOUT) {
47
          return -1; //timeout
48
        }
49
      }
50
    }
51
    bits[j] = result;
52
  }
53
54
  //reset port
55
  DHT_DDR |= (1<<DHT_INPUTPIN); //output
56
  DHT_PORT |= (1<<DHT_INPUTPIN); //low
57
  _delay_ms(100);

Ich schreibe mir gerade meinen eigenen Treiber. Ich hoffe nur das bei 
schwankender Versorgungsspannung (Batteriebetrieb) nicht alle Timings 
wieder hinfällig sind die ich messe, weil dann hat der Sensor eindeutig 
den Retourenaufkleber gewonnen.

: Bearbeitet durch User
von Lutz (Gast)


Lesenswert?

Wobei
1
  #elif DHT_TYPE == DHT_DHT22
2
  _delay_us(500);
auch schon dem Datenblatt widerspricht. Das fordert mindestens 1.000 µs 
low.

von Sef C. (sefco)


Lesenswert?

Lutz schrieb:
> Wobei  #elif DHT_TYPE == DHT_DHT22
>   _delay_us(500);
> auch schon dem Datenblatt widerspricht. Das fordert mindestens 1.000 µs
> low.

Ja, damit klappt es auch nicht. Es müssen tatsächlich mind. 1000 us 
sein.
Zeigt das auch schon andere mit dem Sensor zu kämpfen hatten.

: Bearbeitet durch User
von Sef C. (sefco)


Lesenswert?

Bekomme jetzt Daten aus dem Ding raus...es zeigt mir eine aktuelle 
Raumtemperatur von 25.3° an. Daneben steht eine Wetterstation die der 
Meinung ist es wären hier 22.4°. Meine Füße sind leicht kühl und 
bestätigen die Messung der Wetterstation.

Ich schicke die DHT22 zurück und kann hiermit nur jedem von diesen 
Sensoren abraten. 3 Stück haben mich 15€ gekostet. Gekauft habe ich sie 
nur, weil sie hier aufgeführt sind und die Performance überzeugt hat:
https://www.mikrocontroller.net/articles/Temperatursensor

Tatsächlich sollte man den Sensor auf dieser Seite mal als Müll 
deklarieren.

Kann jemand (neben dem BME280) eine Empfehlung für einen günstigen 
Sensor aussprechen der gut funktioniert?

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Sef C. schrieb:
> Tatsächlich sollte man den Sensor auf dieser Seite mal als Müll
> deklarieren.

Du meinst deine konkreten Produkte.

Aus China bekommst du unterschiedliche Produkte unter gleichem Namen und 
gleiche Produkte unter unterschiedlichen Namen.

Schon der nächste Kauf könnte ein Glückstreffer sein.

von Jefe (Gast)


Lesenswert?

Sef C. schrieb:
> Meine Füße sind leicht kühl und bestätigen die Messung der Wetterstation.


Ein ganz neuer Ansatz zur Feststellung der Validität ;-)

von Jens G. (jensig)


Lesenswert?

my2ct schrieb:
> Sef C. schrieb:
>> ich habe mir DHT22 Temperatur/Luftfeutigkeits Sensoren besorgt mit
>> 1-Wire Interface
>
> Die haben kein 1-Wire Interface, jedenfalls nicht das, was unter der
> Bezeichnung "1-Wire" von Dallas eingeführt wurde.
> https://de.wikipedia.org/wiki/1-Wire

Das steht sogar im oben verlinkten Datenblatt ...

Sef C. schrieb:
> Bekomme jetzt Daten aus dem Ding raus...es zeigt mir eine aktuelle

Aha - und was hast du jetzt anders gemacht, damit plötzlich was kommt?



Sef C. schrieb:
> Die Probleme fangen schon mit der Startsequenz (Datenblatt Seite 4) an.

Wie sieht denn die Startsequenz aus, wenn Du gar keinen Sensor 
anschließt (also praktisch nur der PullUp-R dran)? Einfach nur, um  zu 
sehen, ob die 3µs durch den Sensor oder den µC begrenzt werden ...

von Sef C. (sefco)


Lesenswert?

Stefan ⛄ F. schrieb:
> Aus China bekommst du unterschiedliche Produkte unter gleichem Namen und
> gleiche Produkte unter unterschiedlichen Namen.

Ich habe den Sensor nicht bei einem billig China-Händler erworben. Ich 
glaube auch nicht, dass ich eine Sensor-Kopie habe bei der man sich 
überlegt hat dass die Startsequenz doch vielleicht mal anders aussehen 
könnte...die Bits kommen ja korrekt raus.

Jens G. schrieb:
> Aha - und was hast du jetzt anders gemacht, damit plötzlich was kommt?

Habe ich doch alles hier schon erklärt: Ich habe die Timings so 
angepasst das sie den gemessenen Timings entsprechen.

Jens G. schrieb:
> Wie sieht denn die Startsequenz aus, wenn Du gar keinen Sensor
> anschließt (also praktisch nur der PullUp-R dran)? Einfach nur, um  zu
> sehen, ob die 3µs durch den Sensor oder den µC begrenzt werden ...

Welchen Zweck soll dieser Test haben? Wenn ich gar keinen Sensor 
anschließe wird der Bus für 1 ms auf low gezogen und das war es. Ich 
habe bereits oben schon gesagt, dass der Sensor nach 3 us den Bus von 
high auf low zieht. Nach den 1 ms wird der Port auf Input gesetzt.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Sef C. schrieb:
> Ich habe den Sensor nicht bei einem billig China-Händler erworben.

Das ändert leider nichts daran, dass es so ein typisches China-Produkt 
ist. Deine Erfahrung musste ich sogar beim teuren Conrad machen.

Ein Tipp fürs nächste mal: Bevor du ein Produkt kaufst schau nach, ob es 
bei Aliexpress deutlich billiger angeboten wird. Wenn ja, dann ist es so 
ein Produkt.

Ausnahme sind gefälschte Markenprodukte: DS1820, Echtzeituhren, 
STM32F103, Akkus, große Transistoren

von Joachim B. (jar)


Lesenswert?

Stefan ⛄ F. schrieb:
> Aus China bekommst du unterschiedliche Produkte unter gleichem Namen und
> gleiche Produkte unter unterschiedlichen Namen.
>
> Schon der nächste Kauf könnte ein Glückstreffer sein.

das passiert auch aus D, was denkst du wo deutsche Händler einkaufen!

von Stefan F. (Gast)


Lesenswert?

Joachim B. schrieb:
> das passiert auch aus D, was denkst du wo deutsche Händler einkaufen!

Ja stimmt. Sogar Conrad verkauft einige dieser "China Produkte".

von Jens H. (jensh22)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ausnahme sind gefälschte Markenprodukte: DS1820, Echtzeituhren,
> STM32F103, Akkus, große Transistoren
Apropos DS18B20, echte gibt es bei Pollin oder Reichelt, allerdings nun 
schon für über 5 € pro Stück. Hammer! Oder, man kauft sich ein 
Entwicklerboard für 2.40 € und lötet sich den Sensor aus. Vor einigen 
Monaten habe ich die Teile noch für 2 € beim Pollin gekauft. Beim Ali 
gab es früher(TM) auch noch echte. Meine letzte Bestellung waren aber 
auch Fakes und es hat einigen Disput gebraucht, bis ich mein Geld wieder 
hatte.

von Sef C. (sefco)


Lesenswert?

Jens H. schrieb:
> Apropos DS18B20, echte gibt es bei Pollin oder Reichelt, allerdings nun
> schon für über 5 € pro Stück. Hammer! Oder, man kauft sich ein
> Entwicklerboard für 2.40 € und lötet sich den Sensor aus. Vor einigen
> Monaten habe ich die Teile noch für 2 € beim Pollin gekauft. Beim Ali
> gab es früher(TM) auch noch echte. Meine letzte Bestellung waren aber
> auch Fakes und es hat einigen Disput gebraucht, bis ich mein Geld wieder
> hatte.

Jetzt mal ernsthaft: Wer klaut wo das Know-How für Halbleiterbauelemente 
und stellt diese dann so her, dass sie teilweise funktionieren und 
teilweise halt ein bisschen anders oder gar nicht. Halbleitertechnik 
macht man nicht mal eben im Bastelkeller und ist so aufwändig, dass man 
wissen muss was man tut. Wie kann da bitte, wie in diesem Beispiel hier, 
ein Bauteil rausfallen das Bits richtig rausshiftet aber ansonsten seine 
Startsequenz gewürfelt hat. Ich kann das irgendwie nicht glauben...

von Stefan F. (Gast)


Lesenswert?

Sef C. schrieb:
> Wer klaut wo das Know-How für Halbleiterbauelemente
> und stellt diese dann so her, dass sie teilweise funktionieren und
> teilweise halt ein bisschen anders oder gar nicht.

In China ist das alltäglich.

Schau dir doch mal die Berichte zu den STM32F103 Nachbauten und 
Fälschungen an.

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.