#include #include #include //using namespace std; extern "C" { #include "freertos/FreeRTOS.h" #include "freertos/task.h" } #define MQTT_MOISTURE MQTT_PATH_PUB "moisture" #define MQTT_TEMPERATURE MQTT_PATH_PUB "temperature" #define MQTT_HUMIDITY MQTT_PATH_PUB "humidity" #define MQTT_BRIGHTNESS MQTT_PATH_PUB "brightness" 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(); Serial.print("Light intensity: "); Serial.print(lxValue); Serial.println(" lx"); sprintf(buffer, "%f", lxValue); publishMessage(MQTT_BRIGHTNESS, buffer); int mstValue = readCapacitiveSoilMoistureSensor(); Serial.print("Soil moisture: "); Serial.println(mstValue); sprintf(buffer, "%i", mstValue); publishMessage(MQTT_MOISTURE, buffer); float humidityValue = readHumidity(); Serial.print("Humidity: "); Serial.println(humidityValue); sprintf(buffer, "%f", humidityValue); publishMessage(MQTT_HUMIDITY, buffer); float temperatureValue = readTemperature(); Serial.print("Temperature: "); Serial.println(temperatureValue); sprintf(buffer, "%f", temperatureValue); publishMessage(MQTT_TEMPERATURE, buffer); Serial.print("\n"); } bool openValve() { digitalWrite(PIN_VALVE, HIGH); digitalWrite(PIN_LED_G, LOW); digitalWrite(PIN_LED_B, HIGH); return true; } bool closeValve() { digitalWrite(PIN_VALVE, LOW); digitalWrite(PIN_LED_G, HIGH); digitalWrite(PIN_LED_B, LOW); return false; } void valveTask(void *parameter) { unsigned long valveTimeoutTimer = millis(); bool valveOpen = openValve(); while (valveOpen) { delay(500); int mstValue = readCapacitiveSoilMoistureSensor(); if (millis() - valveTimeoutTimer >= MAX_VALVE_TIMEOUT) { valveOpen = closeValve(); } // if (mstValue > 80) { // valveOpen = closeValve(); // } } vTaskDelete(NULL); } void toggleValve() { xTaskCreate( valveTask, /* Task function. */ "valveTask", /* String with name of task. */ 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; persistSoilProps(FC, PWP, SAT); Serial.print("new fieldCapacity: "); Serial.println(fieldCapacity); Serial.print("new permanentWiltingPoint: "); Serial.println(permanentWiltingPoint); Serial.print("new soilSaturation: "); Serial.println(soilSaturation); }