diff --git a/platformio.ini b/platformio.ini index 66b201d..6944d77 100644 --- a/platformio.ini +++ b/platformio.ini @@ -3,7 +3,10 @@ data_dir = ${PROJECT_DIR}/data/${PIOENV} [common] framework = arduino -lib_deps = https://github.com/milesburton/Arduino-Temperature-Control-Library +lib_deps = SPI + https://github.com/adafruit/Adafruit_BusIO + https://github.com/milesburton/Arduino-Temperature-Control-Library + https://github.com/olewolf/DHT_nonblocking https://github.com/adafruit/Adafruit_TSL2561 https://github.com/knolleary/pubsubclient https://github.com/adafruit/Adafruit_BME680 @@ -34,10 +37,10 @@ lib_deps = ${common.lib_deps} build_flags = ${common.build_flags} -DNODE_GREENHOUSE -DHOSTNAME=\"Greenhouse\" board_build.filesystem = ${common.board_build.filesystem} monitor_speed = ${common.monitor_speed} -upload_protocol = ${common.upload_protocol} -upload_port = 10.0.0.160 -;upload_port = ${common.upload_port} -;upload_speed = ${common.upload_speed} +;upload_protocol = ${common.upload_protocol} +;upload_port = 10.0.0.160 +upload_port = ${common.upload_port} +upload_speed = ${common.upload_speed} [env:Fermenter] platform = ${esp12e.platform} diff --git a/src/Greenhouse.cpp b/src/Greenhouse.cpp index 898c699..dc833b6 100644 --- a/src/Greenhouse.cpp +++ b/src/Greenhouse.cpp @@ -1,24 +1,19 @@ #ifdef NODE_GREENHOUSE -#include "patrix/bme680.h" #include "patrix/tsl2561.h" +#include "patrix/DHT22.h" -TSL2561 gardenTSL("garden"); +TSL2561 greenhouseTSL("greenhouse"); -BME680 gardenBME("garden"); - -BME680 greenhouseBME("greenhouse"); +DHT22 greenhouseDHT22("greenhouse", D5); void patrixSetup() { - gardenTSL.setup(); - gardenBME.setup(); - greenhouseBME.setup(); + greenhouseTSL.setup(); } void patrixLoop() { - gardenTSL.loop(); - gardenBME.loop(); - greenhouseBME.loop(); + greenhouseTSL.loop(); + greenhouseDHT22.loop(); } #endif \ No newline at end of file diff --git a/src/patrix/DHT22.h b/src/patrix/DHT22.h new file mode 100644 index 0000000..ad0d6d0 --- /dev/null +++ b/src/patrix/DHT22.h @@ -0,0 +1,57 @@ +#ifndef DHT22_H +#define DHT22_H + +#include + +#include "mqtt.h" + +class DHT22 { + + int pin; + + DHT_nonblocking sensor; + + unsigned long last = 0UL; + +public: + + const String name; + + unsigned long intervalMs; + + explicit DHT22(String name, const int pin, const unsigned long interval_ms = 5000) : pin(pin), sensor(pin, DHT_TYPE_22), name(std::move(name)), intervalMs(interval_ms) { + // + } + + void loop() { + const auto now = max(1UL, millis()); + if (last == 0 || now - last >= intervalMs) { + float temp = NAN; + float relHumid = NAN; + if (sensor.measure(&temp, &relHumid)) { + double absHumid = calculateHumidityAbsolute(temp, relHumid); + mqttPublishValue(name + "/temperature", temp, "TEMPERATURE_C"); + mqttPublishValue(name + "/humidity/relative", relHumid, "HUMIDITY_RELATIVE_PERCENT"); + mqttPublishValue(name + "/humidity/absolute", absHumid, "HUMIDITY_ABSOLUTE_GM3"); + } else { + Log.error("Failed to read DHT22: %s", name.c_str()); + } + last = now; + } + } + + 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/tsl2561.h b/src/patrix/tsl2561.h index c3ec09c..b4145d3 100644 --- a/src/patrix/tsl2561.h +++ b/src/patrix/tsl2561.h @@ -2,6 +2,7 @@ #define TSL2561_H #include "Adafruit_TSL2561_U.h" +#include "mqtt.h" class TSL2561 {