Absolute Luftfeuchtigkeit berechnen?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • 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.

      Quellcode

      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
      Alles anzeigen
    • 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.

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von 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 schrieb:

      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

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

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

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von tschoeatsch ()