#define BLYNK_TEMPLATE_ID "TMPL6UJhLK2GM"
#define BLYNK_TEMPLATE_NAME "PSM"
#define BLYNK_AUTH_TOKEN "8c57cbicU68UD6OaXVYl-d-jTLvnWZWz"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = BLYNK_AUTH_TOKEN ;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
#include <Wire.h> // Include the Wire library for I2C communication
#include <LiquidCrystal_I2C.h> //LCD library
#include<DHTesp.h> //DHT library
#include <Adafruit_BMP085.h> // BMP180 sensor library
#include <Ultrasonic.h> // Ultrasonic library
#define ldrPin 32 // Analog pin of the LDR module
#define analograinSensorPin 35 //Rain sensor analog pin
#define TRIG_PIN 26 // Trig pin of ultrasonic sensor
#define ECHO_PIN 25 // Echo pin of ultrasonic sensor
#define MOISTURE_PIN 34 // Soil moisture sensor analog pin
LiquidCrystal_I2C lcd(0x27,16,2); // I2C address 0x27, 16 column and 2 rows
DHTesp dht;
TempAndHumidity data;//declare dht
Adafruit_BMP085 bmp; // Create BMP180 sensor object
int REDLED=4; // Red LED pin
int YELLOWLED=2; // Yellow LED pin
int GREENLED=15; // Green LED pin
int RELAYPUMPSOURCE=18; //Relay pin of relay module for water pump water source
int RELAYPUMPTANK=19; //Relay pin of relay module for water pump water tank
const float gama = 0.7;
const float rl10 = 50;
byte degree_symbol[8] = { //create byte for degree symbol
0b00111,
0b00101,
0b00111,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
void setup()
{
pinMode(REDLED, OUTPUT); //pin output Red LED
pinMode(YELLOWLED, OUTPUT); //pin output Yellow LED
pinMode(GREENLED, OUTPUT); //pin output Green LED
pinMode(ldrPin, INPUT); // pin input LDR module
pinMode(analograinSensorPin, INPUT); // pin input analog pin
pinMode(TRIG_PIN, OUTPUT); //Pin output ultrasonic trig pin
pinMode(ECHO_PIN, INPUT); //Pin input ultrasonic echo pin
pinMode(MOISTURE_PIN, INPUT); //Pin input soil moisture sensor
pinMode(RELAYPUMPSOURCE, OUTPUT); //pin output relay for water pump water source
pinMode(RELAYPUMPTANK, OUTPUT); //pin output relay for water pump water tank
dht.setup(27,DHTesp::DHT22);
Wire.begin(21, 22);
lcd.init(); // Initialize the lcd
lcd.backlight(); // Make sure backlight is on
lcd.createChar(0, degree_symbol); //Create degree symbol
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
digitalWrite(RELAYPUMPSOURCE,LOW);
digitalWrite(RELAYPUMPTANK,LOW);
// Print a message on both lines of the LCD.
lcd.setCursor(0,0); //Set cursor to character 0 on line 0
lcd.print(" Welcome to");
lcd.setCursor(0,1); //Move cursor to character 0 on line 1
lcd.print("Weather Forecast!");
delay(5000); // Display the above for five seconds
lcd.clear(); // Clear the LCD scree
}
// DHT22 sensor
void DHT22sensor() {
data = dht.getTempAndHumidity();
Serial.println("Humidity : " + String(data.humidity) + " %");
Blynk.virtualWrite(V1, data.humidity);
Serial.println("Temperature : " + String(data.temperature) + " °C" );
Blynk.virtualWrite(V0, data.temperature);
lcd.setCursor(0,0);
lcd.print(" Temp= "); // Print Temperature
lcd.print(data.temperature); // Print the value of temperature
lcd.write(0); // Print the degree symbol
lcd.print("C"); // Print C
lcd.setCursor(0,1);
lcd.print("Humidity= "); //Print humidity
lcd.print(data.humidity); //Print the value of humidity
lcd.print("%"); //Print %
delay(2000);
lcd.clear();
if(data.temperature>=33){ //Check if temperature is equal to or more than 33 Celsius
digitalWrite(REDLED, HIGH); // Red LED turn on
lcd.setCursor(0,0);
lcd.print("HIGH Temperature"); // Print Temperature
Blynk.virtualWrite(V6, HIGH);
}
else{
digitalWrite(REDLED, LOW); // Red LED turn off
lcd.setCursor(0,0);
lcd.print("LOW Temperature"); // Print Temperature
Blynk.virtualWrite(V6, LOW);
}
if(data.humidity>=60){ //Check if humidity is equal to or more than 60%
lcd.setCursor(1,1);
lcd.print("HIGH Humidity"); // Print Temperature
}
else{
lcd.setCursor(2,1);
lcd.print("LOW Humidity"); // Print Temperature
}
delay(2000);
lcd.clear();
}
// LDR Sensor
void LDRsensor() {
int ldrValue = analogRead(ldrPin); // Analog pin of the LDR module
ldrValue = map(ldrValue, 4095, 0, 1024, 0); // Convert LDR sensor reading from Arduino ADC value to ESP32 ADC value
float ldrVoltage = ldrValue / 1024.0 * 5;
float ldrResistance = 2000 * ldrVoltage / (1 - ldrVoltage / 5);
float lux = pow(rl10 * 1e3 * pow(10, gama) / ldrResistance, (1 / gama));
Serial.println("Brightness : " + String(lux, 3) + " Lux");
String luxmsg = lux < 807 ? "Low" : (lux > 808 && lux < 1614 ? "Medium" : "High");
lcd.setCursor(2, 0);
lcd.print("Analog value"); // Print Analog value
lcd.setCursor(0, 1);
lcd.print("= ");
lcd.print(lux); //Print the LDR value
lcd.print(" lux");
Blynk.virtualWrite(V11, lux);
delay(2000);
lcd.clear();
// Yellow LED On/Off to show brightness condition
if (lux < 807) {
digitalWrite(YELLOWLED, HIGH);
Serial.println("LOW Brightness");
lcd.setCursor(0, 0);
lcd.print(" LOW Brightness");
delay(2000);
lcd.clear();
Blynk.virtualWrite(V7, HIGH);
}
else if (lux > 808 && lux < 1614) {
digitalWrite(YELLOWLED, LOW);
Serial.println("MEDIUM Brightness");
lcd.setCursor(5, 0);
lcd.print("MEDIUM");
lcd.setCursor(3, 1);
lcd.print("Brightness");
delay(2000);
lcd.clear();
Blynk.virtualWrite(V7, LOW);
}
else {
digitalWrite(YELLOWLED, LOW);
Serial.println("HIGH Brightness");
lcd.setCursor(0, 0);
lcd.print("HIGH Brightness");
delay(2000);
lcd.clear();
Blynk.virtualWrite(V7, LOW);
}
}
// Rain Sensor
void rainSensor() {
int analog_value= analogRead(analograinSensorPin); // Read the analog input from pin 35 (values between 0 and 1023)
analog_value = map(analog_value, 0, 4095, 0, 100); // Scale the analog value from 0-4095 to a normalized range of 0-100
analog_value = (analog_value - 100) * -1; // Invert the scaled value to represent higher readings as lower values
Serial.println("Rain level : " + String(analog_value) + " %");
Blynk.virtualWrite(V2, analog_value);
lcd.setCursor(0,0);
lcd.print("Rain Level= "); // Print rain level
lcd.print(analog_value); // Print the percentage value of rain
lcd.print("%");
if (analog_value >= 60){ //Check if the digital value is LOW
Serial.println("It's raining!");
lcd.setCursor(0, 1);
lcd.print(" It's raining! "); //Digital value is LOW, print It's raining!
digitalWrite(GREENLED, HIGH); // Green LED turn on
Blynk.virtualWrite(V8, HIGH);
}
else{
Serial.println("No rain!");
lcd.setCursor(0, 1);
lcd.print(" No rain!"); //Digital value is HIGH, print No rain!
digitalWrite(GREENLED, LOW); // Green LED turn off
Blynk.virtualWrite(V8, LOW);
}
delay(2000);
lcd.clear();
}
//Ultrasonic sensor with water pump motor
void Ultrasonicsensor() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(10);
// Send a 10us pulse to trigger the sensor
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsigned long duration = pulseIn(ECHO_PIN, HIGH); // Read the echo duration in microseconds
// Calculate the distance in centimeters using the speed of sound (approximately 343 meters/second)
// Distance = (duration * speed of sound) / 2
float distanceCM = (duration * 0.034 / 2);
Serial.println("Water distance : " + String(distanceCM) + " cm");
Blynk.virtualWrite(V4, distanceCM);
lcd.setCursor(0, 0);
lcd.print(" Water distance"); //Distance of water
lcd.setCursor(0, 1);
lcd.print(" = "); //
lcd.print(distanceCM);
lcd.print(" cm"); //Print centimeter
delay(2000);
lcd.clear();
if (distanceCM < 20) { // Check if the water level is below the minimum threshold
Serial.println("Water tank is LOW");
lcd.setCursor(0, 0);
lcd.print(" Water tank"); //Print Water tank
lcd.setCursor(5, 1);
lcd.print("is LOW"); //Print is LOW
}
else { // Check if the water level is above the maximum threshold
Serial.println("Water tank is FULL");
lcd.setCursor(0, 0);
lcd.print(" Water tank"); //Print Water tank
lcd.setCursor(5, 1);
lcd.print("is FULL"); //Print is FULL
}
delay(2000);
lcd.clear();
}
//Soil moisture sensor with water pump motor
void Soilmoisturesensor() {
int soil_moisture_value= analogRead(MOISTURE_PIN);
int moisture_value = ( 100 - ( (soil_moisture_value/4095.00) * 100 ) );
Blynk.virtualWrite(V5, moisture_value);
Serial.println("Soil moisture value : " + String(moisture_value) + " %");
lcd.setCursor(0, 0);
lcd.print(" Soil moisture");
lcd.setCursor(1, 1);
lcd.print("value= ");
lcd.print(moisture_value);
lcd.print(" %");
delay(2000);
lcd.clear();
if (moisture_value<=30) {
Serial.println("Soil moisture is LOW");
lcd.setCursor(0, 0);
lcd.print(" Soil moisture");
lcd.setCursor(5, 1);
lcd.print("is LOW");
}
else if (moisture_value>=31 && moisture_value<=60) {
Serial.println("Soil moisture is MEDIUM");
lcd.setCursor(0, 0);
lcd.print(" Soil moisture");
lcd.setCursor(3, 1);
lcd.print("is MEDIUM");
}
else {
Serial.println("Soil moisture is HIGH");
lcd.setCursor(0, 0);
lcd.print(" Soil moisture");
lcd.setCursor(4, 1);
lcd.print("is HIGH");
}
delay(2000);
lcd.clear();
}
//Control water pump source
BLYNK_WRITE(V9) {
lcd.clear();
bool rELAYPUMPSOURCE = param.asInt();
if (rELAYPUMPSOURCE == 1) {
digitalWrite(RELAYPUMPSOURCE, HIGH);
Serial.println("Water pump of source is ON");
lcd.setCursor(0, 0);
lcd.print(" Water pump of ");
lcd.setCursor(0, 1);
lcd.print(" source is ON");
}
else {
digitalWrite(RELAYPUMPSOURCE, LOW);
Serial.println("Water pump of source is OFF");
lcd.setCursor(0, 0);
lcd.print(" Water pump of ");
lcd.setCursor(0, 1);
lcd.print(" source is OFF");
}
delay(2000);
lcd.clear();
}
//Control water pump source
BLYNK_WRITE(V10) {
lcd.clear();
bool rELAYPUMPTANK = param.asInt();
if (rELAYPUMPTANK == 1) {
digitalWrite(RELAYPUMPTANK, HIGH);
Serial.println("Water pump of tank is ON");
lcd.setCursor(0, 0);
lcd.print(" Water pump of ");
lcd.setCursor(2, 1);
lcd.print("tank is ON");
}
else {
digitalWrite(RELAYPUMPTANK, LOW);
Serial.println("Water pump of tank is OFF");
lcd.setCursor(0, 0);
lcd.print(" Water pump of ");
lcd.setCursor(2, 1);
lcd.print("tank is OFF");
}
delay(2000);
lcd.clear();
}
void loop() {
Blynk.run();//Run the Blynk library
DHT22sensor();
LDRsensor();
rainSensor();
Ultrasonicsensor();
Soilmoisturesensor();
}