#define BLYNK_TEMPLATE_ID "TMPL61CoTxHjD"
#define BLYNK_TEMPLATE_NAME "Smart Irrigation System for Home Gardens"
#define BLYNK_AUTH_TOKEN "GjrxE8wwzw6dEeHFNuqwevj_fq99NDIm"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <ESP32Servo.h>
// WiFi credentials
char ssid[] = "Wokwi-GUEST"; // Replace with your WiFi SSID
char pass[] = ""; // Replace with your WiFi password
// DHT22 Sensor configuration
#define DHTPIN 15 // Temperature & Humidity
#define DHTTYPE DHT22
DHT dhtTempHum(DHTPIN, DHTTYPE);
#define RAIN_SENSOR_PIN 32
DHT dhtRain(RAIN_SENSOR_PIN, DHTTYPE);
#define SOIL_MOISTURE_PIN 34
#define SOIL_MOISTURE_DRY 4095 // Dry value for potentiometer
#define SOIL_MOISTURE_WET 0 // Wet value for potentiometer
// LDR Sensor configuration
#define LDR_PIN 35
// LEDs configuration
#define LED_PUMP_RED 21 // Red LED for pump status
#define LED_VALVE_RED 22 // Red LED for valve status
#define LED_TEMP_RED 23 // Red LED for high temperature
#define LED_TEMP_GREEN 19 // Green LED for normal temperature
// Pump and Valve configuration
#define PUMP_PIN 26
#define VALVE_PIN 27
Servo pumpServo;
Servo valveServo;
BlynkTimer timer;
// Variable to store the state of manual control
bool manualControl = false;
void sendSensorData() {
// Read humidity and temperature from DHT22 sensor
float humidity = dhtTempHum.readHumidity();
float temperature = dhtTempHum.readTemperature();
// Simulate rain detection
float rainHumidity = dhtRain.readHumidity();
int rainDetected = (rainHumidity > 80.0) ? LOW : HIGH;
// Simulate soil moisture detection using potentiometer
int soilMoistureValue = analogRead(SOIL_MOISTURE_PIN);
int moisturePercentage = map(soilMoistureValue, SOIL_MOISTURE_DRY, SOIL_MOISTURE_WET, 0, 100);
moisturePercentage = constrain(moisturePercentage, 0, 100);
// Read light intensity from LDR sensor
int lightValue = analogRead(LDR_PIN);
// Print data to Serial Monitor for debugging
Serial.print("Soil Moisture: ");
Serial.print(moisturePercentage);
Serial.print("%, Rain Detected: ");
Serial.print(rainDetected == LOW ? "Yes" : "No");
Serial.print(", Temperature: ");
Serial.print(temperature);
Serial.print("°C, Humidity: ");
Serial.print(humidity);
Serial.println("%, Light Intensity: ");
Serial.println(lightValue);
// Publish data to Blynk virtual pins
Blynk.virtualWrite(V0, moisturePercentage); // Soil moisture
Blynk.virtualWrite(V1, rainDetected); // Rain detection
Blynk.virtualWrite(V2, String(temperature) + "°C / " + String(humidity) + "%"); // Temperature and Humidity
Blynk.virtualWrite(V3, lightValue); // Light intensity
// Call control functions
controlIrrigation(moisturePercentage, rainDetected, lightValue, temperature, humidity);
indicateTemperature(temperature);
}
// Manual control for pump and valve using a single button
BLYNK_WRITE(V4) { // Use virtual pin V4 for pump and valve control in Blynk app
manualControl = param.asInt();
if (manualControl) {
pumpServo.write(180);
valveServo.write(180);
digitalWrite(LED_PUMP_RED, HIGH); // Red LED on when pump is on
digitalWrite(LED_VALVE_RED, HIGH); // Red LED on when valve is on
Serial.println("Manual Control: Pump and Valve ON");
} else {
pumpServo.write(0);
valveServo.write(0);
digitalWrite(LED_PUMP_RED, LOW); // Red LED off when pump is off
digitalWrite(LED_VALVE_RED, LOW); // Red LED off when valve is off
Serial.println("Manual Control: Pump and Valve OFF");
}
}
void controlIrrigation(int moisture, int rain, int light, float temp, float humidity) {
// Control water pump and solenoid valve based on sensor data
if (!manualControl) { // Check if manual control is not active
if (moisture < 40 && rain == LOW && light > 100 && temp < 35 && humidity < 90) {
pumpServo.write(180);
valveServo.write(180);
digitalWrite(LED_PUMP_RED, HIGH); // Red LED on when pump is on
digitalWrite(LED_VALVE_RED, HIGH); // Red LED on when valve is on
Serial.println("Automatic Control: Pump and Valve ON");
} else {
pumpServo.write(0);
valveServo.write(0);
digitalWrite(LED_PUMP_RED, LOW); // Red LED off when pump is off
digitalWrite(LED_VALVE_RED, LOW); // Red LED off when valve is off
Serial.println("Automatic Control: Pump and Valve OFF");
}
}
}
void indicateTemperature(float temp) {
// Indicate temperature range with LEDs
if (temp > 30) {
digitalWrite(LED_TEMP_RED, HIGH); // Red LED on for high temperature
digitalWrite(LED_TEMP_GREEN, LOW);
} else if (temp >= 15 && temp <= 30) {
digitalWrite(LED_TEMP_RED, LOW);
digitalWrite(LED_TEMP_GREEN, HIGH); // Green LED on for normal temperature
} else {
digitalWrite(LED_TEMP_RED, LOW);
digitalWrite(LED_TEMP_GREEN, LOW); // Both LEDs off for low temperature
}
}
void setup() {
Serial.begin(9600);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
dhtTempHum.begin();
dhtRain.begin();
// Configure sensor and LED pins
pinMode(SOIL_MOISTURE_PIN, INPUT);
pinMode(DHTPIN, INPUT);
pinMode(RAIN_SENSOR_PIN, INPUT);
pinMode(PUMP_PIN, OUTPUT);
pinMode(VALVE_PIN, OUTPUT);
pinMode(LED_PUMP_RED, OUTPUT); // Red LED for pump status
pinMode(LED_VALVE_RED, OUTPUT); // Red LED for valve status
pinMode(LED_TEMP_RED, OUTPUT); // Red LED for high temperature
pinMode(LED_TEMP_GREEN, OUTPUT); // Green LED for normal temperature
// Attach servos
pumpServo.attach(PUMP_PIN);
valveServo.attach(VALVE_PIN);
// Set initial state of servos and LEDs
pumpServo.write(0);
valveServo.write(0);
digitalWrite(LED_PUMP_RED, LOW);
digitalWrite(LED_VALVE_RED, LOW);
digitalWrite(LED_TEMP_RED, LOW);
digitalWrite(LED_TEMP_GREEN, LOW);
// Set up a timer to send sensor data every second
timer.setInterval(1000L, sendSensorData);
}
void loop() {
Blynk.run();
timer.run();
}