#define BLYNK_TEMPLATE_ID "TMPL3tWGV5GYY"
#define BLYNK_TEMPLATE_NAME "smart soil nutrition monitoring system"
#define BLYNK_AUTH_TOKEN "k5RRut_kvPC1IWDAnQQAqGhVLGFFy_Tp"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include <ESP32Servo.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <Blynk.h>
// WiFi credentials
char ssid[] = "Wokwi-Guest"; // Replace with your WiFi SSID
char pass[] = ""; // Replace with your WiFi Password
#define DHTPIN 21 // DHT22 data pin
#define DHTTYPE DHT22
#define BUZZER_PIN 18
#define MOTOR_PIN 19
#define WIND_SENSOR_PIN 34
#define SERVO_PIN 13
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD address and dimensions
Servo servoMotor;
void setup() {
Serial.begin(115200);
dht.begin();
lcd.init();
lcd.backlight();
pinMode(BUZZER_PIN, OUTPUT);
pinMode(MOTOR_PIN, OUTPUT);
pinMode(WIND_SENSOR_PIN, INPUT);
servoMotor.attach(SERVO_PIN);
lcd.setCursor(0, 0);
lcd.print("Soil Health");
// Connect to WiFi
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, pass);
unsigned long startAttemptTime = millis();
while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < 10000) { // Timeout after 10 seconds
delay(500);
Serial.print(".");
}
if (WiFi.status() != WL_CONNECTED) {
Serial.println("\nFailed to connect to WiFi");
return;
}
Serial.println("\nConnected to WiFi");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
// Connect to Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
// Wait for Blynk connection
while (!Blynk.connected()) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to Blynk");
// Test message to ensure setup runs
Serial.println("Setup complete");
}
void loop() {
// Run Blynk
Blynk.run();
// Read temperature and humidity from DHT22
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Check if any reads failed
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Read wind speed from potentiometer
int windSpeedRaw = analogRead(WIND_SENSOR_PIN);
float windSpeed = map(windSpeedRaw, 0, 4095, 0, 100); // Example conversion, adjust as needed
// Display data on LCD
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(humidity);
lcd.print("%");
lcd.setCursor(8, 1);
lcd.print("Wind: ");
lcd.print(windSpeed);
lcd.print("m/s");
// Print data to Serial Monitor
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print("C, Humidity: ");
Serial.print(humidity);
Serial.print("%, Wind Speed: ");
Serial.print(windSpeed);
Serial.println(" m/s");
// Control buzzer and motor based on sensor data
if (temperature > 30.0) { // Example condition for high temperature
digitalWrite(BUZZER_PIN, HIGH);
} else {
digitalWrite(BUZZER_PIN, LOW);
}
if (humidity < 20.0) { // Example condition for low humidity
digitalWrite(MOTOR_PIN, HIGH);
} else {
digitalWrite(MOTOR_PIN, LOW);
}
// Set servo motor position based on wind speed
int servoAngle = map(windSpeedRaw, 0, 4095, 0, 180);
servoMotor.write(servoAngle);
delay(2000); // Delay between readings
}