diff --git a/src/interpolation.cpp b/src/interpolation.cpp new file mode 100644 index 0000000..13cbcc3 --- /dev/null +++ b/src/interpolation.cpp @@ -0,0 +1,44 @@ +// Berechnung der Feuchte über die Sättigungsfeuchte und die Temperatur +// +// Die gemessene Temperatur ist (empirisch ernittelt) um 3.2°C zu hoch, deshalb ist die gemessene +// Feuchte immer deutlich zu niedrig. Mit Hilfe der Sättigungs-Tabelle wird nun die absolute Feuchte bei der +// wahren Temperatur (Tmess - 3.2°C) ermittelt und dann die relative Feuchte berechnet. + +#include +#include "interpolation.h" + + +// Berechnung des Dampgehaltes bei der gemessenen Temperatur über Interpolation in der dampftabelle +// +// dampfgehalt = d[t] + ((d[t+1] - d[t]) / 1) * (temp - t) +// mit t = int(temp)-indexOffset +// d[t] = dampftabelle[t] +// temp: gemessene Temperatur +// return: Dampfgehalt in g/m3 +float getDampfgehalt(float temp) +{ + int index = (int)temp - indexOffset; + if (index < 0) + { + index = 0; + } + if (index > sizeof(dampftabelle) / sizeof(dampftabelle[0])) + { + index = sizeof(dampftabelle) / sizeof(dampftabelle[0]) - 1; + } + float d1 = dampftabelle[index]; + float d2 = dampftabelle[index + 1]; + return d1 + ((d2 - d1) / 1) * (temp - (index + indexOffset)); +} + +// Berechnung der relativen Feuchte +// +// temp: gemessene Temperatur +// hum: gemessene relative Feuchte +// return: relative Feuchte +int getRelativeFeuchte(float temp, float hum) +{ + float dampfmess = getDampfgehalt(temp); + float dampfecht = getDampfgehalt(temp - tempOffset); + return round((dampfmess * hum / dampfecht) + humOffset); +} \ No newline at end of file diff --git a/src/interpolation.h b/src/interpolation.h new file mode 100644 index 0000000..5a276ab --- /dev/null +++ b/src/interpolation.h @@ -0,0 +1,23 @@ +#ifndef IUNTERPOL_H +#define INTERPOL_H + +// Tabelle mit dem Wasserdampgehalt (g/m3) über der Temperatur (°C) +// Die Temperatur ist der Index in die Tabelle +// Der erste Wert ist der von 15°C (index 0) + +const float dampftabelle[] = { + // 15, 16, 17, 18, 19 + 12.85, 13.65, 14.50, 15.40, 16.30, + // 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 + 17.30, 18.35, 19.40, 20.55, 21.80, 23.05, 24.35, 25.75, 27.20, 28.7, + // 30, 31, 32, 33, 34, 35 36 + 30.35, 32.05, 33, 85, 35.70, 37.65, 39.6, 41.7}; +const int indexOffset = 15; +const float tempOffset = 3.2; +const float humOffset = 5.0; + + +float getDampfgehalt(float temp); +int getRelativeFeuchte(float temp, float hum); + +#endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 7976621..228c70c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -26,6 +26,7 @@ #include "mqtt.h" #include "handlebme280.h" #include "grafik.h" +#include "interpolation.h" #include "main.h" #include @@ -70,6 +71,7 @@ void setup() { Serial.println("LVGL started"); bmedata = readBME280(); + bmedata.hum = getRelativeFeuchte(bmedata.temp, bmedata.hum); arcTemp.value = bmedata.temp; arcHum.value = bmedata.hum; delay(1000); @@ -103,7 +105,17 @@ void setup() { */ delay(1000); + /* Test Routinen + const float tsttemp[] = {27.7, 26.9, 26.7, 26.7, 26.0}; + const float tsthum[] = {62.0, 53.0, 50.0, 48.0, 39.0}; + for (int i = 0; i < 5; i++) { + Serial.printf("%d temp: %.1f hum: %.1f relF: %d\n", i, tsttemp[i], tsthum[i], getRelativeFeuchte(tsttemp[i], tsthum[i])); + } + while (1) { + delay(1000); + } + */ } void loop() { @@ -114,6 +126,7 @@ void loop() { if (millis() - bmeReadtimer > bmeReadTime) { bmeReadtimer = millis(); bmedata = readBME280(); + bmedata.hum = getRelativeFeuchte(bmedata.temp, bmedata.hum); doPublish(bmedata.temp+arcTemp.value_offset, bmedata.hum+arcHum.value_offset, bmedata.temp, bmedata.hum); } if (millis() - updatetimer > updateTime) { diff --git a/src/main.h b/src/main.h index 9fc69c2..d18ef9a 100644 --- a/src/main.h +++ b/src/main.h @@ -1,13 +1,13 @@ #ifndef MAIN_H #define MAIN_H +#include + extern "C" { #include "freertos/FreeRTOS.h" #include "freertos/timers.h" } -#define VERSION "1.4.0" -#define VDATE "2024-08-19" //#define MAXREADINGS 224 #define MAXREADINGS 200 diff --git a/src/version.h b/src/version.h new file mode 100644 index 0000000..c777db0 --- /dev/null +++ b/src/version.h @@ -0,0 +1,15 @@ +// Versionsgeschichte + +#define VERSION "1.5.0" +#define VDATE "2024-08-21" + +/* +Version Date Author +1.5.0 2024-08-21 rxf + - Mit Hilfe von Interpolation werde die echten Feuchtewerte ausgerechnet und angezeigt + - Die Werte sind jetzt (soweit) korrekt + +1.4.0 2024-08-19 rxf + - Funktioniert soweit allerdings sind die Werte nicht korrekt, da sich der Sensor erwärmt + +*/ \ No newline at end of file