From 562ac507cbe2df84036cbe9925e16ccfb019a493 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Mon, 6 Jan 2025 22:58:49 +0100 Subject: [PATCH] sensors + json [UNTESTED] --- platformio.ini | 1 + src/patrix/Node.cpp | 1 + src/patrix/Node.h | 20 ++++++++ src/{ => patrix}/clock.cpp | 5 +- src/{ => patrix}/clock.h | 0 src/{ => patrix}/log.cpp | 4 +- src/{ => patrix}/log.h | 0 src/{ => patrix}/main.cpp | 4 +- src/{ => patrix}/mqtt.cpp | 5 +- src/{ => patrix}/mqtt.h | 0 src/patrix/sensor/DHT22.h | 41 +++++++++++++++ src/patrix/sensor/Dallas.h | 84 +++++++++++++++++++++++++++++++ src/patrix/sensor/DallasSensor.h | 36 +++++++++++++ src/patrix/sensor/Max6675Sensor.h | 33 ++++++++++++ src/patrix/sensor/Sensor.h | 26 ++++++++++ src/{ => patrix}/wifi.cpp | 0 src/{ => patrix}/wifi.h | 0 17 files changed, 252 insertions(+), 8 deletions(-) create mode 100644 src/patrix/Node.cpp create mode 100644 src/patrix/Node.h rename src/{ => patrix}/clock.cpp (97%) rename src/{ => patrix}/clock.h (100%) rename src/{ => patrix}/log.cpp (96%) rename src/{ => patrix}/log.h (100%) rename src/{ => patrix}/main.cpp (75%) rename src/{ => patrix}/mqtt.cpp (96%) rename src/{ => patrix}/mqtt.h (100%) create mode 100644 src/patrix/sensor/DHT22.h create mode 100644 src/patrix/sensor/Dallas.h create mode 100644 src/patrix/sensor/DallasSensor.h create mode 100644 src/patrix/sensor/Max6675Sensor.h create mode 100644 src/patrix/sensor/Sensor.h rename src/{ => patrix}/wifi.cpp (100%) rename src/{ => patrix}/wifi.h (100%) diff --git a/platformio.ini b/platformio.ini index 20e87dd..a004b1c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -9,6 +9,7 @@ lib_deps = milesburton/DallasTemperature https://github.com/volkszaehler/libsml https://github.com/adafruit/MAX6675-library paulstoffregen/OneWire + bblanchon/ArduinoJson upload_port = /dev/ttyUSB0 upload_speed = 921600 monitor_port = /dev/ttyUSB0 diff --git a/src/patrix/Node.cpp b/src/patrix/Node.cpp new file mode 100644 index 0000000..0c2b14d --- /dev/null +++ b/src/patrix/Node.cpp @@ -0,0 +1 @@ +#include "Node.h" diff --git a/src/patrix/Node.h b/src/patrix/Node.h new file mode 100644 index 0000000..26fb024 --- /dev/null +++ b/src/patrix/Node.h @@ -0,0 +1,20 @@ +#ifndef NODE_H +#define NODE_H + +#include + +class Node { + +public: + + virtual ~Node() = default; + + virtual void setup() = 0; + + virtual void loop() = 0; + + virtual void toJson(JsonDocument& json) = 0; + +}; + +#endif //NODE_H diff --git a/src/clock.cpp b/src/patrix/clock.cpp similarity index 97% rename from src/clock.cpp rename to src/patrix/clock.cpp index 72a5aab..5dfad92 100644 --- a/src/clock.cpp +++ b/src/patrix/clock.cpp @@ -1,8 +1,9 @@ #include "clock.h" -#include #include -#include + +#include "log.h" +#include "wifi.h" #define CLOCK_GMT_OFFSET_SECONDS 3600 #define CLOCK_DST_OFFSET_SECONDS 3600 diff --git a/src/clock.h b/src/patrix/clock.h similarity index 100% rename from src/clock.h rename to src/patrix/clock.h diff --git a/src/log.cpp b/src/patrix/log.cpp similarity index 96% rename from src/log.cpp rename to src/patrix/log.cpp index d3c011d..931a076 100644 --- a/src/log.cpp +++ b/src/patrix/log.cpp @@ -1,10 +1,10 @@ #include "log.h" -#include #include -#include #include +#include "clock.h" + auto logLevel = DEBUG; void log(const LogLevel level, const char *format, const va_list args) { diff --git a/src/log.h b/src/patrix/log.h similarity index 100% rename from src/log.h rename to src/patrix/log.h diff --git a/src/main.cpp b/src/patrix/main.cpp similarity index 75% rename from src/main.cpp rename to src/patrix/main.cpp index d53e43f..ff5cf9b 100644 --- a/src/main.cpp +++ b/src/patrix/main.cpp @@ -1,6 +1,6 @@ -#include -#include +#include +#include "mqtt.h" #include "wifi.h" #include "clock.h" diff --git a/src/mqtt.cpp b/src/patrix/mqtt.cpp similarity index 96% rename from src/mqtt.cpp rename to src/patrix/mqtt.cpp index fbedf85..40705c2 100644 --- a/src/mqtt.cpp +++ b/src/patrix/mqtt.cpp @@ -1,9 +1,10 @@ #include "mqtt.h" -#include #include #include -#include + +#include "log.h" +#include "wifi.h" #define MQTT_RETRY_DELAY_MILLIS 3000 diff --git a/src/mqtt.h b/src/patrix/mqtt.h similarity index 100% rename from src/mqtt.h rename to src/patrix/mqtt.h diff --git a/src/patrix/sensor/DHT22.h b/src/patrix/sensor/DHT22.h new file mode 100644 index 0000000..c4e270a --- /dev/null +++ b/src/patrix/sensor/DHT22.h @@ -0,0 +1,41 @@ +#ifndef DHT22_H +#define DHT22_H + +#include "dht_nonblocking.h" + +class DHT22 final : public Sensor { + + DHT_nonblocking sensor; + + double temperatureThreshold; + + double humidityRelativeThreshold; + + double humidityAbsoluteThreshold; + + float temperature = NAN; + + float humidityRelative = NAN; + + double humidityAbsolute = NAN; + +public: + + DHT22(const int pin, const char *name, const double temperatureThreshold, const double humidityRelativeThreshold, const double humidityAbsoluteThreshold) : Sensor(name), sensor(pin, DHT_TYPE_22), temperatureThreshold(temperatureThreshold), humidityRelativeThreshold(humidityRelativeThreshold), humidityAbsoluteThreshold(humidityAbsoluteThreshold) { + // + } + + bool loop() override { + sensor.measure(&temperature, &humidityRelative); + humidityAbsolute = 6.112 * exp(17.67 * temperature / (243.5 + temperature)) * humidityRelative * 2.1674 / (temperature + 273.15); + } + + void toJson(JsonDocument& json) override { + json[name]["temperature"] = temperature; + json[name]["humidity"]["relative"] = humidityRelative; + json[name]["humidity"]["absolute"] = humidityAbsolute; + } + +}; + +#endif diff --git a/src/patrix/sensor/Dallas.h b/src/patrix/sensor/Dallas.h new file mode 100644 index 0000000..ec6a6cb --- /dev/null +++ b/src/patrix/sensor/Dallas.h @@ -0,0 +1,84 @@ +#ifndef DALLAS_H +#define DALLAS_H + +#include "OneWire.h" + +#include "DallasTemperature.h" + +#define DALLAS_TIMEOUT_MILLISECONDS 3000 + +class Dallas { + + OneWire oneWire; + + DallasTemperature sensors; + + time_t timestamp = 0; + + unsigned long lastMillis = 0; + + bool converting = false; + + bool converted = false; + + bool first = true; + +public: + + explicit Dallas(const int pin) : oneWire(pin), sensors(&oneWire) { + sensors.begin(); + sensors.setWaitForConversion(false); + } + + void loop() { + if (converting) { + if (sensors.isConversionComplete()) { + if (first) { + first = false; + const auto count = sensors.getDeviceCount(); + if (count == 0) { + Serial.printf("ERROR: No Dallas devices found!\n"); + } else { + Serial.printf("Found %d Dallas devices:\n", count); + uint64_t address; + for (int index = 0; index < count; ++index) { + sensors.getAddress(reinterpret_cast(&address), index); + Serial.printf(" - 0x%016llX = %5.1f C\n", address, sensors.getTempC(reinterpret_cast(&address))); + } + } + } + converting = false; + converted = true; + } else if (millis() - lastMillis > DALLAS_TIMEOUT_MILLISECONDS) { + Serial.print("ERROR: Dallas timeout!\n"); + converting = false; + converted = false; + } + } else { + sensors.requestTemperatures(); + timestamp = time(nullptr); + lastMillis = millis(); + converting = true; + converted = false; + } + } + + double read(uint64_t address) { + const auto value = sensors.getTempC(reinterpret_cast(&address)); + if (value <= DEVICE_DISCONNECTED_C) { + return NAN; + } + return value; + } + + time_t getTimestamp() const { + return timestamp; + } + + bool isConverted() const { + return converted; + } + +}; + +#endif diff --git a/src/patrix/sensor/DallasSensor.h b/src/patrix/sensor/DallasSensor.h new file mode 100644 index 0000000..46633bc --- /dev/null +++ b/src/patrix/sensor/DallasSensor.h @@ -0,0 +1,36 @@ +#ifndef DALLAS_SENSOR_H +#define DALLAS_SENSOR_H + +#include "Sensor.h" + +#include "Dallas.h" + +class DallasSensor final : public Sensor { + + Dallas& sensors; + + uint64_t address; + + double threshold; + + double temperature = NAN; + +public: + + DallasSensor(Dallas& sensors, const uint64_t address, const char *name, const double threshold) : Sensor(name), sensors(sensors), address(address), threshold(threshold) { + // - + } + + bool loop() override { + if (sensors.isConverted()) { + temperature = sensors.read(address); + } + } + + void toJson(JsonDocument& json) override { + json[name]["temperature"] = temperature; + } + +}; + +#endif diff --git a/src/patrix/sensor/Max6675Sensor.h b/src/patrix/sensor/Max6675Sensor.h new file mode 100644 index 0000000..6045044 --- /dev/null +++ b/src/patrix/sensor/Max6675Sensor.h @@ -0,0 +1,33 @@ +#ifndef MAX6675SENSOR_H +#define MAX6675SENSOR_H + +#include "max6675.h" + +class Max6675Sensor final : public Sensor { + + MAX6675 sensor; + + double threshold; + + double temperature = NAN; + + unsigned long lastMillis = 0; + +public: + + explicit Max6675Sensor(const int8_t pinMISO, const int8_t pinCS, const int8_t pinCLK, const char *name, const double threshold) : Sensor(name), sensor(pinCLK, pinCS, pinMISO), threshold(threshold) { + // - + } + + bool loop() override { + float current = sensor.readCelsius(); + temperature = current; + } + + void toJson(JsonDocument& json) override { + json[name]["temperature"] = temperature; + } + +}; + +#endif diff --git a/src/patrix/sensor/Sensor.h b/src/patrix/sensor/Sensor.h new file mode 100644 index 0000000..d99834c --- /dev/null +++ b/src/patrix/sensor/Sensor.h @@ -0,0 +1,26 @@ +#ifndef SENSOR_H +#define SENSOR_H + +#include + +class Sensor { + +protected: + + const char *name; + +public: + + explicit Sensor(const char *name): name(name) { + // + } + + virtual ~Sensor() = default; + + virtual bool loop() = 0; + + virtual void toJson(JsonDocument& json) = 0; + +}; + +#endif diff --git a/src/wifi.cpp b/src/patrix/wifi.cpp similarity index 100% rename from src/wifi.cpp rename to src/patrix/wifi.cpp diff --git a/src/wifi.h b/src/patrix/wifi.h similarity index 100% rename from src/wifi.h rename to src/patrix/wifi.h