Absolute Luftfeuchtigkeit berechnen?

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

    • Absolute Luftfeuchtigkeit berechnen?

      Hallo,

      ich müßte für eine Lüftersteuerung aus der relativen Luftfeuchtigkeit und der Temperatur
      die absolute Luftfeuchte berechnen.
      Formeln finde ich schon, aber es scheint nicht ganz ohne zu sein.
      Leider ist ja das alte Forum nicht mehr online, da gab es laut Google schon mal das Thema.
      Gibt es irgendeine Möglichkeit auf die alte Themen zuzugreifen, oder hätte jemand Tips
      wie ich das angehen könnte? Es muß nicht exakt sein, eine Näherung würde reichen.

      Gruß Ralf
    • Hi, wenn du die Formeln hast, wo ist dein Problem? Bascom bietet doch eigentlich alle Rechenfunktionen. Gut, man muss bisschen was mit den Datentypen beachten, aber ansonsten ist die Umsetzung von Formeln auf das Umschreiben auf einzeilige Rechenschritte äh, gedingst, äh, hm, der Satz ist mir aus dem Ruder gelaufen. Also, wo ist dein Problem genau?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Mal im Google Cache gesucht? Das web vergisst nix! Der Cache wirft mir das hier raus, kommt wohl vom User "Gruetze":

      Source Code

      1. Wer was mit DHT-Senoren machen will, hier ein Code:
      2. $regfile = "m8def.dat"
      3. $crystal = 4000000
      4. $hwstack = 100
      5. $swstack = 40
      6. $framesize = 100
      7. Declare Function Get_dht11() As Byte
      8. Dim Dht_daten(5) As Byte 'Array für empfangene Daten
      9. Dim Luftfeuchtigkeit As Byte At Dht_daten(1) Overlay
      10. Dim Temperatur As Byte At Dht_daten(3) Overlay
      11. Dim Crc_ergebniss As Byte At Dht_daten(5) Overlay
      12. 'Config DHT
      13. Dht_write Alias Portc.0 'Empfange Daten vom DHT-Sensor
      14. Dht_read Alias Pinc.0 'Schreibe Daten zum DHT-Sensor
      15. Dht_io Alias Ddrc.0 'Umschalten der Datenrichtung write/read
      16. '10ms Interrupt
      17. Config Timer0 = Timer , Prescale = 256
      18. Const Timerpreset = 100
      19. Dim Timer_tick As Word
      20. Dim Sec_tick As Bit
      21. Timer0 = Timerpreset
      22. On Timer0 Timer0_isr
      23. Enable Timer0
      24. ' ----- LCD-Display konfigurieren -----
      25. Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
      26. Config Lcd = 16 * 2
      27. Initlcd
      28. Cursor Off Noblink ' Blinkenden Cursor abschalten
      29. Cls ' Bildschirm löschen
      30. Enable Interrupts
      31. Sec_tick = 0
      32. Set Dht_io 'Daten senden
      33. Set Dht_write 'Ausgang high
      34. Do
      35. 'Jede Sekunde eine Messung
      36. If Sec_tick = 1 Then
      37. Reset Sec_tick
      38. If Get_dht11() = 1 Then 'Daten richtig empfangen
      39. Locate 1 , 1
      40. Lcd "Rh:" ; Luftfeuchtigkeit ; " % " ; " CRC:" ; Crc_ergebniss
      41. Locate 2 , 1
      42. Lcd "T :" ; Temperatur ; " C"
      43. Else 'Fehlercod ausgeben
      44. Cls
      45. Locate 1 , 1
      46. Lcd Get_dht11()
      47. End If
      48. End If
      49. Loop
      50. End
      51. Function Get_dht11() As Byte
      52. Local Array_index As Byte 'Index für Array
      53. Local Bit_position As Byte 'Bit-Position im Byte
      54. Local Crc_check As Byte 'Berechnung CRC
      55. 'Start Übertragung
      56. Set Dht_io 'Daten Senden
      57. Reset Dht_write 'Ausgang auf low
      58. Waitms 18 '18ms auf low
      59. Set Dht_write 'Ausgang auf high
      60. Waitus 30 'Ausgang muss 20-40µs high sein
      61. Reset Dht_io 'Daten Empfangen
      62. Waitus 40 'DHT sendet 80µs low => hier halbe Periode
      63. If Dht_read = 1 Then 'ist der Eingang nach 40µs immer noch high
      64. Get_dht11 = 2 'Fehlercode => 2
      65. Exit Function 'Function verlassen
      66. End If
      67. Waitus 80 'Eingang muss nach weiteren 80 µs wartzeit eigendlich high sein
      68. If Dht_read = 0 Then 'ist der Eingang low
      69. Get_dht11 = 3 'Fehlercode => 3
      70. Exit Function 'Function verlassen
      71. End If
      72. While Dht_read = 1 : Wend 'warten bis Eingang auf low geht => Startsequenz beendet
      73. '40 Daten-Bit's empfangen und in Daten-Array schreiben
      74. 'Byte 1 => Vorkomma Luftfeuchtigkeit
      75. 'Byte 2 => Nachkomma Luftfeuchtigkeit
      76. 'Byte 3 => Vorkomma Temperatur
      77. 'Byte 4 => Nachkomma Temperatur
      78. 'Byte 5 => CRC
      79. For Array_index = 1 To 5 '5 Byte => Dht_daten(5)
      80. For Bit_position = 7 To 0 Step -1 '8 Bit => höheres Bit zu erst
      81. While Dht_read = 0 : Wend 'warten bis der Eingang auf high geht => dauer 50µs
      82. '26-28us high => entspricht 0
      83. '70us high => entspricht 1
      84. Waitus 30 '30µs warten und schauen wie der Eingang ist
      85. If Dht_read = 1 Then 'bei "1" ist der Eingang nach 30µs immer noch high
      86. Dht_daten(array_index).bit_position = 1 '"1" an Bitposition schreiben
      87. While Dht_read = 1 : Wend 'warten bis Eingang wieder auf low geht
      88. Else 'bei "0" ist der Eingang nach 30µs low
      89. Dht_daten(array_index).bit_position = 0 '"0" an Bitposotion schreiben
      90. End If
      91. Next 'ein Bit empfangen
      92. Next
      93. Set Dht_io 'Daten Senden
      94. Set Dht_write 'Ausgang high
      95. 'Vergleich Summe der ersten 4 Bytes des Array, mit dem 5. Byte des Array
      96. Crc_check = Dht_daten(1) + Dht_daten(2)
      97. Crc_check = Crc_check + Dht_daten(3)
      98. Crc_check = Crc_check + Dht_daten(4)
      99. If Crc_check = Dht_daten(5) Then
      100. Get_dht11 = 1 'Alles in Ordnung
      101. Else
      102. Get_dht11 = 4 'Fehlercode => 4
      103. End If
      104. End Function
      105. Timer0_isr:
      106. Timer0 = Timerpreset
      107. Incr Timer_tick
      108. If Timer_tick = 100 Then
      109. Timer_tick = 0
      110. Set Sec_tick
      111. End If
      112. Return
      Display All
      Dann gabs nochmal nen beitrag, aber ohne Bascom lösung am ende:
      webcache.googleusercontent.com…nk&gl=de&client=firefox-b
    • Hallo Ralf,

      wenn du dir noch nicht den Sensor besorgt hast, ich kann dir den AM2320 empfehlen. Der misst Temperatur und Luftfeuchte.
      Bei Ebay habe ich mehrere Varianten gesehen, einmal nur als Platine und dann ein Modell in kleinem Gehäuse.
      Ich hatte mir damals die Variante mit Gehäuse bestellt. Nach einem Testaufbau habe ich mit mehreren Thermometern / Hygrometern verglichen.
      Fazit: Das Modul arbeitet in etwa mit den gleichen Abweichungen wie käufliche Fertiggeräte. Ist also durchaus brauchbar.

      Gruß, Michael
    • Hallo Allerseits,

      erst mal herzlichen Dank für die Antworten!

      elektronix00 wrote:

      Hallo Ralf,

      wenn du dir noch nicht den Sensor besorgt hast, ich kann dir den AM2320 empfehlen. Der misst Temperatur und Luftfeuchte.

      Ich nehme immer den SHT11, der ist zwar normalerweise teuer, bei Ebay bekommt man ihn aber günstig:
      ebay.de/itm/282361078936?_trks…geName=STRK%3AMEBIDX%3AIT

      Schraubbaer wrote:

      Mal im Google Cache gesucht? Das web vergisst nix! Der Cache wirft mir das hier raus, kommt wohl vom User "Gruetze":
      Da geht es aber leider nirgens um die absolute Feuchte, die Idee mit Google Cache ist aber gut


      tschoeatsch wrote:

      Hi, wenn du die Formeln hast, wo ist dein Problem? Bascom bietet doch eigentlich alle Rechenfunktionen. Gut, man muss bisschen was mit den Datentypen beachten, aber ansonsten ist die Umsetzung von Formeln auf das Umschreiben auf einzeilige Rechenschritte äh, gedingst, äh, hm, der Satz ist mir aus dem Ruder gelaufen. Also, wo ist dein Problem genau?
      Würde ich auch denken, wenn ich als Außenstehender meinen Beitrag lesen würde, die exakte Berechnung ist aber wirklich kompliziert und bei den Näherungen gibt es oft Disskusionen, warum sie mit Onlinerechnern oder Tabellen nicht übereinstimmen.

      Ich habe auf jeden Fall erst mal ein Progrann in Python gefunden, das versuche ich mal nachzuvollziehen:
      bitbucket.org/m_reiter/klima/s…eviewer=file-view-default

      Gruß Ralf
    • Hi! Vielleicht so??? Ich habe das aber nicht mir letzter Sorgfalt gemacht, das musst Du nochmals nachprüfen...

      Source Code

      1. AF= 13.233 * rF * ((10 ^ ((7.5 * T) / (237 + T))) / (273.16 + T))
      2. Dim T_neu as ...
      3. Dim T_neu_2 as ...
      4. T_neu = 237 + T
      5. T_neu_2 = 7.5 * T
      6. T_neu = T_neu_2 / T_neu
      7. AF = 10 ^ T_neu
      8. T_neu = 273.16 + T
      9. AF = AF / T_neu
      10. AF= rF * AF
      11. AF= 13.233 * AF
      Display All
    • Edit:
      Ist vielleicht doch nicht so blöd.
      T in Celsius, rF in %, dann passt's ganz gut. Hut ab!
      Gruß, elektron

      Hallo,
      Die obige Formel ist richtig für Bascom aufgedröselt, wie ein Vergleich mit einem Mathe-Algebra-Programm zeigt (die Einzelschrittrechnung ergibt dasselbe wie die einzeilige Formel).

      Das Dumme ist nur, dass die Werte sich mit keinem in Online-Rechnern ausgegebenen Werten decken, irgendwie völlig daneben, obwohl der Trend stimmt.
      Leider ist in dem von mir zitierten Post auch keine Primär-Quelle angegeben. Dies scheint also nur eine nicht so gute Näherungslösung zu sein.

      Hier habe ich aber etwas anscheinend seriöseres gefunden:
      wetterochs.de/wetter/feuchte.html#f2
      Sieht auf den allerersten Blick kompliziert aus, auf den dritten scheint es aber schon etwas auf die Einzelschritt-Rechnung zugeschnitten zu sein und müsste sich implementieren lassen.
      Gruß, elektron

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

    • Hallo,

      es funktioniert einwandfrei!
      Ich habe mal verschiedene Werte eingegeben und das Ergebnis
      mit den entsprechenden Kurven verglichen und es stimmt.

      Noch mal ganz herzlichen Dank für eure Unterstützung :)

      Gruß Ralf
    • Hi, hab gerade mal mit nem Testaufbau den Code aus dem Thread getestet.

      Source Code

      1. Wer was mit DHT-Senoren machen will, hier ein Code:
      2. $regfile = "m8def.dat"
      3. $crystal = 4000000
      4. $hwstack = 100
      5. $swstack = 40
      6. $framesize = 100
      7. Declare Function Get_dht11() As Byte
      8. Dim Dht_daten(5) As Byte 'Array für empfangene Daten
      9. Dim Luftfeuchtigkeit As Byte At Dht_daten(1) Overlay
      10. Dim Temperatur As Byte At Dht_daten(3) Overlay
      11. Dim Crc_ergebniss As Byte At Dht_daten(5) Overlay
      12. 'Config DHT
      13. Dht_write Alias Portc.0 'Empfange Daten vom DHT-Sensor
      14. Dht_read Alias Pinc.0 'Schreibe Daten zum DHT-Sensor
      15. Dht_io Alias Ddrc.0 'Umschalten der Datenrichtung write/read
      16. '10ms Interrupt
      17. Config Timer0 = Timer , Prescale = 256
      18. Const Timerpreset = 100
      19. Dim Timer_tick As Word
      20. Dim Sec_tick As Bit
      21. Timer0 = Timerpreset
      22. On Timer0 Timer0_isr
      23. Enable Timer0
      24. ' ----- LCD-Display konfigurieren -----
      25. Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
      26. Config Lcd = 16 * 2
      27. Initlcd
      28. Cursor Off Noblink ' Blinkenden Cursor abschalten
      29. Cls ' Bildschirm löschen
      30. Enable Interrupts
      31. Sec_tick = 0
      32. Set Dht_io 'Daten senden
      33. Set Dht_write 'Ausgang high
      34. Do
      35. 'Jede Sekunde eine Messung
      36. If Sec_tick = 1 Then
      37. Reset Sec_tick
      38. If Get_dht11() = 1 Then 'Daten richtig empfangen
      39. Locate 1 , 1
      40. Lcd "Rh:" ; Luftfeuchtigkeit ; " % " ; " CRC:" ; Crc_ergebniss
      41. Locate 2 , 1
      42. Lcd "T :" ; Temperatur ; " C"
      43. Else 'Fehlercod ausgeben
      44. Cls
      45. Locate 1 , 1
      46. Lcd Get_dht11()
      47. End If
      48. End If
      49. Loop
      50. End
      51. Function Get_dht11() As Byte
      52. Local Array_index As Byte 'Index für Array
      53. Local Bit_position As Byte 'Bit-Position im Byte
      54. Local Crc_check As Byte 'Berechnung CRC
      55. 'Start Übertragung
      56. Set Dht_io 'Daten Senden
      57. Reset Dht_write 'Ausgang auf low
      58. Waitms 18 '18ms auf low
      59. Set Dht_write 'Ausgang auf high
      60. Waitus 30 'Ausgang muss 20-40µs high sein
      61. Reset Dht_io 'Daten Empfangen
      62. Waitus 40 'DHT sendet 80µs low => hier halbe Periode
      63. If Dht_read = 1 Then 'ist der Eingang nach 40µs immer noch high
      64. Get_dht11 = 2 'Fehlercode => 2
      65. Exit Function 'Function verlassen
      66. End If
      67. Waitus 80 'Eingang muss nach weiteren 80 µs wartzeit eigendlich high sein
      68. If Dht_read = 0 Then 'ist der Eingang low
      69. Get_dht11 = 3 'Fehlercode => 3
      70. Exit Function 'Function verlassen
      71. End If
      72. While Dht_read = 1 : Wend 'warten bis Eingang auf low geht => Startsequenz beendet
      73. '40 Daten-Bit's empfangen und in Daten-Array schreiben
      74. 'Byte 1 => Vorkomma Luftfeuchtigkeit
      75. 'Byte 2 => Nachkomma Luftfeuchtigkeit
      76. 'Byte 3 => Vorkomma Temperatur
      77. 'Byte 4 => Nachkomma Temperatur
      78. 'Byte 5 => CRC
      79. For Array_index = 1 To 5 '5 Byte => Dht_daten(5)
      80. For Bit_position = 7 To 0 Step -1 '8 Bit => höheres Bit zu erst
      81. While Dht_read = 0 : Wend 'warten bis der Eingang auf high geht => dauer 50µs
      82. '26-28us high => entspricht 0
      83. '70us high => entspricht 1
      84. Waitus 30 '30µs warten und schauen wie der Eingang ist
      85. If Dht_read = 1 Then 'bei "1" ist der Eingang nach 30µs immer noch high
      86. Dht_daten(array_index).bit_position = 1 '"1" an Bitposition schreiben
      87. While Dht_read = 1 : Wend 'warten bis Eingang wieder auf low geht
      88. Else 'bei "0" ist der Eingang nach 30µs low
      89. Dht_daten(array_index).bit_position = 0 '"0" an Bitposotion schreiben
      90. End If
      91. Next 'ein Bit empfangen
      92. Next
      93. Set Dht_io 'Daten Senden
      94. Set Dht_write 'Ausgang high
      95. 'Vergleich Summe der ersten 4 Bytes des Array, mit dem 5. Byte des Array
      96. Crc_check = Dht_daten(1) + Dht_daten(2)
      97. Crc_check = Crc_check + Dht_daten(3)
      98. Crc_check = Crc_check + Dht_daten(4)
      99. If Crc_check = Dht_daten(5) Then
      100. Get_dht11 = 1 'Alles in Ordnung
      101. Else
      102. Get_dht11 = 4 'Fehlercode => 4
      103. End If
      104. End Function
      105. Timer0_isr:
      106. Timer0 = Timerpreset
      107. Incr Timer_tick
      108. If Timer_tick = 100 Then
      109. Timer_tick = 0
      110. Set Sec_tick
      111. End If
      112. Return
      Display All
      Jetzt bekomme ich allerdings Merkwürdige Ergebnisse.

      Als Luftfeuchtigkeit 1% und Temperatur 0 °C. CRC im schnitt so bei 160

      Hat einer ne Idee an was das liegen könnte. Das Programm wurde 1zu1 übernommen. Lediglich die Ports/Pins wurden angepasst und auf 8Mhz umgestellt.


      *EDIT*

      seh gerade das der Code wohl für den DHT11 wurde. Ich habe grad aber nen DHT22 bzw AM2302 dranhängen. Worin unterscheiden sich die beiden?

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

    • Ups ja. $crystal und Timer angepasst. Das scheint auch alles zu stimmen. Nein Fehlercode bekomme ich keinen aber ich hab glaube was gefunden.

      In dem Code Beispiel steht Byte 1 und 3 seien die Stelle vor dem Komma und 2 und 4 danach. Wie auch immer man das verstehen will. In dem Datenblatt von nem AM2302 steht das die beiden Byte Addiert werden müssen??

      akizukidenshi.com/download/ds/aosong/AM2302.pdf

      WIe gesagt ich habe nen DHT22/AM2302 vllt liegt es daran?

      Widerstand ist dran aber 5k

      Steh jetzt echt etwas auf der Leitung. Laut dem Datenblatt würden die 8 Bit aus dem ersten Byte und die letzen 4 Bit aus dem zweiten Byte meine Temperatur vor dem Komma ergeben. ist das richtig?

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

    • Addiert war falsch. Aber in dem Beispiel steht ja:

      0000 0001 0000 1101 = 10DH(Hexadecimal) = 1×256 + 0×16 + 13 = 269

      In dem Beispielcode wird aber nur das erste Byte verwendet. also 0000 0001. Was meine 1 Erklären würde. Wie mach ich in Bascom nun aber aus 2 Byte ein word?

      Müsste nicht eigentlich

      Dim Luftfeuchtigkeit As Word At Dht_daten(1) Overlay

      ausreichen?

      *EDIT*

      Hab mir jetzt eben beide Bytes als Hexwert ausgeben lassen. 01 und F0 -> 1 1111 0000 -> würde also ca 45% Luftfeuchte heißen. Würde passen.
      Das selbe bei der Temperatur: 00 E9 -> 1110 1001 -> enspricht 23,3 °C . Passt also auch.

      Wie bekomm ich jetzt aber mein richtiges Ergebnis aufs LCD? Also ich muss dazu die beiden Byte iwie zusammenfassen.

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

    • Mach's wie im Datenblattbeispiel, 1.byte x 256 + 2.byte= 10facher Wert. In der Anzeige mit 'format' ein Komma rein setzen. Musst aus dem Wert erst einen string machen.

      Du kannst deinen bit_position auch bis 16 zählen lassen, bzw von 15..0 (msb zuerst)
      Raum für Notizen

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

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