diff --git a/src/capacitiveSoilMoistureSensor.cpp b/src/capacitiveSoilMoistureSensor.cpp index b5184f9..ff6ff1d 100644 --- a/src/capacitiveSoilMoistureSensor.cpp +++ b/src/capacitiveSoilMoistureSensor.cpp @@ -4,12 +4,25 @@ #include +const int numReadings = 20; + void setupCapacitiveSoilMoistureSensor() { // pinMode(PIN_MS, INPUT); } int readCapacitiveSoilMoistureSensor() { - int measurement = analogRead(PIN_MS); + int total = 0; // the running total + // read from the sensor: + for (int readIndex = 0; readIndex < numReadings; readIndex++) + { + total = total + analogRead(PIN_MS); + delay(2); + } + int measurement = total / numReadings; + Serial.print("soil moisture raw: "); + Serial.println(measurement); + // add the reading to the total: + //int measurement = analogRead(PIN_MS); return map(measurement, VALUE_AIR, VALUE_WATER, 0, 100); } \ No newline at end of file diff --git a/src/connections.cpp b/src/connections.cpp index ead2694..9971b25 100644 --- a/src/connections.cpp +++ b/src/connections.cpp @@ -57,19 +57,13 @@ void WiFiEvent(WiFiEvent_t event) void onMqttConnect(bool sessionPresent) { Serial.println("Connected to MQTT."); + Serial.print("Session present: "); Serial.println(sessionPresent); - uint16_t packetIdSub = mqttClient.subscribe("smartgarden/test", 2); - Serial.print("Subscribing at QoS 2, packetId: "); - Serial.println(packetIdSub); - mqttClient.publish("test/lol", 0, true, "test 1"); - Serial.println("Publishing at QoS 0"); - uint16_t packetIdPub1 = mqttClient.publish("smartgarden/test", 1, true, "test 2"); - Serial.print("Publishing at QoS 1, packetId: "); - Serial.println(packetIdPub1); - uint16_t packetIdPub2 = mqttClient.publish("smartgarden/test", 2, true, "test 3"); - Serial.print("Publishing at QoS 2, packetId: "); - Serial.println(packetIdPub2); + + uint16_t packetIdSub = mqttClient.subscribe(MQTT_PATH_SUB, 2); + Serial.print("subscribed to: "); + Serial.println(MQTT_PATH_SUB); } void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) @@ -84,10 +78,10 @@ void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) void onMqttSubscribe(uint16_t packetId, uint8_t qos) { - Serial.println("Subscribe acknowledged."); - Serial.print(" packetId: "); - Serial.println(packetId); - Serial.print(" qos: "); + Serial.print("Subscribe acknowledged:"); + Serial.print(" packetId: "); + Serial.print(packetId); + Serial.print(" qos: "); Serial.println(qos); } @@ -100,33 +94,26 @@ void onMqttUnsubscribe(uint16_t packetId) void onMqttMessage(char *topic, char *payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { - Serial.println("Publish received."); - Serial.print(" topic: "); + Serial.print("Publish received: "); + Serial.print(" topic: "); Serial.println(topic); - Serial.print(" qos: "); - Serial.println(properties.qos); - Serial.print(" dup: "); - Serial.println(properties.dup); - Serial.print(" retain: "); - Serial.println(properties.retain); - Serial.print(" len: "); - Serial.println(len); - Serial.print(" index: "); - Serial.println(index); - Serial.print(" total: "); - Serial.println(total); + + if (strcmp(topic, "smartgarden/commands") == 0 ) { + Serial.println("executing command..."); + Serial.println(topic); + toggleValve(); + } } void onMqttPublish(uint16_t packetId) { - Serial.println("Publish acknowledged."); - Serial.print(" packetId: "); + Serial.print("Publish acknowledged: "); + Serial.print(" packetId: "); Serial.println(packetId); } void setupConnections() { - pinMode(PIN_LED_G, OUTPUT); Serial.println(); Serial.println(); diff --git a/src/header.h b/src/header.h index 262df6e..3ecd521 100644 --- a/src/header.h +++ b/src/header.h @@ -26,11 +26,12 @@ // MOISTURE SENSOR // A7 #define PIN_MS 35 -#define VALUE_WATER 275 -#define VALUE_AIR 430 +#define VALUE_WATER 1650 +#define VALUE_AIR 3500 // Ventil -#define PIN_VENTIL 26 +#define PIN_VALVE 32 +#define MAX_VALVE_TIMEOUT 10000 // LED #define PIN_LED_R 2 @@ -40,9 +41,12 @@ // MQTT #define MQTT_HOST "mqtt.timovolkmann.de" #define MQTT_PORT 1883 -#define MQTT_DEVICE_ID "esp-timo" -#define MQTT_TOPIC_BASE_SUBSCRIBE "smartgarden/commands" -#define MQTT_TOPIC_BASE_PUBLISH "smartgarden/updates" +#define MQTT_DEVICE_ID "esp-sebastian +#define MQTT_TOPIC_BASE_SUB "smartgarden/commands" +#define MQTT_TOPIC_BASE_PUB "smartgarden/updates" +#define MQTT_PATH_PUB MQTT_TOPIC_BASE_PUB "/" MQTT_DEVICE_ID "/" +#define MQTT_PATH_SUB MQTT_TOPIC_BASE_SUB "/#" +// MQTT_DEVICE_ID "/#" // PUBLISH FREQUENCY (MS) #define FREQUENCY 3000 @@ -66,4 +70,8 @@ extern void publishMessage(const char *topic, const char *msg); // RGB PWM LED extern void setupPWM(); -extern void activateLight(); \ No newline at end of file +extern void activateLight(); + +// sensors +void readSensors(); +void toggleValve(); \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 6988b3f..98cccc5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,13 +3,23 @@ */ #include +#include -unsigned long pingTimer = 0; -char buffer[16]; +unsigned long sensorReadTimer = 0; +bool valveOpen = false; -void setup() { +void setup() +{ Serial.begin(115200); - pingTimer = millis(); + sensorReadTimer = millis(); + + pinMode(PIN_VALVE, OUTPUT); + pinMode(PIN_LED_R, OUTPUT); + pinMode(PIN_LED_G, OUTPUT); + pinMode(PIN_LED_B, OUTPUT); + + digitalWrite(PIN_VALVE, LOW); + setupConnections(); setupLightSensor(); setupPWM(); @@ -20,36 +30,17 @@ void setup() { Serial.println(); } -void loop() { - if (millis() - pingTimer >= FREQUENCY) { - float lxValue = readLightSensorValue(); - Serial.print("Light intensity: "); - Serial.print(lxValue); - Serial.println(" lx"); - sprintf(buffer, "%f", lxValue); - publishMessage("smartgarden/updates/esp-N2Ff4kaDgs45/brightness", buffer); - - int mstValue = readCapacitiveSoilMoistureSensor(); - Serial.print("Soil moisture: "); - Serial.println(mstValue); - sprintf(buffer, "%i", mstValue); - publishMessage("smartgarden/updates/esp-N2Ff4kaDgs45/moisture", buffer); - - float humidityValue = readHumidity(); - Serial.print("Humidity: "); - Serial.println(humidityValue); - sprintf(buffer, "%f", humidityValue); - publishMessage("smartgarden/updates/esp-N2Ff4kaDgs45/humidity", buffer); - - float temperatureValue = readTemperature(); - Serial.print("Temperature: "); - Serial.println(temperatureValue); - sprintf(buffer, "%f", temperatureValue); - publishMessage("smartgarden/updates/esp-N2Ff4kaDgs45/temperature", buffer); - Serial.print("\n"); - - activateLight(); - - pingTimer = millis(); +void loop() +{ + // read sensors + if (millis() - sensorReadTimer >= FREQUENCY) + { + readSensors(); + sensorReadTimer = millis(); } -} \ No newline at end of file + // toggle valve + if (valveOpen) { + + } +} + diff --git a/src/peripherals.cpp b/src/peripherals.cpp new file mode 100644 index 0000000..f7d68d2 --- /dev/null +++ b/src/peripherals.cpp @@ -0,0 +1,90 @@ +#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]; + +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. */ + 10000, /* Stack size in bytes. */ + NULL, /* Parameter passed as input of the task */ + 1, /* Priority of the task. */ + NULL); /* Task handle. */ +}