/*
* Smart Irrigation System with Soil Moisture Sensor
* ESP32 based automatic plant watering system
*
* Components:
* - ESP32 DevKit
* - Soil Moisture Sensor (Analog)
* - Relay Module
* - Water Pump
* - LED indicators
*/
// Pin Definitions
#define SOIL_MOISTURE_PIN 34 // Analog pin for soil moisture sensor
#define RELAY_PIN 25 // Digital pin to control relay/pump
#define LED_DRY 26 // LED indicator for dry soil (Red)
#define LED_WET 27 // LED indicator for wet soil (Green)
#define LED_PUMP 33 // LED indicator for pump status (Blue)
// Threshold values (adjust based on your sensor)
#define DRY_THRESHOLD 40 // Below this value, soil is dry (0-100 scale)
#define WET_THRESHOLD 70 // Above this value, soil is wet enough
// Timing constants
#define PUMP_ON_TIME 5000 // Pump runs for 5 seconds
#define READ_INTERVAL 2000 // Read sensor every 2 seconds
// Variables
int soilMoistureValue = 0;
int soilMoisturePercent = 0;
bool pumpActive = false;
unsigned long lastReadTime = 0;
unsigned long pumpStartTime = 0;
void setup() {
// Initialize Serial Monitor
Serial.begin(115200);
Serial.println("Smart Irrigation System Starting...");
// Configure pins
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_DRY, OUTPUT);
pinMode(LED_WET, OUTPUT);
pinMode(LED_PUMP, OUTPUT);
// Initialize outputs to OFF
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_DRY, LOW);
digitalWrite(LED_WET, LOW);
digitalWrite(LED_PUMP, LOW);
Serial.println("System Ready!");
Serial.println("Monitoring soil moisture...");
Serial.println("-------------------------------");
}
void loop() {
unsigned long currentTime = millis();
// Read soil moisture at regular intervals
if (currentTime - lastReadTime >= READ_INTERVAL) {
readSoilMoisture();
lastReadTime = currentTime;
}
// Control irrigation based on moisture level
if (!pumpActive && soilMoisturePercent < DRY_THRESHOLD) {
// Soil is dry, start watering
startPump();
}
// Stop pump after designated time
if (pumpActive && (currentTime - pumpStartTime >= PUMP_ON_TIME)) {
stopPump();
}
// Update LED indicators
updateLEDIndicators();
}
void readSoilMoisture() {
// Read analog value from sensor
soilMoistureValue = analogRead(SOIL_MOISTURE_PIN);
// Convert to percentage (0-100%)
// ESP32 ADC: 0-4095 (12-bit)
// Higher value = more moisture
soilMoisturePercent = map(soilMoistureValue, 0, 4095, 0, 100);
// Display readings
Serial.print("Soil Moisture: ");
Serial.print(soilMoisturePercent);
Serial.print("% (Raw: ");
Serial.print(soilMoistureValue);
Serial.print(") Status: ");
if (soilMoisturePercent < DRY_THRESHOLD) {
Serial.println("DRY - Needs watering!");
} else if (soilMoisturePercent > WET_THRESHOLD) {
Serial.println("WET - No watering needed");
} else {
Serial.println("MODERATE - Monitoring");
}
}
void startPump() {
if (!pumpActive) {
pumpActive = true;
pumpStartTime = millis();
digitalWrite(RELAY_PIN, HIGH);
digitalWrite(LED_PUMP, HIGH);
Serial.println(">>> PUMP STARTED - Watering plants...");
}
}
void stopPump() {
if (pumpActive) {
pumpActive = false;
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_PUMP, LOW);
Serial.println(">>> PUMP STOPPED - Watering complete");
Serial.println("-------------------------------");
}
}
void updateLEDIndicators() {
// Update soil moisture indicator LEDs
if (soilMoisturePercent < DRY_THRESHOLD) {
digitalWrite(LED_DRY, HIGH);
digitalWrite(LED_WET, LOW);
} else if (soilMoisturePercent > WET_THRESHOLD) {
digitalWrite(LED_DRY, LOW);
digitalWrite(LED_WET, HIGH);
} else {
// Moderate moisture - both LEDs dim or off
digitalWrite(LED_DRY, LOW);
digitalWrite(LED_WET, LOW);
}
}