// Define Blynk template ID and name at the very top
#define BLYNK_TEMPLATE_ID "TMPL33QjY0PDr"
#define BLYNK_TEMPLATE_NAME "soil nutriention"
#define BLYNK_AUTH_TOKEN "e1W_ZLJcWtJMl2_8WGRCMkWPSJRRmkG0"
// Include libraries
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define LED_SODIUM_PIN 13 // Pin for the sodium LED
#define LED_MOISTURE_PIN 12 // Pin for the moisture LED
#define BUZZER_PIN 18 // Pin for the buzzer
#define OLED_RESET -1 // Reset pin # (or -1 if sharing ESP32 reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Blynk authentication token
char auth[] = BLYNK_AUTH_TOKEN;
// Wi-Fi credentials
char ssid[] = "wokwi-GUEST";
char pass[] = "";
// Threshold values
const int sodiumThreshold = 20;
const int moistureThreshold = 20;
void setup() {
// Initialize Serial Monitor
Serial.begin(115200);
// Initialize pins as output
pinMode(LED_SODIUM_PIN, OUTPUT);
pinMode(LED_MOISTURE_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Initialize I2C for ESP32
Wire.begin(21, 22); // SDA, SCL
// Initialize the OLED display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.display(); // Clear display buffer
display.setTextColor(SSD1306_WHITE); // Set text color to white
// Connect to Wi-Fi and Blynk
Blynk.begin(auth, ssid, pass);
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Reconnecting to WiFi...");
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi");
}
if (!Blynk.connected()) {
Serial.println("Reconnecting to Blynk...");
Blynk.begin(auth, ssid, pass);
}
// Read sensors
int sodiumPercent = readSensor(34);
int moisturePercent = readSensor(32);
// Update OLED display
updateDisplay(sodiumPercent, moisturePercent);
// Send data to Blynk
sendDataToBlynk(sodiumPercent, moisturePercent);
// Check alerts and update LEDs/buzzer
checkAlerts(sodiumPercent, moisturePercent);
// Run Blynk
Blynk.run();
// Non-blocking delay
delay(1000);
}
int readSensor(int pin) {
int value = analogRead(pin);
return map(value, 0, 4095, 0, 100); // Map to percentage
}
void updateDisplay(int sodium, int moisture) {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println("Soil Sodium:");
display.print(sodium);
display.println("%");
display.setCursor(0, 20);
display.println("Soil Moisture:");
display.print(moisture);
display.println("%");
display.display();
}
void sendDataToBlynk(int sodium, int moisture) {
Blynk.virtualWrite(V1, sodium);
Blynk.virtualWrite(V2, moisture);
}
void checkAlerts(int sodium, int moisture) {
if (sodium < sodiumThreshold) {
digitalWrite(LED_SODIUM_PIN, HIGH); // Turn on sodium LED
} else {
digitalWrite(LED_SODIUM_PIN, LOW); // Turn off sodium LED
}
if (moisture < moistureThreshold) {
digitalWrite(LED_MOISTURE_PIN, HIGH); // Turn on moisture LED
digitalWrite(BUZZER_PIN, HIGH);
tone(BUZZER_PIN, 1000); // Activate buzzer with a frequency of 1000 Hz
} else {
digitalWrite(LED_MOISTURE_PIN, LOW); // Turn off moisture LED
digitalWrite(BUZZER_PIN, LOW);
noTone(BUZZER_PIN); // Turn off buzzer
}
}