Interpolation zum Berechnen der Feuchte
This commit is contained in:
44
src/interpolation.cpp
Normal file
44
src/interpolation.cpp
Normal 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
23
src/interpolation.h
Normal 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
|
||||
13
src/main.cpp
13
src/main.cpp
@@ -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) {
|
||||
|
||||
@@ -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
15
src/version.h
Normal 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
|
||||
|
||||
*/
|
||||
Reference in New Issue
Block a user