#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL59FVvX8pf"
#define BLYNK_TEMPLATE_NAME "Quickstart Template"
#define BLYNK_AUTH_TOKEN "ebhj8vSwWc1TfRCWpZQDt2mYKcUz6dTV"
//Declare required libraries
#include <LiquidCrystal.h>
#include <DHT_U.h>
#include <ESP32Servo.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#define LEDred 23
#define LEDgreen 22
#define DHTPIN 12
#define SERVOPIN 14
#define SWITCH_LEFT 18
#define SWITCH_RIGHT 19
// DHT parameters
#define DHTTYPE DHT22
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
// Servo motor
Servo servo;
// LCD setup
LiquidCrystal lcd(2, 0, 4, 16, 17, 5);
float temp, hum;
bool preferenceSwitchState = true; // Initial state
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
void setup() {
pinMode(LEDred, OUTPUT);
pinMode(LEDgreen, OUTPUT);
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
dht.begin();
// Get temperature sensor details.
sensor_t sensor;
dht.temperature().getSensor(&sensor);
dht.humidity().getSensor(&sensor);
// Setup servo
servo.attach(SERVOPIN, 500, 2400);
servo.write(0);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
String message1 = " Automatic";
String message2 = "Watering System";
for (int i = 0; i < message1.length(); i++) {
lcd.print(message1.charAt(i));
delay(100);
}
lcd.setCursor(0, 1);
for (int i = 0; i < message2.length(); i++) {
lcd.print(message2.charAt(i));
delay(100);
}
delay(2500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Humidity=");
lcd.setCursor(0, 1);
lcd.print("Temp=");
// Setup Blynk virtual pins
Blynk.virtualWrite(V0, 0); // Initialize gauge for Water Pump Manual
Blynk.virtualWrite(V2, 0); // Initialize gauge for Water Level
Blynk.virtualWrite(V1, 1); // Initialize LED widget
Blynk.virtualWrite(V3, "Temperature: 0°C | Humidity: 0%"); // Initialize combined display
Blynk.virtualWrite(V4, 1); // Initialize Switch for plant watering preference
// // Read initial switch state
// switchState = digitalRead(SWITCH_LEFT) == LOW; // Assuming LOW state when pressed
// updateBlynkSwitchState(switchState);
timer.setInterval(1000L, readAndDisplaySensorData); // Call readAndDisplaySensorData every second
}
void readAndDisplaySensorData() {
if (preferenceSwitchState) {
Serial.println(F("Auto Mode ON"));
// Blynk.virtualWrite(V1, LOW);
// Read temperature and humidity
sensors_event_t event;
dht.temperature().getEvent(&event);
if (isnan(event.temperature)) {
Serial.println(F("Error reading temperature!"));
} else {
temp = event.temperature;
temp = constrain(temp, -40, 80);
lcd.setCursor(6, 1);
lcd.print(temp);
lcd.print("C");
}
dht.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
Serial.println(F("Error reading humidity!"));
} else {
hum = event.relative_humidity;
hum = constrain(hum, 0, 100);
lcd.setCursor(10, 0);
lcd.print(hum);
lcd.print("%");
}
String combinedData = String("Tempreture: ") + temp + "°C | Humidity: " + hum + "%";
Blynk.virtualWrite(V3, combinedData); // Update combined data display
Serial.println(String("Tempreture: ") + temp + "°C | Humidity: " + hum + "%");
if (hum < 30.0) {
if (temp > 30.0) {
servo.write(90);
digitalWrite(LEDgreen, HIGH);
digitalWrite(LEDred, LOW);
Blynk.virtualWrite(V2, 100);
Blynk.virtualWrite(V1, HIGH);
Serial.println(F("Water Pump fully on"));
} else {
servo.write(60);
digitalWrite(LEDgreen, HIGH);
digitalWrite(LEDred, LOW);
Blynk.virtualWrite(V2, 50);
Blynk.virtualWrite(V1, HIGH);
Serial.println(F("Water Pump partially on"));
}
} else {
servo.write(0);
digitalWrite(LEDgreen, LOW);
digitalWrite(LEDred, HIGH);
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V1, LOW);
Serial.println(F("Water Pump off"));
}
}
}
void loop() {
Blynk.run();
timer.run();
}
BLYNK_WRITE(V0) { // Plant watering Manual switch
int manualSwitchValue = param.asInt();
if(preferenceSwitchState == false){
if (manualSwitchValue == 1) {
servo.write(90);
digitalWrite(LEDgreen, HIGH);
digitalWrite(LEDred, LOW);
Blynk.virtualWrite(V2, 100);
Blynk.virtualWrite(V1, HIGH);
Serial.println(F("Water Pump ON Manually"));
} else if (manualSwitchValue == 0) {
servo.write(0);
digitalWrite(LEDgreen, LOW);
digitalWrite(LEDred, HIGH);
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V1, LOW);
Serial.println(F("Water Pump OFF Manually"));
}
}
}
BLYNK_WRITE(V4) { // Plant watering Preference switch
int preferenceSwitchValue = param.asInt();
if (preferenceSwitchValue == 1) {
preferenceSwitchState = true;
Blynk.virtualWrite(V0, 0);
Serial.println(F("Auto Mode ON"));
} else if (preferenceSwitchValue == 0) {
Serial.println(F("Auto Mode OFF"));
preferenceSwitchState = false;
servo.write(0);
digitalWrite(LEDgreen, LOW);
digitalWrite(LEDred, HIGH);
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V1, LOW);
Serial.println(F("Water Pump off"));
}
}