Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

ESP32-Based Water Level Monitoring System with Wi-Fi Connectivity and Multi-Color LED Indicators

View and Edit Project In Cirkit DesignerImage of ESP32-Based Water Level Monitoring System with Wi-Fi Connectivity and Multi-Color LED Indicators

Circuit Documentation

Summary

The circuit is designed to monitor water levels using an ultrasonic sensor and display the status on an LCD screen. It also features a set of LEDs that indicate different water levels and connectivity status to a Blynk server over WiFi. The core of the circuit is an ESP32 Expansion Board, which controls the sensor, LEDs, and communicates with the Blynk server for remote monitoring.

Component List

ESP32 - Expansion Board

LEDs (Red, Blue, Yellow, White, Green)

Resistors (220 Ohms)

HC-SR04 Ultrasonic Sensor

I2C LCD 16x2 Screen

18650 Li-Ion Battery

2.1mm Barrel Jack with Terminal Block

Wiring Details

ESP32 - Expansion Board

LEDs (Red, Blue, Yellow, White, Green)

Resistors (220 Ohms)

HC-SR04 Ultrasonic Sensor

I2C LCD 16x2 Screen

18650 Li-Ion Battery

2.1mm Barrel Jack with Terminal Block

Documented Code

#define BLYNK_TEMPLATE_ID "TMPL6YXH7T8rC"
#define BLYNK_TEMPLATE_NAME "Water Level Monitoring System"
#define BLYNK_AUTH_TOKEN "T3o8N554EqsZLo7xWyT-Edl9GYJLK0bG"

// Include the library files
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

#define LED_WIFI 2
#define LED_WHITE 4
#define LED_RED 5
#define LED_YELLOW 18
#define LED_GREEN 19
#define trig 12
#define echo 13

// Enter your tank max value (CM)
int MaxLevel = 20;

// Initialize the LCD display
LiquidCrystal_I2C lcd(0x27, 16, 2);

BlynkTimer timer;

// Enter your Auth token
char auth[] = BLYNK_AUTH_TOKEN;

// Enter your WIFI SSID and password
char ssid[] = "Eric23";
char pass[] = "eric2304";

void setup() {
  // Debug console
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass, "blynk.cloud", 80);
  lcd.init();
  lcd.backlight();
  pinMode(LED_WIFI, OUTPUT);
  pinMode(LED_WHITE, OUTPUT);
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_YELLOW, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
  
  lcd.setCursor(0, 0);
  lcd.print("System");
  lcd.setCursor(4, 1);
  lcd.print("Loading..");
  delay(4000);
  lcd.clear();

  // Indicate WiFi connection status
  if (Blynk.connected()) {
    digitalWrite(LED_WIFI, HIGH);
  } else {
    digitalWrite(LED_WIFI, LOW);
  }
}

// Get the ultrasonic sensor values
void ultrasonic() {
  digitalWrite(trig, LOW);
  delayMicroseconds(4);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  long t = pulseIn(echo, HIGH);
  int distance = t / 29 / 2;

  Serial.println(distance);

  int blynkDistance = (distance - MaxLevel) * -1;
  if (distance <= MaxLevel) {
    Blynk.virtualWrite(V0, blynkDistance);
  } else {
    Blynk.virtualWrite(V0, 0);
  }
  lcd.setCursor(0, 0);
  lcd.print("WLevel:");
  lcd.setCursor(8, 0);
  lcd.print(distance);
  lcd.print(" cm");

  // Update LED status based on water level
  if (distance <= 5) {
    lcd.setCursor(0, 1);
    lcd.print("0-5cm  ");
    digitalWrite(LED_WHITE, HIGH);
    digitalWrite(LED_RED, LOW);
    digitalWrite(LED_YELLOW, LOW);
    digitalWrite(LED_GREEN, LOW);
  } else if (distance <= 10) {
    lcd.setCursor(0, 1);
    lcd.print("6-10cm ");
    digitalWrite(LED_WHITE, LOW);
    digitalWrite(LED_RED, HIGH);
    digitalWrite(LED_YELLOW, LOW);
    digitalWrite(LED_GREEN, LOW);
  } else if (distance <= 15) {
    lcd.setCursor(0, 1);
    lcd.print("11-15cm");
    digitalWrite(LED_WHITE, LOW);
    digitalWrite(LED_RED, LOW);
    digitalWrite(LED_YELLOW, HIGH);
    digitalWrite(LED_GREEN, LOW);
  } else if (distance <= 20) {
    lcd.setCursor(0, 1);
    lcd.print("16-20cm");
    digitalWrite(LED_WHITE, LOW);
    digitalWrite(LED_RED, LOW);
    digitalWrite(LED_YELLOW, LOW);
    digitalWrite(LED_GREEN, HIGH);
  } else {
    lcd.setCursor(0, 1);
    lcd.print("Overflow");
    digitalWrite(LED_WHITE, LOW);
    digitalWrite(LED_RED, LOW);
    digitalWrite(LED_YELLOW, LOW);
    digitalWrite(LED_GREEN, LOW);
  }
}

void loop() {
  ultrasonic();
  Blynk.run(); // Run the Blynk library

  // Update WiFi connection status LED
  if (Blynk.connected()) {
    digitalWrite(LED_WIFI, HIGH);
  } else {
    digitalWrite(LED_WIFI, LOW);
  }
}

This code is designed to run on the ESP32 Expansion Board. It initializes the WiFi connection, LCD screen, and sets up the pins for the LEDs and ultrasonic sensor. The ultrasonic function measures the water level and updates the LCD and LEDs accordingly. The Blynk library is used to send the water level data to a remote server for monitoring.