#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <ESP32Servo.h>
// Pin definitions
#define DHTPIN 4
#define DHTTYPE DHT22
#define SOIL_MOISTURE_PIN 34
#define RELAY_PIN 18
#define LED_PIN 2
#define SERVO_PIN 5
// Soil moisture threshold
const int moistureThreshold = 2000;
// Components
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo waterPump;
// Wokwi relay module: LOW = relay ON
const int RELAY_ON = LOW;
const int RELAY_OFF = HIGH;
void setup() {
Serial.begin(115200);
dht.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Smart Irrigation");
lcd.setCursor(0, 1);
lcd.print("System Starting");
delay(2000);
lcd.clear();
waterPump.attach(SERVO_PIN);
waterPump.write(0);
pinMode(SOIL_MOISTURE_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(RELAY_PIN, RELAY_OFF);
digitalWrite(LED_PIN, LOW);
}
void startWatering() {
digitalWrite(RELAY_PIN, RELAY_ON);
digitalWrite(LED_PIN, HIGH);
waterPump.write(90);
}
void stopWatering() {
digitalWrite(RELAY_PIN, RELAY_OFF);
digitalWrite(LED_PIN, LOW);
waterPump.write(0);
}
void loop() {
int soilMoistureValue = analogRead(SOIL_MOISTURE_PIN);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
bool soilIsDry = soilMoistureValue < moistureThreshold;
if (soilIsDry) {
startWatering();
} else {
stopWatering();
}
// LCD Row 1: Temperature and Humidity
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
if (isnan(temperature) || isnan(humidity)) {
lcd.print("DHT Error");
} else {
lcd.print("T:");
lcd.print(temperature, 1);
lcd.print("C H:");
lcd.print(humidity, 0);
lcd.print("%");
}
// LCD Row 2: Moisture and pump status
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("M:");
lcd.print(soilMoistureValue);
lcd.print(" Pump:");
if (soilIsDry) {
lcd.print("ON");
} else {
lcd.print("OFF");
}
// Serial Monitor output
Serial.print("Soil Moisture: ");
Serial.print(soilMoistureValue);
Serial.print(" | Temperature: ");
Serial.print(temperature);
Serial.print(" C | Humidity: ");
Serial.print(humidity);
Serial.print(" % | Pump: ");
Serial.println(soilIsDry ? "ON" : "OFF");
delay(2000);
}ESP32 Controller
DHT22 Temp & Humidity Sensor
LCD Display
Soil Moisture Sensor Simulation
Pump Status LED
Water Pump Simulation
Relay Module
220Ω Resistor for LED Protection
Breadboard