Absolute Luftfeuchtigkeit berechnen?

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

    • Also, jetzt wieder mit mehr Ernst.
      Im Datenblatt steht samplingrate 2 Sekunden, du misst jetzt alle Sekunde.
      auszug aus Datenblatt:
      3.Read the sensor minimum time interval for the 2S; read interval is less than 2S, may cause the temperature and humidity are not allowed or communication is unsuccessful, etc.. 4.Temperature and humidity values are each read out the results of the last measurement For real-time data that need continuous read twice, we recommend repeatedly to read sensors, and each read sensor interval is greater than 2 seconds to obtain accuratethe data.
      Verbessert sich was, wenn du alle 3 Sekunden misst, ausliest?
      Dann könntest du dein timing kontrollieren, das ist ja aus waits zusammen gebastelt. Könnte ja sein, dass das Programm knapp an der funktionierenden Grenze liegt. Dazu könntest du die Angabe $crystal mal um 2% erhöhen oder erniedrigen. Aus der Angabe wird von bascom ja das wait abgeleitet. Wenn's dann gleich seltsame Werte für Feuchte und Temperatur gibt, ist das timing vielleicht zu knapp.
      Raum für Notizen

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

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

      The post was edited 1 time, last by tschoeatsch ().

    • Zur Abweichung der Luftfeuchtigkeit bei gleichen Sensoren:

      5-10% sind durchaus nach meiner Erfahrung durchaus drin
      (also der eine hat z.B. 45%, der andere 53%).
      So war das bei mir z.B. mit HYT-Sensoren.
      Im Bereich über 75% wirds noch schlimmer.
      Die meisten geben m.E. nur eine Tendenz und nicht einen wirklich genauen Messwert an.

      Wie heißt es so schön:
      "Wer viel misst, misst viel Mist:"

      Wie das mit den SHTs (SHT11, SHT21) aussieht, muss ich mal testen.
      Vielleicht sind die genauer.

      LG RoBue
    • Also das liegt wohl wirklich an den Sensoren. Hab das mit den 2 Sec Messinterval getestet und keine genaueren Ergebnisse erhalten.
      Was mir aber aufgefallen ist: so gleich sind die zwei AM2302 wohl gar nicht. Wurden zwar gemeinsam bestellt und geliefert, bei genauerem betrachten sieht man aber im Inneren zumindest verschiedenfarbige Bauteile.
    • darasol wrote:

      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
      Herzlichen Dank für den, habe lange gesucht für einen grundsätzlich funktionsfähigen Code mit Bascom.
      Der einzige Fehler ist noch bei mir (Anzeige RH: 1049,6 %) und T: 614,5 C. (Plus den Fehlercode 2 in Display-Zeile 1,den habe ich aber rausgenommen.)
      Ich habe den Code noch angepasst auf I2C Displayausgabe, aber das sollte nicht das Problem sein.
      Würde mich über einen Tipp freuen, habe noch nicht so grosse Erfahrung, vielen Dank an Profis im Voraus
    • Michael wrote:

      HB9NMT wrote:

      Der einzige Fehler ist noch bei mir (Anzeige RH: 1049,6 %) und T: 614,5 C.
      Das Programm hat einen Fehler in der Berechnung in Zeile 53 und 57.Dort muss der Faktor jeweils 10 und nicht 256 sein.
      Ich weiß nicht mehr was der Grund damals war, aber es hatte einen. Bei mir war die Ausgabe damals korrekt. Bin da glaub nach dem Datenblatt gegangen 1. Byte *256 + 2. Byte. Vermutlich war es ein anderer Sensor.

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