Bascom DHT-22 Sensor für Luftfeuchtigkeit und Temperatur

mnsp2

Neues Mitglied
16 Aug 2009
33
0
0
Sprachen
Hallo zusammen,

Ich möchte auch mal meine Lösung hier kundgeben:

ich habe den Code von folgender Webseite für den DHT-22 angepasst.

http://avrproject.ru/publ/kak_podkljuchit/rabota_s_datchikom_vlazhnosti_dht11_v_bascom_avr/2-1-0-72

Es funktioniert gut auch das herausnehmen des Sensors und Einsetzen eines neuen stellt kein Problem dar.
Negative Temperaturen sind noch nicht möglich.

mich würde eure Meinung zu den Code mal Interessieren (gibt es Verbesserungsvorschläge, habe ich etwas nicht bedacht....)

Hier ein Auszug aus meinem aktuellen Programm:

Code:
......
Dht_put Alias Portk.7
Dht_get Alias Pink.7
Dht_io_set Alias Ddrk.7

Dim Temp_dht22 As String * 5        '12,2°C
Dim Humi_dht22 As String * 4        '23,3 %

Dim Aktuali_zeit_Temperatur as Word
Declare Sub Get_DHT22() 
Set Dht_io_set
Set Dht_put
......
Do 
.....
if Aktuali_zeit_Temperatur >= 10000 then
   Aktuali_zeit_Temperatur =0

  Call Get_dht22()

  'Call Text(1 , Temp_dht22 +"°C" , Grün , Reset_ja)
  'Call Text(2 , Humi_dht22 +"%" , Rot , Reset_ja)
else
  Incr Aktuali_zeit_Temperatur
end if
.....
Loop 

Sub Get_DHT22()

   Local Chksum As Byte
   Local Crc As Byte
   Local Mybyte As Byte
   Local Sensor_data As String * 40
   Local Count As Byte
   Local T As Word
   Local H As Word
   Local T_String As String *4
   Local H_String As String *4
   Local Data_temp As String * 16


   Count = 0
   Sensor_data = ""


   Dht_io_set = 1
   Dht_put = 0
   Waitms 1

   Dht_put = 1
   Waitus 20
   Dht_io_set = 0

   Waitus 40
   If Dht_get = 1 Then
      Temp_dht22 = "Err1"
      Humi_dht22 = "Err1"
      Exit Sub
   End If


    Waitus 80
    If Dht_get = 0 Then
      Temp_dht22 = "Err2"
      Humi_dht22 = "Err2"
      Exit Sub
    End If


    While Dht_get = 1 : Wend

     Do
       While Dht_get = 0 : Wend
       Waitus 30
       If Dht_get = 1 Then
         Sensor_data = Sensor_data + "1"
         While Dht_get = 1 : Wend
         Else
         Sensor_data = Sensor_data + "0"
       End If
       Incr Count
     Loop Until Count = 40

     Dht_io_set = 1
     Dht_put = 1


     Data_temp = Left(sensor_data , 16)
     H = Binval(Data_temp)
     H_String =Str (H)

     Data_temp = Mid(sensor_data , 17 , 16)
     T = Binval(Data_temp)
     T_String =Str (T)

     Data_temp = Right(sensor_data , 8)
     Crc = Binval(Data_temp)


      Chksum = Low(H ) + High(H )
      Chksum = Chksum + Low(T)
      Chksum = Chksum + High(T)

      If Chksum = Crc Then
         Temp_dht22 = Format(T_String , "#.#")
         Humi_dht22 = Format(H_String , "#.#")
      Else
          Temp_dht22 = "Err3"
          Humi_dht22 = "Err3"
      End If

End Sub
 

FishEye

Neues Mitglied
29 Jun 2021
3
0
1
Sprachen
  1. BascomAVR
Hallo. Ich weiß der Beitrag ist schon Uralt aber vielleicht kann mir noch jemand helfen... Hab das Programm von Phantomias übernommen für den Dht11
Der zeigt bei mir auch 743,3 C und 1203 Feuchtigkeit an.
Bitte um hilfe
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3,497
65
48
Marwitz
Sprachen
  1. BascomAVR
  2. Assembler
Kannst Du uns mal die Rohdaten nebst tatsächlichen Werten (Temperatur/Feuchte) geben?
Der Code sollte für den 22er sein, Du verwendest den 11er (soll(!) kompatibel sein) - ordentliche Datenblätter (wo auch die Bytes beschrieben sind) finde ich auf die Schnelle nicht - falls Du 'ne Quelle hast...
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3,497
65
48
Marwitz
Sprachen
  1. BascomAVR
  2. Assembler
Also laut Datenblatt sollen 40 Bit übertragen werden - fünf Bytes
  • integral RH
  • decimal RH
  • integral T
  • decimal T
  • (additive?) Checksumme
das ganze MSB-first.

was unter integral und decimal konkret zu verstehen ist, entnehme ich den Datenblättern nicht.

Phantomias liest sowohl RH als auch T je als Word (16bit) ein.
Bis hier wären das also erstmal vorzeichenlose Binärzahlen.
Für die Temperatur wird jetzt allerdings das MSB des T-Words ausgewertet - ist es gesetzt wird das Ergebnis als negativ gewertet, das Bit gelöscht, aber nicht(!!) weiter manipuliert. Eigentlich hätte ich irgendwas in Richtung Zweierkomplement erwartet (also vorzeichenbehaftete 16bit-Integer). Interessanterweise wurde in Zeile 68 ein Indikator für negative Temperaturen (als Byte??) dimensioniert, der nie verwendet wird. Fehlt da noch irgendwas?

Die Zahlen werden in Strings geschrieben, und mittels Format-Ausgabe eine Kommastelle verschoben. (Wobei in der Bascom Online Hilfe für die Maske kein "#" verwendet wird sondern "0". "Gartenzäune" werden bei Fusing verwendet, was allerdings bei der Darstellung von Singles Anwendung findet...)

Wenn ich den Code also korrekt reverse-engineered habe, liegen die Daten als Binärzahlen vor, und zwar als Zenti-Grad bzw -Prozent (das paßt auch zu den Offsets in Zeile 81, 82). Bei RH sinds 16 Bit, bei T 15 und ein Negativ-Bit.

Wie oben schon geschrieben: Kannst Du uns mal die Rohdaten (unter Angabe der jeweiligen tatsächlichen Werte) liefern?
Also Temperaturew (Zeilen 253..256 auskommentieren) und Humidityw, nach dem Auslesen und vor/statt der Ausgabe auf dem LCD?
 

FishEye

Neues Mitglied
29 Jun 2021
3
0
1
Sprachen
  1. BascomAVR
also, ich habe 253 - 256 auskommentiert und lasse mir vor dem end select temperaturew und Humidityw auf dem lcd ausgeben und da kommt bei temp 4 und bei humi 0. temp zählt er langsam immer um 1 rauf
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3,497
65
48
Marwitz
Sprachen
  1. BascomAVR
  2. Assembler
und lasse mir vor dem end select
Nein, statt der derzeitigen LCD-Ausgabe (könnte man auch über den UART machen, aber den wirst Du nicht verwenden), also in der "write_lcd_data"
Am besten mal als Binärdaten, also:


CodeBox BascomAVR
Write_lcd_data:
   New_lcd_data_flag = 0
   Locate 2 , 1
   Lcd bin(temperaturew)
Return

Da in der anderen Zeile die Uhrzeit läuft, ist damit das Display voll, oder?
oder:


CodeBox BascomAVR
Write_lcd_data:
   New_lcd_data_flag = 0
   Locate 2 , 1
   Lcd hex(temperaturew);" ";hex(humidityw)
Return

In Deinem Datenblatt stehen sowohl bei T als auch bei RH acht bit Auflösung, es wäre also zu erwarten, daß die beiden Low-Bytes je 0x00 sind

Der zeigt bei mir auch 743,3 C und 1203 Feuchtigkeit an.
Temp. war 27 C und 51% Luftfeuchtigkeit
Der Temperaturstring "743,3" wäre vor der Formatierung "7433" gewesen, also &B00011101_00001001
Das Low-Byte dürfte wie gesagt eigentlich nur 0x00 sein, das High-Byte entspräche 29 dezimal, ist also gar nicht mal so weit daneben...

Wodurch die RH so vermurkst wird, sehe ich nicht. Durch die formatierte Ausgabe müßte ja eigentlich 'ne Nachkommastelle und das "%" folgen. Der Vergleich in Zeile 186 mach auch keinen Sinn: es werden Strings verglichen, die Nachkommastelle existiert aber so gar nicht in humiditys (die wird ja erst durch das Format erzeugt).
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)