#define BLYNK_TEMPLATE_ID "TMPL3RMc96aeu"
#define BLYNK_TEMPLATE_NAME "pesticide"
#define BLYNK_AUTH_TOKEN "YxmM_nTzYOukiSN15_tD3juJYzasWAHd"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// 🔑 Blynk Credentials
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// OLED config
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Sensor Pins
#define SOIL_PIN 34
#define LEAF_PIN 35
#define LDR_PIN 32
// Buzzer
#define BUZZER_PIN 25
// Thresholds
#define SOIL_THRESHOLD_LOW 30
#define SOIL_THRESHOLD_HIGH 70
#define LEAF_THRESHOLD_LOW 30
#define LEAF_THRESHOLD_HIGH 70
#define LIGHT_THRESHOLD 20
BlynkTimer timer;
void sendSensorData() {
int soilValue = analogRead(SOIL_PIN);
int leafValue = analogRead(LEAF_PIN);
int ldrValue = analogRead(LDR_PIN);
int soilPercent = map(soilValue, 0, 4095, 0, 100);
int leafPercent = map(leafValue, 0, 4095, 0, 100);
int lightPercent = map(ldrValue, 0, 4095, 0, 100);
bool highRisk = false;
if (soilPercent < SOIL_THRESHOLD_LOW || soilPercent > SOIL_THRESHOLD_HIGH) highRisk = true;
if (leafPercent < LEAF_THRESHOLD_LOW || leafPercent > LEAF_THRESHOLD_HIGH) highRisk = true;
if (lightPercent < LIGHT_THRESHOLD) highRisk = true;
// Buzzer
digitalWrite(BUZZER_PIN, highRisk ? HIGH : LOW);
// Send to Blynk
Blynk.virtualWrite(V0, soilPercent);
Blynk.virtualWrite(V1, leafPercent);
Blynk.virtualWrite(V2, lightPercent);
Blynk.virtualWrite(V3, highRisk ? 1 : 0);
// Send notification
if (highRisk) {
Blynk.logEvent("plant_infection", "⚠️ Plant Infection Risk Detected!");
}
// OLED Display
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.setTextColor(WHITE);
display.print("Soil: "); display.print(soilPercent); display.println(" %");
display.print("Leaf: "); display.print(leafPercent); display.println(" %");
display.print("Light: "); display.print(lightPercent); display.println(" %");
display.print("Status: ");
display.println(highRisk ? "INFECTION!" : "NORMAL");
display.display();
// Serial
Serial.print("Soil: "); Serial.print(soilPercent);
Serial.print(" Leaf: "); Serial.print(leafPercent);
Serial.print(" Light: "); Serial.print(lightPercent);
Serial.print(" Status: ");
Serial.println(highRisk ? "INFECTION" : "NORMAL");
}
void setup() {
Serial.begin(9600);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
// OLED Init
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED not found");
while (true);
}
display.clearDisplay();
display.display();
// Blynk Init
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
// Run every 2 seconds
timer.setInterval(2000L, sendSensorData);
}
void loop() {
Blynk.run();
timer.run();
}