#define BLYNK_TEMPLATE_ID "TMPL6L6K22ysh"
#define BLYNK_TEMPLATE_NAME "AFS"
#define BLYNK_AUTH_TOKEN "lq4HILTkAzI90O5iE5XGe8ubvyyxmZRF"
#define BLYNK_PRINT Serial
#define MAX_DISTANCE 50 // Define the maximum sensor range in cm
#define FULL_DISTANCE 3
#define Buzzer 27
#define LED_LOW 13
#define LED_AVE 14
#define LED_HIGH 5
#define LED_FULL 4
#define LED_EMPTY 12
#include <WiFi.h>
#include <WiFiClient.h>
//#include <BlynkSimpleEsp32.h>
#include <BlynkSimpleEsp32_SSL.h>
#include <Ultrasonic.h>
#include <LiquidCrystal_I2C.h>
int lcdColumns = 16;
int lcdRows = 2;
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
Ultrasonic ultrasonic(18, 19); //Trig 12 Echo 14
int distance;
int RELAY_PIN = 32;
//DHT22
#include <DHT.h>
#define DHT_SENSOR_PIN 15 // ESP32 pin GPIO21 connected to DHT22 sensor
#define DHT_SENSOR_TYPE DHT22
DHT dht_sensor(DHT_SENSOR_PIN, DHT_SENSOR_TYPE);
//DHT22 END
//HX711
#include <HX711_ADC.h>
#if defined(ESP8266)|| defined(ESP32) || defined(AVR)
#include <EEPROM.h>
#endif
const int HX711_dout = 2;
const int HX711_sck = 16;
HX711_ADC LoadCell(HX711_dout, HX711_sck);
const int calVal_eepromAdress = 0;
unsigned long t = 0;
//HX711 END
//LDR
const int LDR = 34;
const int LED = 17;
int input_val = 0;
//LDR END
BlynkTimer timer;
void myTimerEvent()
{
}
void setup()
{
// Debug console
Serial.begin(115200);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
timer.setInterval(1000L, myTimerEvent);
pinMode(Buzzer, OUTPUT);
pinMode(LED_EMPTY, OUTPUT);
pinMode(LED_LOW, OUTPUT);
pinMode(LED_AVE, OUTPUT);
pinMode(LED_HIGH, OUTPUT);
pinMode(LED_FULL, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
lcd.init();
lcd.backlight();
//HX711
Serial.begin(57600); delay(10);
Serial.println();
Serial.println("Starting...");
LoadCell.begin();
float calibrationValue;
calibrationValue = 4.20;
#if defined(ESP8266)|| defined(ESP32)
#endif
unsigned long stabilizingtime = 2000;
boolean _tare = true;
LoadCell.start(stabilizingtime, _tare);
if (LoadCell.getTareTimeoutFlag()) {
Serial.println("Timeout, check MCU>HX711 wiring and pin designations");
while (1);
}
else {
LoadCell.setCalFactor(calibrationValue);
Serial.println("Startup is complete");
}
//HX711 END
//LDR
Serial.begin(9600);
pinMode(LED, OUTPUT);
//LDR END
//DHT22
Serial.begin(115200);
Serial.println("Hello, ESP32!");
dht_sensor.begin();
//DHT22 END
}
void loop()
{
//Blynk.run();
distance = ultrasonic.read();
// Calculate the water level percentage
int waterLevelPercentage = map(distance, FULL_DISTANCE, MAX_DISTANCE, 100, 0);
waterLevelPercentage = constrain(waterLevelPercentage, 0, 100); // Ensure it stays within 0-100%
Serial.print("Distance in CM: ");
Serial.println(distance);
Blynk.virtualWrite(V2, 52 - distance);
Serial.print(waterLevelPercentage);
Serial.println("%");
//Blynk.virtualWrite(V0, waterLevelPercentage);
lcd.setCursor(0, 0);
lcd.print("Wat Lvl: ");
lcd.print(waterLevelPercentage);
lcd.print(" %");
if (waterLevelPercentage <= 30){
digitalWrite(Buzzer, HIGH);
Serial.println("Buzzer ON!");
}else {
digitalWrite(Buzzer, LOW);
}
if (waterLevelPercentage <= 50){
digitalWrite(RELAY_PIN, HIGH);
Serial.println("Water Pump ON!");
}else {
digitalWrite(RELAY_PIN, LOW);
}
if (waterLevelPercentage < 9){
Serial.println("Water is EMPTY");
//Blynk.logEvent("water_alert", " Water tank is EMPTY! ");
digitalWrite(LED_EMPTY, HIGH);
digitalWrite(LED_LOW, HIGH);
digitalWrite(LED_AVE, LOW);
digitalWrite(LED_HIGH, LOW);
digitalWrite(LED_FULL, LOW);
lcd.setCursor(0, 1);
lcd.print("Status: ");
lcd.print("EMPTY");
}else if (waterLevelPercentage >= 10 && waterLevelPercentage <= 40){
Serial.println("Water is LOW");
//Blynk.logEvent("water_alert", " Water tank is LOW! ");
digitalWrite(LED_EMPTY, LOW);
digitalWrite(LED_LOW, HIGH);
digitalWrite(LED_AVE, LOW);
digitalWrite(LED_HIGH, LOW);
digitalWrite(LED_FULL, LOW);
lcd.setCursor(0, 1);
lcd.print("Status: ");
lcd.print("LOW");
}else if (waterLevelPercentage >= 31 && waterLevelPercentage <= 75 ){
Serial.println("Water is Average");
digitalWrite(LED_EMPTY, LOW);
digitalWrite(LED_LOW, LOW);
digitalWrite(LED_AVE, HIGH);
digitalWrite(LED_HIGH, LOW);
digitalWrite(LED_FULL, LOW);
lcd.setCursor(0, 1);
lcd.print("Status: ");
lcd.print("Average");
}else if (waterLevelPercentage >= 76 && waterLevelPercentage <= 90 ){
Serial.println("Water is High");
digitalWrite(LED_EMPTY, LOW);
digitalWrite(LED_LOW, LOW);
digitalWrite(LED_AVE, LOW);
digitalWrite(LED_HIGH, HIGH);
digitalWrite(LED_FULL, LOW);
lcd.setCursor(0, 1);
lcd.print("Status: ");
lcd.print("High");
}else {
Serial.println("Water is FULL");
//Blynk.logEvent("water_alert", " Water tank is FULL! ");
digitalWrite(LED_EMPTY, LOW);
digitalWrite(LED_LOW, LOW);
digitalWrite(LED_AVE, LOW);
digitalWrite(LED_HIGH, HIGH);
digitalWrite(LED_FULL, HIGH);
lcd.setCursor(0, 1);
lcd.print("Status: ");
lcd.print("FULL");
}
delay(200);
//HX711
static boolean newDataReady = 0;
const int serialPrintInterval = 0;
if (LoadCell.update()) newDataReady = true;
if (newDataReady) {
if (millis() > t + serialPrintInterval) {
float i = LoadCell.getData();
Serial.print("Load_cell output val in Kg: ");
Serial.println(i/100);
newDataReady = 0;
t = millis();
Blynk.virtualWrite(V3, i/ 100);
}
}
delay(200);
//HX711 END
//LDR
input_val = analogRead(LDR);
delay(1000);
if(input_val>800)
{
digitalWrite(LED,HIGH);
Serial.print("\n");
Serial.print ("LDR value is :");
Serial.println(input_val);
Serial.print ("Lights : ON ");
Serial.print("\n");
Blynk.virtualWrite(V4, "ON");
delay(200);
}
else
{
digitalWrite(LED,LOW);
Serial.print("\n");
Serial.print ("LDR value is :");
Serial.println(input_val);
Serial.print ("Lights : OFF ");
Serial.print("\n");
Blynk.virtualWrite(V4, "OFF");
delay(200);
}
//LDR END
//DHT22
float tempC = dht_sensor.readTemperature();
float tempF = dht_sensor.readTemperature(true);
float humVal = dht_sensor.readHumidity();
Serial.print("Temperatur: ");
Serial.print(tempC);
Serial.print("°C | ");
Serial.print(tempF);
Serial.println(" F ");
Serial.print("Humidity: ");
Serial.print(humVal);
Serial.println(" %");
Serial.println("-----------------------------------");
//DHT22 END
lcd.clear();
//Teperature blynk
Blynk.virtualWrite(V0, tempC);
delay(1000);
Blynk.run();
timer.run(); // Initiates BlynkTimer
}