Temperaturdaten auslesen mit DHT11

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo,

    ich versuche verzweifelt die Temperaturdaten eines DHT11 mit C auszulesen.

    Es werden zwar Bits in den Buffer geladen, die Werte stimmen jedoch nicht überein (delay Problem?)


    Grundsätzlich schaut die Übertragung wie folgt aus:

    DHT11+timing+diagram.jpg
    Ich will nicht den Code von einschlägigen Foren übernehmen und daher meinen eigenen Senf programmieren.

    Den Internetz-Code findet ihr hier:
    http://www.rpiblog.com/2012/11/interf…d-humidity.html

    :danke_ATDE:

    Beste Grüße
    Stefan

  • Hallo PargeLenis,

    Löblich ist, dass Du es erstmal selber probierst, mit Bitbanging zum Ziel kommen zu wollen.

    Du hast allerdings ein paar Dinge aus dem Datenblatt und den Aussagen zum Protokoll nicht im Code umgesetzt.

    Nachdem Du Pegel wechselst, um den DHT zum Plaudern zu veranlassen, teilt er Dir mit,wie lange 80 us dauern. Diese Kenntnis fehlt Dir, da Du darauf nicht eingehst.

    Deswegen kann Dein Programm auch kein Gefühl dafür entwickeln, ob ein 0- oder 1-Bit empfangen wurde, da diese beiden Daten unterschiedlich lange übertragen werden.

    Und die 50 us zwischen den Datenbits bekommst Du auch nicht mit.

    Ansonsten ist Dein Timing vollkommen daneben programmiert. Dein Code misst wahllosen Signalpegeln eine Bedeutung zu, die ihnen nicht zusteht.

    Besser mal was nach. Dann wird's schon noch was!

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (17. Juni 2017 um 20:11)

  • Hallo Andreas,

    vielen Dank für die Hilfe. Das Programm funktioniert nun wie gewünscht.

    Beste Grüße
    Stefan

  • Hallo Stefan,


    Das Programm funktioniert nun wie gewünscht.


    Bist Du Dir da sicher? Dein Code gibt das für mich nicht her. Zwar hast Du jetzt ein paar angemessene Verzögerungen sinnvoll platziert. Aber Dein geposteter Code erkennt immer noch nicht, ob ein HIGH-Pegel über 76 µs oder über 26 bis 28 µs geschickt wurde. In dem ersten Fall liegt ist ein Bit gesetzt, im anderen Fall gelöscht.

    Nach der Verzögerung von gewünscht 40 µs kannst Du Dich durchaus in der LOW-Phase von 50 µs befinden. Vielleicht auch schon in der Signal-HIGH-Phase. Auf jeden Fall unterscheidet Dein Programm nicht zwischen HIGH-Phasen unterschiedlicher Dauer. Erst diese unterschiedlichen Dauer sollen zur Folge haben, dass ein Bit nun gesetzt oder nicht gesetzt wird.

    Dein Setzen von [font="Courier New"]buffer[i][/font] hat mit der unterschiedlichen HIGH-Phase nichts zu tun - und ist eher zufällig.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (18. Oktober 2017 um 19:48)

  • Hallo Andreas,

    ich bekomme zumindest die selben Werte zurückgeliefert, die der Internetcode auch ausgibt. Könnte natürlich auch Glück bzw. Zufall sein.

    Ich bin ein C-Neuling. Wie kann ich meinem Code mitteilen, wie lange ein HIGH oder LOW ist?

    Danke

    Beste Grüße
    Stefan

  • Hallo Stefan,


    Ich bin ein C-Neuling.


    Das habe ich schon vermutet...



    Wie kann ich meinem Code mitteilen, wie lange ein HIGH oder LOW ist?

    wir gehen mal von Deinem Code aus dem Eingangsbeitrag #1 aus:

    Die entscheidenden Sachen sind in der Funktion ReadData() definiert.


    festgelegt. Kann man besser strukturieren (einrücken), soll jetzt aber nicht das Thema sein.

    Aus dem Timing-Diagramm
    DHT11+timing+diagram.jpg
    ergibt sich:

    • Dein Programm sendet LOW für 18 ms
    • Dein Programm sendet HIGH für 20 bis 40 µs
    • Diese beiden Pegel deutet der DHT11 als Aufforderung, jetzt Daten zu senden - und vorher irgendwie zu ermitteln.
    • Der DHT11 sendet LOW für 80 µs
    • Der DHT11 sendet HIGH für 80 µs
    • Der DHT11 sendet 40 Bits, jedes Bitt besteht aus einer "Einleitung" LOW für 50 µs und einem HIGH-Pegel unterschiedlicher Dauer (26 - 28 µs entspicht einem 0-Bit, 70 µs entspricht einem 1-Bit.


    Ausgehend von Deinem Code und Umsetzung der im Datenblatt enthaltenen Timings führt das zu folgendem Code:


    Mal ohne DHT11 ungetestet aus der Hüfte geschossen Kann sein, dass ich das eine oder andere Semikolon vergessen habe (die brauche ich in meiner bevorzugten Programmiersprache nicht).


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (19. Juni 2017 um 14:35)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!