From df5a7b6c4a22fb096f56586c0edeb2f3d3c526c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Fri, 14 Feb 2025 09:02:06 +0100 Subject: [PATCH] renamed to Greenhouse + code clean --- platformio.ini | 6 +++--- src/main.cpp | 4 ++-- src/mqtt.cpp | 20 +++++++++++++++++++- src/mqtt.h | 10 +++++++--- src/tsl2561.cpp | 19 ++++++++++++------- src/wifi.cpp | 30 ++++++++++++++++++------------ 6 files changed, 61 insertions(+), 28 deletions(-) diff --git a/platformio.ini b/platformio.ini index 6d31b38..196111e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1,12 +1,12 @@ -[env:Helligkeit] +[env:Greenhouse] platform = espressif8266 board = esp12e framework = arduino lib_deps = https://github.com/adafruit/Adafruit_TSL2561 https://github.com/knolleary/pubsubclient -build_flags = -DHOSTNAME=\"Helligkeit\" +build_flags = -DHOSTNAME=\"Greenhouse\" monitor_speed = 115200 upload_protocol = espota -upload_port = 10.0.0.160 +upload_port = 10.0.0.169 ;upload_port = /dev/ttyUSB0 ;upload_speed = 460800 diff --git a/src/main.cpp b/src/main.cpp index 9964960..4230af8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,6 @@ -#include "wifi.h" -#include "tsl2561.h" #include "mqtt.h" +#include "tsl2561.h" +#include "wifi.h" void setup() { delay(500); diff --git a/src/mqtt.cpp b/src/mqtt.cpp index 834643e..8a4081a 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -17,7 +17,7 @@ void mqttLoop() { mqtt.setServer("10.0.0.50", 1883); if (mqtt.connect(HOSTNAME, HOSTNAME, 0, false, "disconnected\n")) { yield(); - mqttPublish("garten/log", "connected\n"); + mqttPublish(HOSTNAME, "connected\n"); MySerial.printf("MQTT connected as \"%s\"\n", HOSTNAME); mqttFailureMillis = 0; } else { @@ -27,6 +27,24 @@ void mqttLoop() { } } +void mqttPublish(const char *topic, const int32_t value, const char *unit) { + if (!isTimeSet()) { + return; + } + char buffer[200]; + snprintf(buffer, sizeof buffer, R"({"timestamp": %lld, "value": %d, "unit": "%s"})", time(nullptr), value, unit); + mqttPublish(topic, buffer); +} + +void mqttPublish(const char *topic, const uint32_t value, const char *unit) { + if (!isTimeSet()) { + return; + } + char buffer[200]; + snprintf(buffer, sizeof buffer, R"({"timestamp": %lld, "value": %d, "unit": "%s"})", time(nullptr), value, unit); + mqttPublish(topic, buffer); +} + void mqttPublish(const char *topic, const float value, const char *unit) { if (!isTimeSet()) { return; diff --git a/src/mqtt.h b/src/mqtt.h index dcbf1c9..d55dcbc 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -7,11 +7,15 @@ void mqttLoop(); +void mqttPublish(const char *topic, int32_t value, const char *unit); + +void mqttPublish(const char *topic, uint32_t value, const char *unit); + void mqttPublish(const char *topic, float value, const char *unit); void mqttPublish(const char *topic, const char *payload); -class MySerialClass : public Stream { +class MySerialClass final : public Stream { PubSubClient& mqtt; @@ -31,7 +35,7 @@ public: Serial.begin(115200); } - size_t write(uint8_t data) override { + size_t write(const uint8_t data) override { Serial.write(data); if (bufferWrite < bufferLast) { *bufferWrite++ = data; @@ -46,7 +50,7 @@ public: mqtt.publish(HOSTNAME, "\n### LOG BUFFER OVERFLOW BY %d BYTES ###\n"); overflow = 0; } - mqtt.publish(HOSTNAME, (const char *) buffer); + mqtt.publish(HOSTNAME, reinterpret_cast(buffer)); bufferWrite = buffer; *bufferWrite = 0; due = false; diff --git a/src/tsl2561.cpp b/src/tsl2561.cpp index 7ca3c4e..51a96c4 100644 --- a/src/tsl2561.cpp +++ b/src/tsl2561.cpp @@ -1,11 +1,13 @@ #include "tsl2561.h" #include "mqtt.h" -#include #include #include +#include -Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345); +#define TSL2561_INTERVAL_MS 5000 + +auto tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT); void sensorSetup() { if (tsl.begin()) { @@ -18,19 +20,22 @@ void sensorSetup() { } void sensorRead() { - sensors_event_t event; - if (!tsl.getEvent(&event)) { + uint16_t broadband; + uint16_t ir; + tsl.getLuminosity(&broadband, &ir); + const auto illuminance = tsl.calculateLux(broadband, ir); + if (illuminance == 65536) { MySerial.printf("TSL2561: Failed to read.\n"); sensorSetup(); } else { - mqttPublish("garten/helligkeit", event.light, "lux"); + mqttPublish("garden/illuminance", illuminance, "lux"); } } void sensorLoop() { - unsigned long now = millis(); + const auto now = millis(); static unsigned long last = 0; - if (last == 0 || now - last >= 2000) { + if (last == 0 || now - last >= TSL2561_INTERVAL_MS) { last = max(1UL, now); sensorRead(); } diff --git a/src/wifi.cpp b/src/wifi.cpp index cbfc233..3e09505 100644 --- a/src/wifi.cpp +++ b/src/wifi.cpp @@ -1,26 +1,31 @@ -#include -#include #include "wifi.h" +#include +#include #include "mqtt.h" -bool wifiConnected = false; +#define WIFI_TIMEOUT_MS 10000 +#define WIFI_SSID "HappyNet" +#define WIFI_PASSWORD "1Grausame!Sackratte7" +#define NTP_SERVER "107.189.12.98" /* pool.ntp.org */ -bool timeSet = false; +auto wifiConnected = false; -unsigned long wifiSince = 0; +auto timeSet = false; + +unsigned long wifiConnectBeginMillis = 0; void wifiConnect() { - wifiSince = max(1UL, millis()); + wifiConnectBeginMillis = max(1UL, millis()); WiFi.setHostname(HOSTNAME); - WiFi.begin("HappyNet", "1Grausame!Sackratte7"); - configTime(TZ_Europe_Berlin, "107.189.12.98"); + WiFi.begin(WIFI_SSID, WIFI_PASSWORD); + configTime(TZ_Europe_Berlin, NTP_SERVER); ArduinoOTA.begin(); yield(); } void timeLoop() { - const time_t now = time(nullptr); - const time_t nowHour = now / 3600; + const auto now = time(nullptr); + const auto nowHour = now / 3600; static unsigned long lastHour = 0; if (!timeSet) { if (now > 1700000000) { @@ -43,7 +48,7 @@ void wifiLoop() { wifiConnected = false; MySerial.printf("WiFi disconnected.\n"); wifiConnect(); - } else if (wifiSince == 0 || millis() - wifiSince >= 10000) { + } else if (wifiConnectBeginMillis == 0 || millis() - wifiConnectBeginMillis >= WIFI_TIMEOUT_MS) { WiFi.disconnect(); yield(); wifiConnect(); @@ -51,6 +56,7 @@ void wifiLoop() { } else { if (!wifiConnected) { wifiConnected = true; + wifiConnectBeginMillis = 0; MySerial.printf("WiFi connected as \"%s\" (%s)\n", HOSTNAME, WiFi.localIP().toString().c_str()); } timeLoop(); @@ -73,4 +79,4 @@ bool isWifiConnected() { bool isTimeSet() { return timeSet; -} \ No newline at end of file +}