#define BLYNK_TEMPLATE_ID "TMPL6B8kHHDtY"
#define BLYNK_TEMPLATE_NAME "Smart Irrigation"
#define BLYNK_AUTH_TOKEN "QnAZ5yk1d3JXt4qbPLNgGPeLvfDXs25J"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
// Wokwi uses this special WiFi network (no password needed)
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Pin definitions
#define SOIL_PIN 34 // Potentiometer middle pin → simulates soil moisture
#define DHT_PIN 4 // DHT22 data pin
#define PUMP_PIN 5 // LED → simulates water pump/relay
#define DHT_TYPE DHT22
// Irrigation settings
const float MOISTURE_THRESHOLD = 40.0; // Water if soil moisture < 40%
DHT dht(DHT_PIN, DHT_TYPE);
bool manualOverride = false; // Controlled by Blynk switch
// Blynk virtual pin V5 = Manual Override Switch
BLYNK_WRITE(V5) {
manualOverride = param.asInt(); // 1 = ON, 0 = OFF
digitalWrite(PUMP_PIN, manualOverride ? HIGH : LOW);
Blynk.virtualWrite(V3, manualOverride ? 1 : 0); // Update pump status
}
void setup() {
Serial.begin(115200);
Serial.println("Smart Irrigation Prototype Starting...");
pinMode(PUMP_PIN, OUTPUT);
digitalWrite(PUMP_PIN, LOW); // Pump off initially
dht.begin();
// Connect to Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
Serial.println("Connecting to Blynk...");
}
void loop() {
Blynk.run(); // Keep Blynk connection alive
// Read sensors
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Read soil moisture simulation (0-4095 → map to 0-100%)
int soilRaw = analogRead(SOIL_PIN);
float soilMoisture = map(soilRaw, 4095, 1700, 0, 100); // Adjust calibration if needed
soilMoisture = constrain(soilMoisture, 0, 100);
// Automatic logic (only if not manually overridden)
bool autoPump = (soilMoisture < MOISTURE_THRESHOLD);
bool pumpOn = manualOverride || autoPump;
// Control the virtual pump (LED)
digitalWrite(PUMP_PIN, pumpOn ? HIGH : LOW);
// Send data to Blynk dashboard
Blynk.virtualWrite(V0, soilMoisture); // Soil Moisture %
Blynk.virtualWrite(V1, temperature); // Temperature °C
Blynk.virtualWrite(V2, humidity); // Humidity %
Blynk.virtualWrite(V3, pumpOn ? 1 : 0); // Pump Status (1=ON, 0=OFF)
// Print to Serial Monitor (useful for debugging)
Serial.printf("Soil: %.1f%% | Temp: %.1f°C | Hum: %.1f%% | Pump: %s | Manual: %s\n",
soilMoisture, temperature, humidity,
pumpOn ? "ON " : "OFF",
manualOverride ? "YES" : "NO ");
delay(1000); // Update every 5 seconds
}