Absolute Luftfeuchtigkeit berechnen?

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Das mit der bit_position musst du so machen, dass du für das msb vom word von 15..8 zählst, dann kommt ja die Pause und dann von 7..0 das word komplettierst.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Super. Dank dir. So funktioniert alles.

      Hier noch der Code falls es irgendjemand brauchen kann.

      Source Code

      1. $regfile = "m168def.dat"
      2. $crystal = 8000000
      3. $hwstack = 100
      4. $swstack = 40
      5. $framesize = 100
      6. Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , _
      7. Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
      8. Config Lcd = 16 * 2
      9. Cursor Off
      10. Cls
      11. Config Portb.0 = Output 'LED1'
      12. Config Portd.17 = Output 'LED2'
      13. Config Portb.6 = Output 'Ausgang1'
      14. Config Portb.7 = Output 'Ausgang2'
      15. Declare Function Get_dht11() As Byte
      16. Dim Dht_daten(5) As Byte 'Array für empfangene Daten
      17. Dim Luftfeuchtigkeit As Word
      18. Dim Luftfeuchtigkeit1 As Byte At Dht_daten(1) Overlay
      19. Dim Luftfeuchtigkeit2 As Byte At Dht_daten(2) Overlay
      20. Dim Luft_ausgabe As String * 5
      21. Dim Temperatur As Word
      22. Dim Temp_ausgabe As String * 5
      23. Dim Temperatur1 As Byte At Dht_daten(3) Overlay
      24. Dim Temperatur2 As Byte At Dht_daten(4) Overlay
      25. Dim Crc_ergebniss As Byte At Dht_daten(5) Overlay
      26. 'Config DHT
      27. Dht_write Alias Portd.5 'Empfange Daten vom DHT-Sensor
      28. Dht_read Alias Pind.5 'Schreibe Daten zum DHT-Sensor
      29. Dht_io Alias Ddrd.5 'Umschalten der Datenrichtung write/read
      30. '10ms Interrupt
      31. Config Timer0 = Timer , Prescale = 1024
      32. Const Timerpreset = 178
      33. Dim Timer_tick As Word
      34. Dim Sec_tick As Bit
      35. Timer0 = Timerpreset
      36. On Timer0 Timer0_isr
      37. Enable Timer0
      38. Enable Interrupts
      39. Sec_tick = 0
      40. Set Dht_io 'Daten senden
      41. Set Dht_write 'Ausgang high
      42. Do
      43. 'Jede Sekunde eine Messung
      44. If Sec_tick = 1 Then
      45. Reset Sec_tick
      46. If Get_dht11() = 1 Then 'Daten richtig empfangen
      47. Luftfeuchtigkeit = Luftfeuchtigkeit1 * 256
      48. Luftfeuchtigkeit = Luftfeuchtigkeit + Luftfeuchtigkeit2
      49. 'Luftfeuchtigkeit = Luftfeuchtigkeit / 10
      50. Luft_ausgabe = Str(luftfeuchtigkeit)
      51. Temperatur = Temperatur1 * 256
      52. Temperatur = Temperatur + Temperatur2
      53. 'Temperatur = Temperatur / 10
      54. Temp_ausgabe = Str(temperatur)
      55. Locate 1 , 1
      56. Lcd "Rh:" ; Format(luft_ausgabe , "00.0") ; " % " ; " CRC:" ; Crc_ergebniss
      57. Locate 2 , 1
      58. Lcd "T :" ; Format(temp_ausgabe , "00.0") ; " C"
      59. Else 'Fehlercod ausgeben
      60. Cls
      61. Locate 1 , 1
      62. Lcd Get_dht11()
      63. End If
      64. End If
      65. Loop
      66. End
      67. Function Get_dht11() As Byte
      68. Local Array_index As Byte 'Index für Array
      69. Local Bit_position As Byte 'Bit-Position im Byte
      70. Local Crc_check As Byte 'Berechnung CRC
      71. 'Start Übertragung
      72. Set Dht_io 'Daten Senden
      73. Reset Dht_write 'Ausgang auf low
      74. Waitms 18 '18ms auf low
      75. Set Dht_write 'Ausgang auf high
      76. Waitus 30 'Ausgang muss 20-40µs high sein
      77. Reset Dht_io 'Daten Empfangen
      78. Waitus 40 'DHT sendet 80µs low => hier halbe Periode
      79. If Dht_read = 1 Then 'ist der Eingang nach 40µs immer noch high
      80. Get_dht11 = 2 'Fehlercode => 2
      81. Exit Function 'Function verlassen
      82. End If
      83. Waitus 80 'Eingang muss nach weiteren 80 µs wartzeit eigendlich high sein
      84. If Dht_read = 0 Then 'ist der Eingang low
      85. Get_dht11 = 3 'Fehlercode => 3
      86. Exit Function 'Function verlassen
      87. End If
      88. While Dht_read = 1 : Wend 'warten bis Eingang auf low geht => Startsequenz beendet
      89. '40 Daten-Bit's empfangen und in Daten-Array schreiben
      90. 'Byte 1 => Vorkomma Luftfeuchtigkeit
      91. 'Byte 2 => Nachkomma Luftfeuchtigkeit
      92. 'Byte 3 => Vorkomma Temperatur
      93. 'Byte 4 => Nachkomma Temperatur
      94. 'Byte 5 => CRC
      95. For Array_index = 1 To 5 '5 Byte => Dht_daten(5)
      96. For Bit_position = 7 To 0 Step -1 '8 Bit => höheres Bit zu erst
      97. While Dht_read = 0 : Wend 'warten bis der Eingang auf high geht => dauer 50µs
      98. '26-28us high => entspricht 0
      99. '70us high => entspricht 1
      100. Waitus 30 '30µs warten und schauen wie der Eingang ist
      101. If Dht_read = 1 Then 'bei "1" ist der Eingang nach 30µs immer noch high
      102. Dht_daten(array_index).bit_position = 1 '"1" an Bitposition schreiben
      103. While Dht_read = 1 : Wend 'warten bis Eingang wieder auf low geht
      104. Else 'bei "0" ist der Eingang nach 30µs low
      105. Dht_daten(array_index).bit_position = 0 '"0" an Bitposotion schreiben
      106. End If
      107. Next 'ein Bit empfangen
      108. Next
      109. Set Dht_io 'Daten Senden
      110. Set Dht_write 'Ausgang high
      111. 'Vergleich Summe der ersten 4 Bytes des Array, mit dem 5. Byte des Array
      112. Crc_check = Dht_daten(1) + Dht_daten(2)
      113. Crc_check = Crc_check + Dht_daten(3)
      114. Crc_check = Crc_check + Dht_daten(4)
      115. If Crc_check = Dht_daten(5) Then
      116. Get_dht11 = 1 'Alles in Ordnung
      117. Else
      118. Get_dht11 = 4 'Fehlercode => 4
      119. End If
      120. End Function
      121. Timer0_isr:
      122. Timer0 = Timerpreset
      123. Incr Timer_tick
      124. If Timer_tick = 100 Then
      125. Timer_tick = 0
      126. Set Sec_tick
      127. End If
      128. Return
      Display All
    • Dim Luftfeuchtigkeit As Word At Dht_daten(1) Overlay
      das klappt nicht? Jetzt sollte bit15..bit8 von Luftfeuchtigkeit = Dht_daten(1) sein und bit7..bit0 von Luftfeuchtigkeit = Dht_daten(2) sein.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Bei

      Dim Luft_test As Word At Dht_daten(1) Overlay

      gibt mir luft_test 63745 (variert natürlich) aus

      Wenn man das mal in bits/byte umwandelt sieht das so aus als ob er Byte 2 vor Byte 1 stellt. Also 15141312 111098 7654 3210

      Ich bräuchte aber 7654 3210 15141312 111098

      *EDIT*

      Luft_test2 = Makeint(luftfeuchtigkeit2 , Luftfeuchtigkeit1) funktioniert auch.
      Luft_test2 = Makeint(luftfeuchtigkeit1 , Luftfeuchtigkeit2) ist auch verderdreht.

      Also er befüllt von 0 bis 15 was eigentlich ja auch richtig ist. Ich will aber 8-15 und 0-7

      er nimmt das erste Byte und setzt es auf den richtigen platz vom word auch aufs erste Byte, dann das zweite.

      The post was edited 5 times, last by darasol ().

    • Das kannst du aber berücksichtigen, wenn du den Index von dem array beim Befüllen herunter zählst. Dann wäre Dht_daten(5) das msb von Luftfeuchtigkeit und Dht_daten(1) die Checksumme. Also dim Luftfeuchtigkeit as word at dht_daten(4) overlay.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • darasol wrote:

      Ah ok danke.

      Was ich gerade viel erschreckender finde sind die Abweichungen von 2 Baugleichen Sensoren. Temperatur passt so weit ganz gut aber die Luftfeuchte hat ne Differenz von 6 % das ist schon ganz ordentlich.
      Dann schreib' auf deinem LCD ein 'ungefähr' oder 'so um die' davor a_71_f9c57bbe
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Was machst du dann mit den 10 verschiedenen Werten? a_144_c1e4404d

      Laut Datenblatt hast du eine Ungenauigkeit von ca. +-2,5 von dem Prozentwert also 37,5% bis 42,5% als Beispiel.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      The post was edited 2 times, last by tschoeatsch ().