From 47d58777c56344d6cc1c2d455f98868af7bcb476 Mon Sep 17 00:00:00 2001 From: Timo Volkmann Date: Tue, 30 Jun 2020 21:15:30 +0200 Subject: [PATCH 1/4] introduced soil thresholds --- platformio.ini | 3 ++- src/connections.cpp | 34 ++++++++++++++++++++++++++++------ src/header.h | 7 ++++++- src/peripherals.cpp | 19 +++++++++++++++++++ 4 files changed, 55 insertions(+), 8 deletions(-) diff --git a/platformio.ini b/platformio.ini index fe810f5..130393d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -19,6 +19,7 @@ lib_deps = 19 #DHT sensor library 31 #Adafruit Unified Sensor AutoConnect@^1.1.7 - ; ESPRandom@^1.3.3 AsyncMqttClient@^0.8.2 + ArduinoJson@^6.15.2 + ; ESPRandom@^1.3.3 ; PubSubClient@^2.8 \ No newline at end of file diff --git a/src/connections.cpp b/src/connections.cpp index 9971b25..4646376 100644 --- a/src/connections.cpp +++ b/src/connections.cpp @@ -1,4 +1,5 @@ #include +#include extern "C" { @@ -6,6 +7,9 @@ extern "C" #include "freertos/timers.h" } +#define MQTT_VALVE_COMMAND MQTT_TOPIC_BASE_SUB "/" MQTT_DEVICE_ID "/valve" +#define MQTT_SOIL_PROPERTIES MQTT_TOPIC_BASE_SUB "/" MQTT_DEVICE_ID "/soil" + AsyncMqttClient mqttClient; TimerHandle_t mqttReconnectTimer; TimerHandle_t wifiReconnectTimer; @@ -87,7 +91,7 @@ void onMqttSubscribe(uint16_t packetId, uint8_t qos) void onMqttUnsubscribe(uint16_t packetId) { - Serial.println("Unsubscribe acknowledged."); + Serial.print("Unsubscribe acknowledged."); Serial.print(" packetId: "); Serial.println(packetId); } @@ -98,18 +102,36 @@ void onMqttMessage(char *topic, char *payload, AsyncMqttClientMessageProperties Serial.print(" topic: "); Serial.println(topic); - if (strcmp(topic, "smartgarden/commands") == 0 ) { - Serial.println("executing command..."); + if (strcmp(topic, MQTT_VALVE_COMMAND) == 0 ) { + Serial.println("toggling valve..."); Serial.println(topic); toggleValve(); } + if (strcmp(topic, MQTT_SOIL_PROPERTIES) == 0 ) { + Serial.println("recieving soil thresholds..."); + Serial.println(topic); + Serial.println(payload); + // const int capacity = JSON_OBJECT_SIZE(3) + 2 * JSON_OBJECT_SIZE(1); + StaticJsonDocument<1024> doc; + DeserializationError err = deserializeJson(doc, payload); + if (err == DeserializationError::Ok) { + int fc = doc["fc"]; + int pwp = doc["pwp"]; + int sat = doc["sat"]; + Serial.println(doc.size()); + Serial.println(doc["fc"].as()); + Serial.println(doc["pwp"].as()); + Serial.println(doc["sat"].as()); + setSoilProperties(fc, pwp, sat); + } + } } void onMqttPublish(uint16_t packetId) { - Serial.print("Publish acknowledged: "); - Serial.print(" packetId: "); - Serial.println(packetId); + // Serial.print("Publish acknowledged: "); + // Serial.print(" packetId: "); + // Serial.println(packetId); } void setupConnections() diff --git a/src/header.h b/src/header.h index 4b91a52..f5d9aa4 100644 --- a/src/header.h +++ b/src/header.h @@ -17,6 +17,10 @@ #include #include +// fix for core panic during wifi initialization +// #define configMINIMAL_STACK_SIZE 2048 +// #define CONFIG_TIMER_TASK_STACK_SIZE 8192 + // DHT11 #define PIN_DHT11 14 @@ -70,4 +74,5 @@ extern void publishMessage(const char *topic, const char *msg); // sensors void readSensors(); -void toggleValve(); \ No newline at end of file +void toggleValve(); +void setSoilProperties(int FC, int PWP, int SAT); \ No newline at end of file diff --git a/src/peripherals.cpp b/src/peripherals.cpp index f7d68d2..6af2657 100644 --- a/src/peripherals.cpp +++ b/src/peripherals.cpp @@ -14,6 +14,13 @@ extern "C" char buffer[16]; +// Feldkapazität des Bodens in Prozent: Standard ist Humus +int fieldCapacity = 44; +// PWP des Bodens in Prozent: Standard ist Humus +int permanentWiltingPoint = 25; +// Boden vollständig gesättigt bei (Prozent): Standard ist Humus +int soilSaturation = 69; + void readSensors() { float lxValue = readLightSensorValue(); @@ -88,3 +95,15 @@ void toggleValve() 1, /* Priority of the task. */ NULL); /* Task handle. */ } + +void setSoilProperties(int FC, int PWP, int SAT) { + fieldCapacity = FC; + permanentWiltingPoint = PWP; + soilSaturation = SAT; + Serial.print("fieldCapacity: "); + Serial.println(fieldCapacity); + Serial.print("permanentWiltingPoint: "); + Serial.println(permanentWiltingPoint); + Serial.print("soilSaturation: "); + Serial.println(soilSaturation); +} From 32b68508146461be685629f0c8cfe18f15b52fbc Mon Sep 17 00:00:00 2001 From: Timo Volkmann Date: Tue, 30 Jun 2020 23:03:06 +0200 Subject: [PATCH 2/4] refactored mqtt connections --- platformio.ini | 5 +- src/connections.cpp | 148 +++++++++++++++++++++++--------------------- src/header.h | 1 - src/peripherals.cpp | 1 + 4 files changed, 80 insertions(+), 75 deletions(-) diff --git a/platformio.ini b/platformio.ini index 130393d..e5db3ad 100644 --- a/platformio.ini +++ b/platformio.ini @@ -21,5 +21,6 @@ lib_deps = AutoConnect@^1.1.7 AsyncMqttClient@^0.8.2 ArduinoJson@^6.15.2 - ; ESPRandom@^1.3.3 - ; PubSubClient@^2.8 \ No newline at end of file + MQTT@^2.4.7 + ; PubSubClient@^2.8 + ; ESPRandom@^1.3.3 \ No newline at end of file diff --git a/src/connections.cpp b/src/connections.cpp index 4646376..299d809 100644 --- a/src/connections.cpp +++ b/src/connections.cpp @@ -1,4 +1,5 @@ #include +#include #include extern "C" @@ -7,13 +8,15 @@ extern "C" #include "freertos/timers.h" } -#define MQTT_VALVE_COMMAND MQTT_TOPIC_BASE_SUB "/" MQTT_DEVICE_ID "/valve" -#define MQTT_SOIL_PROPERTIES MQTT_TOPIC_BASE_SUB "/" MQTT_DEVICE_ID "/soil" +#define MQTT_VALVE_COMMAND MQTT_TOPIC_BASE_SUB "/" MQTT_DEVICE_ID "/valve" +#define MQTT_SOIL_PROPERTIES MQTT_TOPIC_BASE_SUB "/" MQTT_DEVICE_ID "/soil" -AsyncMqttClient mqttClient; TimerHandle_t mqttReconnectTimer; TimerHandle_t wifiReconnectTimer; +// TimerHandle_t mqttProcessingTimer; +TaskHandle_t mqttTask; + WebServer Server; AutoConnect Portal(Server); WiFiClient client; @@ -21,6 +24,7 @@ WiFiClient client; AutoConnectConfig Config; // Config.autoReconnect = true; // WiFi.config(Config); +MQTTClient mqttClient; void connectWiFi() { @@ -31,11 +35,49 @@ void connectWiFi() } } +void mqttLoop(void *parameter) +{ + bool x; + do { + x = mqttClient.loop(); + delay(50); + } while (mqttClient.connected()); + + if (!mqttClient.connected()) + { + Serial.println("Disconnected from MQTT."); + if (WiFi.isConnected()) + { + xTimerStart(mqttReconnectTimer, 0); + } + } + vTaskDelete(NULL); +} + void connectMQTT() { Serial.println("Connecting to MQTT..."); - mqttClient.setClientId(MQTT_DEVICE_ID); - mqttClient.connect(); + mqttClient.begin(MQTT_HOST, MQTT_PORT, client); + mqttClient.connect(MQTT_DEVICE_ID); + if (mqttClient.connected()) + { + Serial.println("Connected!"); + } + else + { + Serial.println("NOT Connected!"); + } + mqttClient.subscribe(MQTT_PATH_SUB, 2); + Serial.print("subscribed to: "); + Serial.println(MQTT_PATH_SUB); + xTaskCreate( + mqttLoop, /* Task function. */ + "mqttLoop", /* String with name of task. */ + 8192, /* Stack size in bytes. */ + NULL, /* Parameter passed as input of the task */ + 1, /* Priority of the task. */ + &mqttTask); /* Task handle. */ + //xTimerStart(mqttProcessingTimer, 0); } void WiFiEvent(WiFiEvent_t event) @@ -51,110 +93,72 @@ void WiFiEvent(WiFiEvent_t event) break; case SYSTEM_EVENT_STA_DISCONNECTED: digitalWrite(PIN_LED_G, LOW); - Serial.println("WiFi lost connection"); xTimerStop(mqttReconnectTimer, 0); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi + // xTimerStop(mqttProcessingTimer, 0); xTimerStart(wifiReconnectTimer, 0); break; } } -void onMqttConnect(bool sessionPresent) +void onMqttMessage(MQTTClient *client, char topic[], char payload[], int payload_length) { - Serial.println("Connected to MQTT."); - - Serial.print("Session present: "); - Serial.println(sessionPresent); - - uint16_t packetIdSub = mqttClient.subscribe(MQTT_PATH_SUB, 2); - Serial.print("subscribed to: "); - Serial.println(MQTT_PATH_SUB); -} - -void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) -{ - Serial.println("Disconnected from MQTT."); - - if (WiFi.isConnected()) + Serial.print("Message arrived ["); + Serial.print(topic); + Serial.print("] "); + for (int i = 0; i < payload_length; i++) { - xTimerStart(mqttReconnectTimer, 0); + Serial.print((char)payload[i]); } -} + Serial.println(); -void onMqttSubscribe(uint16_t packetId, uint8_t qos) -{ - Serial.print("Subscribe acknowledged:"); - Serial.print(" packetId: "); - Serial.print(packetId); - Serial.print(" qos: "); - Serial.println(qos); -} - -void onMqttUnsubscribe(uint16_t packetId) -{ - Serial.print("Unsubscribe acknowledged."); - Serial.print(" packetId: "); - Serial.println(packetId); -} - -void onMqttMessage(char *topic, char *payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) -{ - Serial.print("Publish received: "); - Serial.print(" topic: "); - Serial.println(topic); - - if (strcmp(topic, MQTT_VALVE_COMMAND) == 0 ) { + if (strcmp(topic, MQTT_VALVE_COMMAND) == 0) + { Serial.println("toggling valve..."); Serial.println(topic); toggleValve(); } - if (strcmp(topic, MQTT_SOIL_PROPERTIES) == 0 ) { - Serial.println("recieving soil thresholds..."); + if (strcmp(topic, MQTT_SOIL_PROPERTIES) == 0) + { + Serial.println("receiving soil thresholds..."); Serial.println(topic); Serial.println(payload); // const int capacity = JSON_OBJECT_SIZE(3) + 2 * JSON_OBJECT_SIZE(1); StaticJsonDocument<1024> doc; DeserializationError err = deserializeJson(doc, payload); - if (err == DeserializationError::Ok) { + if (err == DeserializationError::Ok) + { int fc = doc["fc"]; int pwp = doc["pwp"]; int sat = doc["sat"]; - Serial.println(doc.size()); - Serial.println(doc["fc"].as()); - Serial.println(doc["pwp"].as()); - Serial.println(doc["sat"].as()); setSoilProperties(fc, pwp, sat); } + else + { + Serial.println(err.c_str()); + } } } -void onMqttPublish(uint16_t packetId) -{ - // Serial.print("Publish acknowledged: "); - // Serial.print(" packetId: "); - // Serial.println(packetId); -} - void setupConnections() { Serial.println(); Serial.println(); - mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void *)0, reinterpret_cast(connectMQTT)); - wifiReconnectTimer = xTimerCreate("wifiTimer", pdMS_TO_TICKS(2000), pdFALSE, (void *)0, reinterpret_cast(connectWiFi)); + mqttReconnectTimer = xTimerCreate( + "mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void *)0, reinterpret_cast(connectMQTT)); + wifiReconnectTimer = xTimerCreate( + "wifiTimer", pdMS_TO_TICKS(2000), pdFALSE, (void *)0, reinterpret_cast(connectWiFi)); + // mqttProcessingTimer = xTimerCreate( + // "messageTimer", pdMS_TO_TICKS(50), pdTRUE, (void *)0, reinterpret_cast(mqttLoop)); WiFi.onEvent(WiFiEvent); - mqttClient.onConnect(onMqttConnect); - mqttClient.onDisconnect(onMqttDisconnect); - mqttClient.onSubscribe(onMqttSubscribe); - mqttClient.onUnsubscribe(onMqttUnsubscribe); - mqttClient.onMessage(onMqttMessage); - mqttClient.onPublish(onMqttPublish); - mqttClient.setServer(MQTT_HOST, MQTT_PORT); + mqttClient.onMessageAdvanced(onMqttMessage); connectWiFi(); } -void publishMessage(const char *topic, const char *msg) { - mqttClient.publish(topic, 1, true, msg); +void publishMessage(const char *topic, const char *msg) +{ + mqttClient.publish(topic, msg, true, 1); } diff --git a/src/header.h b/src/header.h index f5d9aa4..79b4164 100644 --- a/src/header.h +++ b/src/header.h @@ -15,7 +15,6 @@ #include #include #include -#include // fix for core panic during wifi initialization // #define configMINIMAL_STACK_SIZE 2048 diff --git a/src/peripherals.cpp b/src/peripherals.cpp index 6af2657..b1d3c59 100644 --- a/src/peripherals.cpp +++ b/src/peripherals.cpp @@ -106,4 +106,5 @@ void setSoilProperties(int FC, int PWP, int SAT) { Serial.println(permanentWiltingPoint); Serial.print("soilSaturation: "); Serial.println(soilSaturation); + // TODO save to nvs nonvolatile flash storage } From 861d8b527b82d99cf410c108a21cd1c9fdaa3fb4 Mon Sep 17 00:00:00 2001 From: Timo Volkmann Date: Tue, 30 Jun 2020 23:14:17 +0200 Subject: [PATCH 3/4] code style --- .vscode/settings.json | 3 ++ src/connections.cpp | 87 ++++++++++++++++--------------------------- src/lightSensor.cpp | 13 +++---- src/main.cpp | 12 ++---- src/peripherals.cpp | 19 ++++------ 5 files changed, 53 insertions(+), 81 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..379e402 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "cquery.cacheDirectory": "${workspaceFolder}/.vscode/cquery_cached_index/" +} \ No newline at end of file diff --git a/src/connections.cpp b/src/connections.cpp index 299d809..c62572c 100644 --- a/src/connections.cpp +++ b/src/connections.cpp @@ -1,9 +1,8 @@ -#include -#include #include +#include +#include -extern "C" -{ +extern "C" { #include "freertos/FreeRTOS.h" #include "freertos/timers.h" } @@ -26,45 +25,36 @@ AutoConnectConfig Config; // WiFi.config(Config); MQTTClient mqttClient; -void connectWiFi() -{ +void connectWiFi() { Serial.println("Start WiFi..."); - if (Portal.begin()) - { + if (Portal.begin()) { digitalWrite(PIN_LED_G, HIGH); } } -void mqttLoop(void *parameter) -{ +void mqttLoop(void *parameter) { bool x; do { x = mqttClient.loop(); delay(50); } while (mqttClient.connected()); - if (!mqttClient.connected()) - { + if (!mqttClient.connected()) { Serial.println("Disconnected from MQTT."); - if (WiFi.isConnected()) - { + if (WiFi.isConnected()) { xTimerStart(mqttReconnectTimer, 0); } } vTaskDelete(NULL); } -void connectMQTT() -{ +void connectMQTT() { Serial.println("Connecting to MQTT..."); mqttClient.begin(MQTT_HOST, MQTT_PORT, client); mqttClient.connect(MQTT_DEVICE_ID); - if (mqttClient.connected()) - { + if (mqttClient.connected()) { Serial.println("Connected!"); - } - else - { + } else { Serial.println("NOT Connected!"); } mqttClient.subscribe(MQTT_PATH_SUB, 2); @@ -80,67 +70,57 @@ void connectMQTT() //xTimerStart(mqttProcessingTimer, 0); } -void WiFiEvent(WiFiEvent_t event) -{ +void WiFiEvent(WiFiEvent_t event) { Serial.printf("[WiFi-event] event: %d\n", event); - switch (event) - { - case SYSTEM_EVENT_STA_GOT_IP: - Serial.println("WiFi connected"); - Serial.println("IP address: "); - Serial.println(WiFi.localIP()); - connectMQTT(); - break; - case SYSTEM_EVENT_STA_DISCONNECTED: - digitalWrite(PIN_LED_G, LOW); - xTimerStop(mqttReconnectTimer, 0); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi - // xTimerStop(mqttProcessingTimer, 0); - xTimerStart(wifiReconnectTimer, 0); - break; + switch (event) { + case SYSTEM_EVENT_STA_GOT_IP: + Serial.println("WiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + connectMQTT(); + break; + case SYSTEM_EVENT_STA_DISCONNECTED: + digitalWrite(PIN_LED_G, LOW); + xTimerStop(mqttReconnectTimer, 0); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi + // xTimerStop(mqttProcessingTimer, 0); + xTimerStart(wifiReconnectTimer, 0); + break; } } -void onMqttMessage(MQTTClient *client, char topic[], char payload[], int payload_length) -{ +void onMqttMessage(MQTTClient *client, char topic[], char payload[], int payload_length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); - for (int i = 0; i < payload_length; i++) - { + for (int i = 0; i < payload_length; i++) { Serial.print((char)payload[i]); } Serial.println(); - if (strcmp(topic, MQTT_VALVE_COMMAND) == 0) - { + if (strcmp(topic, MQTT_VALVE_COMMAND) == 0) { Serial.println("toggling valve..."); Serial.println(topic); toggleValve(); } - if (strcmp(topic, MQTT_SOIL_PROPERTIES) == 0) - { + if (strcmp(topic, MQTT_SOIL_PROPERTIES) == 0) { Serial.println("receiving soil thresholds..."); Serial.println(topic); Serial.println(payload); // const int capacity = JSON_OBJECT_SIZE(3) + 2 * JSON_OBJECT_SIZE(1); StaticJsonDocument<1024> doc; DeserializationError err = deserializeJson(doc, payload); - if (err == DeserializationError::Ok) - { + if (err == DeserializationError::Ok) { int fc = doc["fc"]; int pwp = doc["pwp"]; int sat = doc["sat"]; setSoilProperties(fc, pwp, sat); - } - else - { + } else { Serial.println(err.c_str()); } } } -void setupConnections() -{ +void setupConnections() { Serial.println(); Serial.println(); @@ -158,7 +138,6 @@ void setupConnections() connectWiFi(); } -void publishMessage(const char *topic, const char *msg) -{ +void publishMessage(const char *topic, const char *msg) { mqttClient.publish(topic, msg, true, 1); } diff --git a/src/lightSensor.cpp b/src/lightSensor.cpp index 1dca49b..776a3fd 100644 --- a/src/lightSensor.cpp +++ b/src/lightSensor.cpp @@ -3,13 +3,12 @@ BH1750 lightMeter; void setupLightSensor() { - Wire.begin(); - lightMeter.begin(); - Serial.println("Sensor started..."); + Wire.begin(); + lightMeter.begin(); + Serial.println("Sensor started..."); } -float readLightSensorValue() -{ - float intensity = lightMeter.readLightLevel(); - return intensity; +float readLightSensorValue() { + float intensity = lightMeter.readLightLevel(); + return intensity; } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 2e450c8..7f05ea8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,13 +3,13 @@ */ #include + #include unsigned long sensorReadTimer = 0; bool valveOpen = false; -void setup() -{ +void setup() { Serial.begin(115200); sensorReadTimer = millis(); @@ -29,17 +29,13 @@ void setup() Serial.println(); } -void loop() -{ +void loop() { // read sensors - if (millis() - sensorReadTimer >= FREQUENCY) - { + if (millis() - sensorReadTimer >= FREQUENCY) { readSensors(); sensorReadTimer = millis(); } // toggle valve if (valveOpen) { - } } - diff --git a/src/peripherals.cpp b/src/peripherals.cpp index b1d3c59..5da69ee 100644 --- a/src/peripherals.cpp +++ b/src/peripherals.cpp @@ -1,8 +1,8 @@ #include + #include //using namespace std; -extern "C" -{ +extern "C" { #include "freertos/FreeRTOS.h" #include "freertos/task.h" } @@ -21,8 +21,7 @@ int permanentWiltingPoint = 25; // Boden vollständig gesättigt bei (Prozent): Standard ist Humus int soilSaturation = 69; -void readSensors() -{ +void readSensors() { float lxValue = readLightSensorValue(); Serial.print("Light intensity: "); Serial.print(lxValue); @@ -64,18 +63,15 @@ bool closeValve() { return false; } -void valveTask(void *parameter) -{ +void valveTask(void *parameter) { unsigned long valveTimeoutTimer = millis(); bool valveOpen = openValve(); - while (valveOpen) - { + while (valveOpen) { delay(500); int mstValue = readCapacitiveSoilMoistureSensor(); - if (millis() - valveTimeoutTimer >= MAX_VALVE_TIMEOUT) - { + if (millis() - valveTimeoutTimer >= MAX_VALVE_TIMEOUT) { valveOpen = closeValve(); } // if (mstValue > 80) { @@ -85,8 +81,7 @@ void valveTask(void *parameter) vTaskDelete(NULL); } -void toggleValve() -{ +void toggleValve() { xTaskCreate( valveTask, /* Task function. */ "valveTask", /* String with name of task. */ From a6fbbfab73922a8ae953c983ac7829e82ff4ff59 Mon Sep 17 00:00:00 2001 From: Timo Volkmann Date: Thu, 2 Jul 2020 21:50:12 +0200 Subject: [PATCH 4/4] switched mqtt client; implemented persistence --- platformio.ini | 5 +++-- src/connections.cpp | 31 +++++++++++++++++----------- src/header.h | 3 ++- src/main.cpp | 1 + src/peripherals.cpp | 50 ++++++++++++++++++++++++++++++++++++++++----- 5 files changed, 70 insertions(+), 20 deletions(-) diff --git a/platformio.ini b/platformio.ini index e5db3ad..346cfd9 100644 --- a/platformio.ini +++ b/platformio.ini @@ -21,6 +21,7 @@ lib_deps = AutoConnect@^1.1.7 AsyncMqttClient@^0.8.2 ArduinoJson@^6.15.2 - MQTT@^2.4.7 - ; PubSubClient@^2.8 + ; MQTT@^2.4.7 + PubSubClient@^2.8 + ArduinoNvs@^2.5 ; ESPRandom@^1.3.3 \ No newline at end of file diff --git a/src/connections.cpp b/src/connections.cpp index c62572c..3830f28 100644 --- a/src/connections.cpp +++ b/src/connections.cpp @@ -1,5 +1,6 @@ #include -#include +// #include +#include #include extern "C" { @@ -23,7 +24,8 @@ WiFiClient client; AutoConnectConfig Config; // Config.autoReconnect = true; // WiFi.config(Config); -MQTTClient mqttClient; +// MQTTClient mqttClient; +PubSubClient mqttClient(client); void connectWiFi() { Serial.println("Start WiFi..."); @@ -33,15 +35,15 @@ void connectWiFi() { } void mqttLoop(void *parameter) { - bool x; do { - x = mqttClient.loop(); + mqttClient.loop(); delay(50); } while (mqttClient.connected()); - + Serial.println("Disconnected from MQTT."); if (!mqttClient.connected()) { - Serial.println("Disconnected from MQTT."); + Serial.println("Checking WiFi Connection."); if (WiFi.isConnected()) { + Serial.println("Starting reconnect timer for MQTT."); xTimerStart(mqttReconnectTimer, 0); } } @@ -50,14 +52,15 @@ void mqttLoop(void *parameter) { void connectMQTT() { Serial.println("Connecting to MQTT..."); - mqttClient.begin(MQTT_HOST, MQTT_PORT, client); + // mqttClient.begin(MQTT_HOST, MQTT_PORT, client); + mqttClient.setServer(MQTT_HOST, MQTT_PORT); mqttClient.connect(MQTT_DEVICE_ID); if (mqttClient.connected()) { Serial.println("Connected!"); } else { Serial.println("NOT Connected!"); } - mqttClient.subscribe(MQTT_PATH_SUB, 2); + mqttClient.subscribe(MQTT_PATH_SUB); Serial.print("subscribed to: "); Serial.println(MQTT_PATH_SUB); xTaskCreate( @@ -88,7 +91,8 @@ void WiFiEvent(WiFiEvent_t event) { } } -void onMqttMessage(MQTTClient *client, char topic[], char payload[], int payload_length) { +// void onMqttMessage(MQTTClient *client, char topic[], char payload[], int payload_length) { +void onMqttMessage(char *topic, byte *payload, unsigned int payload_length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); @@ -105,7 +109,8 @@ void onMqttMessage(MQTTClient *client, char topic[], char payload[], int payload if (strcmp(topic, MQTT_SOIL_PROPERTIES) == 0) { Serial.println("receiving soil thresholds..."); Serial.println(topic); - Serial.println(payload); + //Serial.println(reinterpret_cast(payload)); + // Serial.println(payload); // const int capacity = JSON_OBJECT_SIZE(3) + 2 * JSON_OBJECT_SIZE(1); StaticJsonDocument<1024> doc; DeserializationError err = deserializeJson(doc, payload); @@ -133,11 +138,13 @@ void setupConnections() { WiFi.onEvent(WiFiEvent); - mqttClient.onMessageAdvanced(onMqttMessage); + // mqttClient.onMessageAdvanced(onMqttMessage); + mqttClient.setCallback(onMqttMessage); connectWiFi(); } void publishMessage(const char *topic, const char *msg) { - mqttClient.publish(topic, msg, true, 1); + mqttClient.publish(topic, msg); + // mqttClient.publish(topic, msg, true, 1); } diff --git a/src/header.h b/src/header.h index 79b4164..7955c34 100644 --- a/src/header.h +++ b/src/header.h @@ -74,4 +74,5 @@ extern void publishMessage(const char *topic, const char *msg); // sensors void readSensors(); void toggleValve(); -void setSoilProperties(int FC, int PWP, int SAT); \ No newline at end of file +void setSoilProperties(int FC, int PWP, int SAT); +void setupStore(); \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 7f05ea8..3a609ee 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,6 +20,7 @@ void setup() { digitalWrite(PIN_VALVE, LOW); + setupStore(); setupConnections(); setupLightSensor(); setupTemperatureSensor(); diff --git a/src/peripherals.cpp b/src/peripherals.cpp index 5da69ee..f0e6e27 100644 --- a/src/peripherals.cpp +++ b/src/peripherals.cpp @@ -1,4 +1,5 @@ #include +#include #include //using namespace std; @@ -85,21 +86,60 @@ void toggleValve() { xTaskCreate( valveTask, /* Task function. */ "valveTask", /* String with name of task. */ - 10000, /* Stack size in bytes. */ + 512, /* Stack size in bytes. */ NULL, /* Parameter passed as input of the task */ 1, /* Priority of the task. */ NULL); /* Task handle. */ } +void persistSoilProps(int FC, int PWP, int SAT) { + Serial.println("persistSoilProps"); + bool f = NVS.setInt("fieldCapacity", FC); + bool p = NVS.setInt("permanentWilt", PWP); + bool s = NVS.setInt("soilSaturation", SAT); + if (f && p && s) { + Serial.println("Soil properties sucessfully stored."); + NVS.commit(); + } + else { + Serial.println("error occured while trying to persist soil properties"); + } +} + +void restoreSoilProps() { + Serial.println("restoreSoilProps"); + int fc = NVS.getInt("fieldCapacity"); + int pwp = NVS.getInt("permanentWilt"); + int sat = NVS.getInt("soilSaturation"); + if (fc != 0) { + fieldCapacity = fc; + } + if (pwp != 0) { + permanentWiltingPoint = pwp; + } + if (sat != 0) { + soilSaturation = sat; + } + Serial.print(fieldCapacity); + Serial.print(permanentWiltingPoint); + Serial.print(soilSaturation); +} + +void setupStore() { + NVS.begin("store"); + restoreSoilProps(); +} + void setSoilProperties(int FC, int PWP, int SAT) { fieldCapacity = FC; permanentWiltingPoint = PWP; soilSaturation = SAT; - Serial.print("fieldCapacity: "); + persistSoilProps(FC, PWP, SAT); + Serial.print("new fieldCapacity: "); Serial.println(fieldCapacity); - Serial.print("permanentWiltingPoint: "); + Serial.print("new permanentWiltingPoint: "); Serial.println(permanentWiltingPoint); - Serial.print("soilSaturation: "); + Serial.print("new soilSaturation: "); Serial.println(soilSaturation); - // TODO save to nvs nonvolatile flash storage } +