#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL3exlln7UM"
#define BLYNK_TEMPLATE_NAME "smart farming system with iot"
#define BLYNK_AUTH_TOKEN "4a3zIw27p3IS3cHosu6btWvcS3ZhvsVB"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
#define SOIL_PIN 34
#define DHTPIN 15
#define DHTTYPE DHT22
#define RELAY_PIN 26
#define TRIG_PIN 5
#define ECHO_PIN 18
#define SOIL_LED 27
#define PUMP_LED 14
#define BUZZER_PIN 25
#define TANK_HEIGHT 20 // cm
DHT dht(DHTPIN, DHTTYPE);
BlynkTimer timer;
bool manualMode = false;
int moistureThreshold = 40;
BLYNK_WRITE(V0) { // Pump control
manualMode = true;
int pumpState = param.asInt();
digitalWrite(RELAY_PIN, pumpState ? LOW : HIGH);
}
void sendSensorData() {
int soilRaw = analogRead(SOIL_PIN);
int soilPercent = map(soilRaw, 4095, 0, 0, 100);
Blynk.virtualWrite(V1, soilPercent);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
Blynk.virtualWrite(V2, temperature);
Blynk.virtualWrite(V3, humidity);
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
int distance = duration * 0.034 / 2;
int waterLevel = TANK_HEIGHT - distance;
if (waterLevel < 0) waterLevel = 0;
Blynk.virtualWrite(V4, waterLevel);
// LEDs & Buzzer
digitalWrite(SOIL_LED, soilPercent < moistureThreshold ? HIGH : LOW);
digitalWrite(PUMP_LED, digitalRead(RELAY_PIN) == LOW ? HIGH : LOW);
digitalWrite(BUZZER_PIN, waterLevel <= 5 ? HIGH : LOW);
// Serial debug
Serial.print("Soil: "); Serial.print(soilPercent);
Serial.print("% | Temp: "); Serial.print(temperature);
Serial.print("C | Hum: "); Serial.print(humidity);
Serial.print("% | Water: "); Serial.println(waterLevel);
}
void setup() {
Serial.begin(9600);
pinMode(RELAY_PIN, OUTPUT);
pinMode(SOIL_LED, OUTPUT);
pinMode(PUMP_LED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
digitalWrite(RELAY_PIN, HIGH); // Pump OFF
dht.begin();
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Blynk.config(BLYNK_AUTH_TOKEN);
Blynk.connect();
timer.setInterval(2000L, sendSensorData);
}
void loop() {
Blynk.run();
timer.run();
}