/* Plant Monitoring System with Blynk and I2C LCD */
// Blynk Credentials to connect the ESP32 with the Blynk IoT platform
#define BLYNK_TEMPLATE_ID "TMPL5ngf-Jqru"
#define BLYNK_TEMPLATE_NAME "IOT Plant Dashboard"
#define BLYNK_AUTH_TOKEN "sPX223AldEcCAbMfviPHPHUdXGGGyEr-"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHTesp.h"
#include <ESP32Servo.h>
// Authentication Token
char auth[] = BLYNK_AUTH_TOKEN;
// Wi-Fi credentials
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// DHT sensor
const int DHT_PIN = 23;
DHTesp dhtSensor;
// Variable Declarations for INPUT pins
int soilSensor = 39;
int ldrSensor = 36;
// Variable Declarations for OUTPUT pins
int waterPump = 19;
int servoPin = 18;
Servo servo;
int pos = 0;
// Global Variables
int ldrValue, ldrRaw, soilValue, soilRaw;
uint32_t timer1;
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
LiquidCrystal_I2C lcd(0x27, 20, 4); // Address 0x27, 20 column and 4 rows
BLYNK_CONNECTED() {
for (int i = 0; i < 9; i++) {
Blynk.syncVirtual(i);
}
}
void setup() {
// Debug console
Serial.begin(115200);
// Initialize DHT sensor
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
// Configure pins as INPUT
pinMode(soilSensor, INPUT);
pinMode(ldrSensor, INPUT);
// Configure pins as OUTPUT
pinMode(waterPump, OUTPUT);
// Connect to Blynk
Blynk.begin(auth, ssid, pass);
// Initialize the LCD
lcd.init();
lcd.backlight();
// Servo Config
servo.attach(servoPin, 500, 2400);
}
void loop() {
Blynk.run();
// light Measurement
ldrRaw = analogRead(ldrSensor);
ldrValue = map(ldrRaw, 0, 4095, 100, 0); // convert from 0 - 4095 to 0 to 100
// Soil Moisture Measurement
soilRaw = analogRead(soilSensor);
soilValue = map(soilRaw, 0, 4095, 100, 0);
if (millis() - timer1 > 3000) {
// Temperature and Humidity
TempAndHumidity data = dhtSensor.getTempAndHumidity();
// Send data to Blynk
Blynk.virtualWrite(V0, data.temperature);
Blynk.virtualWrite(V1, data.humidity);
Blynk.virtualWrite(V2, soilValue);
Blynk.virtualWrite(V3, ldrValue);
if(soilValue < 15){
Serial.println("DRY SOIL");
Blynk.logEvent("drysoil","Dry Soil , Water the Plant");
digitalWrite(waterPump, HIGH);
servo.write(0);
}
else{
digitalWrite(waterPump, LOW);
servo.write(90);
}
if(ldrValue < 25){
Serial.println("LOW LIGHT");
Blynk.logEvent("lowlight","Low light condition");
}
// Update LCD Display
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(data.temperature);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Humid: ");
lcd.print(data.humidity);
lcd.print("%");
lcd.setCursor(0, 2);
lcd.print("Light: ");
lcd.print(ldrValue);
lcd.print("%");
lcd.setCursor(0, 3);
lcd.print("Soil: ");
lcd.print(soilValue);
lcd.print("%");
timer1 = millis();
}
}