Overview:
This IoT-based project is designed to automate the watering of plants by monitoring soil moisture and environmental conditions in real time. It ensures optimal soil hydration, reducing manual effort and promoting healthier plant growth.
IoT Hardware:
Cloud Platform:
Control Logic:
When the soil moisture sensor detects dryness below a defined threshold, the ESP32 triggers the motor pump to water the plant. Watering continues until the sensor reads the desired moisture level, after which the pump is turned off automatically.
Arduino Cloud Design
Casing Design:
Prototype With 3D Printed Casing
Arduino IDE Code:
#include "thingProperties.h"
#include <DHT.h>
#define relayPin 12
#define moisturePin A0
#define DHTPIN 2
#define DHTTYPE DHT11
#define debugPin 4
#define wet 210
#define dry 510
DHT dht(DHTPIN, DHTTYPE);
unsigned long lastSensorRead = 0;
const unsigned long sensorReadInterval = 2000; // Read sensors every 2 seconds
const unsigned long pumpOnDuration = 5000; // Minimum pump on duration in milliseconds
bool pumpState = false;
unsigned long pumpActivatedTime = 0;
void setup() {
Serial.begin(9600);
delay(1500);
pinMode(relayPin, OUTPUT);
pinMode(debugPin, INPUT);
digitalWrite(relayPin, HIGH);
dht.begin();
// Initialize properties
initProperties();
// Connect to Arduino IoT Cloud
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
// Set debug message level
setDebugMessageLevel(4);
ArduinoCloud.printDebugInfo();
Serial.print("Connecting to WiFi: ");
Serial.println(SSID);
// Wait for WiFi to connect
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println();
Serial.print("Connected to WiFi, IP address: ");
Serial.println(WiFi.localIP());
// Wait for the IoT Cloud connection
Serial.println("Connecting to Arduino IoT Cloud...");
while (ArduinoCloud.connected() != 1) {
ArduinoCloud.update();
delay(1000);
Serial.print(".");
}
Serial.println("Connected to Arduino IoT Cloud");
}
void loop() {
ArduinoCloud.update();
// Only read sensor values and control the pump if connected to the IoT Cloud
if (ArduinoCloud.connected() && (millis() - lastSensorRead >= sensorReadInterval)) {
lastSensorRead = millis();
sensorValue = analogRead(moisturePin);
int moisturePercent = map(sensorValue, dry, wet, 0, 100);
temperature = dht.readTemperature();
humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Moisture: ");
Serial.print(moisturePercent);
Serial.print("%, Temperature: ");
Serial.print(temperature);
Serial.print("°C, Humidity: ");
Serial.print(humidity);
Serial.println("%");
// Automatic pump control based on soil moisture
if ((moisturePercent < 30 || digitalRead(debugPin) == HIGH) && !pumpState) { // Adjust this threshold based on your needs
// Turn pump on
digitalWrite(relayPin, LOW);
relay = true;
pumpState = true;
pumpActivatedTime = millis();
if (digitalRead(debugPin) == HIGH) {
Serial.println("DebugPin Triggered");
}
} else if ((moisturePercent > 40 && pumpState) && (millis() - pumpActivatedTime >= pumpOnDuration)) { // Adjust this threshold based on your needs
// Turn pump off
digitalWrite(relayPin, HIGH);
relay = false;
pumpState = false;
}
}
}
// Arduino IoT Cloud callback function
void onRelayChange() {
if (relay) {
digitalWrite(relayPin, LOW);
} else {
digitalWrite(relayPin, HIGH);
}
}
void onSensorChange() {
// Placeholder for sensor change logic if needed
}