smart_garden/src/peripherals.cpp

146 lines
3.7 KiB
C++

#include <header.h>
#include <ArduinoNvs.h>
#include <string>
//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);
}