Interpolation zum Berechnen der Feuchte

This commit is contained in:
rxf
2024-08-22 12:45:24 +02:00
parent 8de24db46d
commit e66633186b
5 changed files with 97 additions and 2 deletions

44
src/interpolation.cpp Normal file
View File

@@ -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 <math.h>
#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);
}

23
src/interpolation.h Normal file
View File

@@ -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

View File

@@ -26,6 +26,7 @@
#include "mqtt.h"
#include "handlebme280.h"
#include "grafik.h"
#include "interpolation.h"
#include "main.h"
#include <locale.h>
@@ -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) {

View File

@@ -1,13 +1,13 @@
#ifndef MAIN_H
#define MAIN_H
#include <version.h>
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

15
src/version.h Normal file
View File

@@ -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
*/