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 "mqtt.h"
|
||||||
#include "handlebme280.h"
|
#include "handlebme280.h"
|
||||||
#include "grafik.h"
|
#include "grafik.h"
|
||||||
|
#include "interpolation.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
@@ -70,6 +71,7 @@ void setup() {
|
|||||||
Serial.println("LVGL started");
|
Serial.println("LVGL started");
|
||||||
|
|
||||||
bmedata = readBME280();
|
bmedata = readBME280();
|
||||||
|
bmedata.hum = getRelativeFeuchte(bmedata.temp, bmedata.hum);
|
||||||
arcTemp.value = bmedata.temp;
|
arcTemp.value = bmedata.temp;
|
||||||
arcHum.value = bmedata.hum;
|
arcHum.value = bmedata.hum;
|
||||||
delay(1000);
|
delay(1000);
|
||||||
@@ -103,7 +105,17 @@ void setup() {
|
|||||||
*/
|
*/
|
||||||
delay(1000);
|
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() {
|
void loop() {
|
||||||
@@ -114,6 +126,7 @@ void loop() {
|
|||||||
if (millis() - bmeReadtimer > bmeReadTime) {
|
if (millis() - bmeReadtimer > bmeReadTime) {
|
||||||
bmeReadtimer = millis();
|
bmeReadtimer = millis();
|
||||||
bmedata = readBME280();
|
bmedata = readBME280();
|
||||||
|
bmedata.hum = getRelativeFeuchte(bmedata.temp, bmedata.hum);
|
||||||
doPublish(bmedata.temp+arcTemp.value_offset, bmedata.hum+arcHum.value_offset, bmedata.temp, bmedata.hum);
|
doPublish(bmedata.temp+arcTemp.value_offset, bmedata.hum+arcHum.value_offset, bmedata.temp, bmedata.hum);
|
||||||
}
|
}
|
||||||
if (millis() - updatetimer > updateTime) {
|
if (millis() - updatetimer > updateTime) {
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
#ifndef MAIN_H
|
#ifndef MAIN_H
|
||||||
#define MAIN_H
|
#define MAIN_H
|
||||||
|
|
||||||
|
#include <version.h>
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/timers.h"
|
#include "freertos/timers.h"
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VERSION "1.4.0"
|
|
||||||
#define VDATE "2024-08-19"
|
|
||||||
|
|
||||||
//#define MAXREADINGS 224
|
//#define MAXREADINGS 224
|
||||||
#define MAXREADINGS 200
|
#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