From 75755ada63832d5c4a16275ca3712b931e85c94c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Mon, 3 Mar 2025 11:25:58 +0100 Subject: [PATCH] Greenhouse webinterface --- data/Greenhouse/http/index.html | 190 +++++++++++++++++- src/node/Greenhouse/Greenhouse.cpp | 15 ++ src/node/Greenhouse/http.cpp | 25 +++ src/node/Greenhouse/http.h | 16 ++ .../Greenhouse/sensors.cpp} | 9 +- src/node/Greenhouse/sensors.h | 19 ++ src/patrix/DHT22.h | 45 +++-- src/patrix/bme680.h | 13 +- src/patrix/bmp280_aht20.h | 13 +- src/patrix/humidityRelative.cpp | 15 ++ src/patrix/humidityRelative.h | 6 + src/patrix/tsl2561.h | 9 +- 12 files changed, 322 insertions(+), 53 deletions(-) create mode 100644 src/node/Greenhouse/Greenhouse.cpp create mode 100644 src/node/Greenhouse/http.cpp create mode 100644 src/node/Greenhouse/http.h rename src/{Greenhouse.cpp => node/Greenhouse/sensors.cpp} (68%) create mode 100644 src/node/Greenhouse/sensors.h create mode 100644 src/patrix/humidityRelative.cpp create mode 100644 src/patrix/humidityRelative.h diff --git a/data/Greenhouse/http/index.html b/data/Greenhouse/http/index.html index a03c004..381ce9e 100644 --- a/data/Greenhouse/http/index.html +++ b/data/Greenhouse/http/index.html @@ -7,25 +7,205 @@ -

Gewächshaus

- TODO +
Gewächshaus
+ +
+ +
+
Temperatur
+
+
+
°C
+
+
+ +
+
Relative Luftfeuchte
+
+
+
%
+
+
+ +
+
Absolute Luftfeuchte
+
+
+
g/m³
+
+
+ +
+
Helligkeit
+
+
+
lux
+
+
+ +
+ + + \ No newline at end of file diff --git a/src/node/Greenhouse/Greenhouse.cpp b/src/node/Greenhouse/Greenhouse.cpp new file mode 100644 index 0000000..f51ae4c --- /dev/null +++ b/src/node/Greenhouse/Greenhouse.cpp @@ -0,0 +1,15 @@ +#ifdef NODE_GREENHOUSE + +#include "http.h" +#include "sensors.h" + +void patrixSetup() { + sensorsSetup(); + httpSetup2(); +} + +void patrixLoop() { + sensorsLoop(); +} + +#endif diff --git a/src/node/Greenhouse/http.cpp b/src/node/Greenhouse/http.cpp new file mode 100644 index 0000000..3a9d201 --- /dev/null +++ b/src/node/Greenhouse/http.cpp @@ -0,0 +1,25 @@ +#ifdef NODE_GREENHOUSE + +#include + +#include "http.h" +#include "sensors.h" +#include "../../patrix/mqtt.h" + +void httpStatus(AsyncWebServerRequest* request) { + JsonDocument json; + json["illuminance"] = greenhouseTSL.getIlluminance();; + json["temperature"] = greenhouseDHT22.getTemperature(); + json["relative"] = greenhouseDHT22.getRelative(); + json["absolute"] = greenhouseDHT22.getAbsolute(); + + AsyncResponseStream* stream = request->beginResponseStream("application/json"); + serializeJson(json, *stream); + request->send(stream); +} + +void httpSetup2() { + server.on("/status", httpStatus); +} + +#endif diff --git a/src/node/Greenhouse/http.h b/src/node/Greenhouse/http.h new file mode 100644 index 0000000..615b2b0 --- /dev/null +++ b/src/node/Greenhouse/http.h @@ -0,0 +1,16 @@ +#ifdef NODE_GREENHOUSE + +#ifndef HTTP_H +#define HTTP_H + +#include "patrix/http.h" + +void httpStatus(AsyncWebServerRequest* request); + +void httpTargetAdd(AsyncWebServerRequest* request); + +void httpSetup2(); + +#endif + +#endif diff --git a/src/Greenhouse.cpp b/src/node/Greenhouse/sensors.cpp similarity index 68% rename from src/Greenhouse.cpp rename to src/node/Greenhouse/sensors.cpp index dc9f854..64cfd36 100644 --- a/src/Greenhouse.cpp +++ b/src/node/Greenhouse/sensors.cpp @@ -1,20 +1,19 @@ #ifdef NODE_GREENHOUSE -#include "patrix/tsl2561.h" -#include "patrix/DHT22.h" +#include "sensors.h" TSL2561 greenhouseTSL("greenhouse"); DHT22Sensor greenhouseDHT22("greenhouse", D5); -void patrixSetup() { +void sensorsSetup() { greenhouseTSL.setup(); greenhouseDHT22.setup(); } -void patrixLoop() { +void sensorsLoop() { greenhouseTSL.loop(); greenhouseDHT22.loop(); } -#endif +#endif \ No newline at end of file diff --git a/src/node/Greenhouse/sensors.h b/src/node/Greenhouse/sensors.h new file mode 100644 index 0000000..76da48e --- /dev/null +++ b/src/node/Greenhouse/sensors.h @@ -0,0 +1,19 @@ +#ifdef NODE_GREENHOUSE + +#ifndef SENSORS_H +#define SENSORS_H + +#include "patrix/DHT22.h" +#include "patrix/tsl2561.h" + +extern TSL2561 greenhouseTSL; + +extern DHT22Sensor greenhouseDHT22; + +void sensorsSetup(); + +void sensorsLoop(); + +#endif + +#endif diff --git a/src/patrix/DHT22.h b/src/patrix/DHT22.h index cb5a2c9..f80d2b5 100644 --- a/src/patrix/DHT22.h +++ b/src/patrix/DHT22.h @@ -1,8 +1,9 @@ #ifndef DHT22_H #define DHT22_H -#include "mqtt.h" #include "DHT_U.h" +#include "humidityRelative.h" +#include "mqtt.h" class DHT22Sensor { @@ -12,6 +13,12 @@ class DHT22Sensor { unsigned long last = 0UL; + double temperature = NAN; + + double relative = NAN; + + double absolute = NAN; + public: const String name; @@ -29,26 +36,28 @@ public: void loop() { const auto now = max(1UL, millis()); - float temperature = NAN; if (now - last >= intervalMs) { sensors_event_t event; dht.temperature().getEvent(&event); - if (isnan(event.temperature)) { + temperature = event.temperature; + if (isnan(temperature)) { + absolute = NAN; Log.error("Error reading temperature!"); } else { - temperature = event.temperature; mqttPublishValue(name + "/temperature", temperature, "TEMPERATURE_C"); } dht.humidity().getEvent(&event); - if (isnan(event.relative_humidity)) { + relative = event.relative_humidity; + if (isnan(relative)) { + absolute = NAN; Log.error("Error reading humidity!"); } else { - mqttPublishValue(name + "/humidity/relative", event.relative_humidity, "HUMIDITY_RELATIVE_PERCENT"); + mqttPublishValue(name + "/humidity/relative", relative, "HUMIDITY_RELATIVE_PERCENT"); if (!isnan(temperature)) { - double absHumid = calculateHumidityAbsolute(event.temperature, event.relative_humidity); - mqttPublishValue(name + "/humidity/absolute", absHumid, "HUMIDITY_ABSOLUTE_GM3"); + absolute = calculateHumidityAbsolute(temperature, relative); + mqttPublishValue(name + "/humidity/absolute", absolute, "HUMIDITY_ABSOLUTE_GM3"); } } @@ -56,16 +65,16 @@ public: } } - static double calculateHumidityAbsolute(const double temperature, const double humidityRelative) { - constexpr auto A = 6.112; - constexpr auto m = 17.67; - constexpr auto Tn = 243.5; - constexpr auto Mw = 18.01534; - constexpr auto R = 8.314462618; - const auto Tk = temperature + 273.15; - const auto P_sat = A * exp((m * temperature) / (temperature + Tn)); - const auto P_act = P_sat * (humidityRelative / 100.0); - return (P_act * Mw) / (R * Tk); + [[nodiscard]] double getTemperature() const { + return temperature; + } + + [[nodiscard]] double getRelative() const { + return relative; + } + + [[nodiscard]] double getAbsolute() const { + return absolute; } }; diff --git a/src/patrix/bme680.h b/src/patrix/bme680.h index b9595cb..09ade22 100644 --- a/src/patrix/bme680.h +++ b/src/patrix/bme680.h @@ -2,6 +2,7 @@ #define BME680_H #include "Adafruit_BME680.h" +#include "humidityRelative.h" #include "mqtt.h" class BME680 { @@ -59,18 +60,6 @@ public: } - static double calculateHumidityAbsolute(const double temperature, const double humidityRelative) { - constexpr auto A = 6.112; - constexpr auto m = 17.67; - constexpr auto Tn = 243.5; - constexpr auto Mw = 18.01534; - constexpr auto R = 8.314462618; - const auto Tk = temperature + 273.15; - const auto P_sat = A * exp((m * temperature) / (temperature + Tn)); - const auto P_act = P_sat * (humidityRelative / 100.0); - return (P_act * Mw) / (R * Tk); - } - }; #endif diff --git a/src/patrix/bmp280_aht20.h b/src/patrix/bmp280_aht20.h index c208fd4..044a5c4 100644 --- a/src/patrix/bmp280_aht20.h +++ b/src/patrix/bmp280_aht20.h @@ -3,6 +3,7 @@ #include "Adafruit_BMP280.h" #include "Adafruit_AHTX0.h" +#include "humidityRelative.h" #include "mqtt.h" class BMP280_AHT20 { @@ -88,18 +89,6 @@ public: mqttPublishValue(name + "/absolute", absolute, "HUMIDITY_ABSOLUTE_GM3"); } - static double calculateHumidityAbsolute(const double temperature, const double humidityRelative) { - constexpr auto A = 6.112; - constexpr auto m = 17.67; - constexpr auto Tn = 243.5; - constexpr auto Mw = 18.01534; - constexpr auto R = 8.314462618; - const auto Tk = temperature + 273.15; - const auto P_sat = A * exp((m * temperature) / (temperature + Tn)); - const auto P_act = P_sat * (humidityRelative / 100.0); - return (P_act * Mw) / (R * Tk); - } - }; #endif diff --git a/src/patrix/humidityRelative.cpp b/src/patrix/humidityRelative.cpp new file mode 100644 index 0000000..9dc137b --- /dev/null +++ b/src/patrix/humidityRelative.cpp @@ -0,0 +1,15 @@ +#include "humidityRelative.h" + +#include + +double calculateHumidityAbsolute(const double temperatureCelsius, const double humidityRelativePercent) { + constexpr auto A = 6.112; + constexpr auto m = 17.67; + constexpr auto Tn = 243.5; + constexpr auto Mw = 18.01534; + constexpr auto R = 8.314462618; + const auto Tk = temperatureCelsius + 273.15; + const auto P_sat = A * exp((m * temperatureCelsius) / (temperatureCelsius + Tn)); + const auto P_act = P_sat * humidityRelativePercent; + return (P_act * Mw) / (R * Tk); +} diff --git a/src/patrix/humidityRelative.h b/src/patrix/humidityRelative.h new file mode 100644 index 0000000..8a54ef6 --- /dev/null +++ b/src/patrix/humidityRelative.h @@ -0,0 +1,6 @@ +#ifndef HUMIDITY_RELATIVE_H +#define HUMIDITY_RELATIVE_H + +double calculateHumidityAbsolute(double temperatureCelsius, double humidityRelativePercent); + +#endif diff --git a/src/patrix/tsl2561.h b/src/patrix/tsl2561.h index b4145d3..398ac5b 100644 --- a/src/patrix/tsl2561.h +++ b/src/patrix/tsl2561.h @@ -10,6 +10,8 @@ class TSL2561 { unsigned long last = 0UL; + int64_t illuminance = -1; + public: const String name; @@ -38,14 +40,19 @@ public: } } + [[nodiscard]] int64_t getIlluminance() const { + return illuminance; + } + private: void read() { uint16_t broadband; uint16_t ir; tsl.getLuminosity(&broadband, &ir); - const auto illuminance = tsl.calculateLux(broadband, ir); + illuminance = tsl.calculateLux(broadband, ir); if (illuminance == 65536) { + illuminance = -1; Log.error("TSL2561 \"%s\": Failed to read.", name.c_str()); setup(); } else {