Skip to main content

IOT Based Water Level Indicator Project Using Esp32 And Ultrasonic Sensor

 



Water Level Indicator Project Using ESP32

 

Water Level Indicator with Alarm on Tank Full. IoT Wi-Fi smart water level indicator for tanks with mobile app control.


📟 OLED Display (0.96" I2C SSD1306)

 

OLED Pin        ESP32 Pin

VCC                   3.3V

GND                   GND

SDA                  GPIO 21

SCL                    GPIO 22

 


 

🔔 BUZZER

 

Buzzer Pin       ESP32 Pin

 

+          GPIO 26

-           GND

 

 

 

 

Each LED connects to an ESP32 GPIO pin via a current-limiting resistor.

 


 

📋 Parts Required:

 

3 × LEDs (Red, Yellow, Green)

 

3 × 220Ω resistors

 

Jumper wires

 

 


🧠 ESP32 to LED Connections:

 

LED     Color   Connect ESP32 Pin    Series Resistor            Connect To

 

LOW    Red     GPIO 15          220Ω   GND

MID     Yellow GPIO 4            220Ω   GND

HIGH   Green  GPIO 2            220Ω   GND

 

 


 

🔧 How to Connect Physically:

 

For each LED:

 

1. Long leg (anode +) → Connect to a GPIO pin via a 220Ω resistor

 

 

2. Short leg (cathode -) → Connect directly to GND

 

 

 

➡️ Full Code

 

// Full ESP32 Water Level Indicator Code

// Features: OLED Display, 3 LEDs, Buzzer, Web Server for Mobile View (ESP32-compatible tone handling)

 

#include <WiFi.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

#include <WebServer.h>

 

#define SCREEN_WIDTH 128

#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

 

// Probe sensor input pins

#define LOW_PIN 33

#define MID_PIN 32

#define HIGH_PIN 25

 

// LED output pins

#define LED_LOW 15

#define LED_MID 4

#define LED_HIGH 2

 

// Buzzer pin

#define BUZZER_PIN 26

#define BUZZER_CHANNEL 0

 

// WiFi credentials

const char* ssid = "YOUR_WIFI_SSID";

const char* password = "YOUR_WIFI_PASSWORD";

 

 

WebServer server(80);

String waterLevelStatus = "Unknown";

 

void setup() {

  Serial.begin(115200);

 

  // Pin modes

  pinMode(LOW_PIN, INPUT_PULLUP);

  pinMode(MID_PIN, INPUT_PULLUP);

  pinMode(HIGH_PIN, INPUT_PULLUP);

 

  pinMode(LED_LOW, OUTPUT);

  pinMode(LED_MID, OUTPUT);

  pinMode(LED_HIGH, OUTPUT);

 

  // Buzzer PWM setup

  //ledcSetup(BUZZER_CHANNEL, 1000, 8);

  //ledcAttachPin(BUZZER_PIN, BUZZER_CHANNEL);

  // Buzzer setup using tone()

  pinMode(BUZZER_PIN, OUTPUT);

 

  // OLED setup

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {

    Serial.println("SSD1306 allocation failed");

    while (true);

  }

  display.clearDisplay();

  display.setTextColor(WHITE);

 

  // Connect to Wi-Fi

  WiFi.begin(ssid, password);

  display.setCursor(0, 0);

  display.setTextSize(1);

  display.println("Connecting to WiFi...");

  display.display();

 

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }

 

  Serial.println("WiFi connected");

  display.clearDisplay();

  display.setCursor(0, 0);

  display.println("WiFi Connected!");

  display.println(WiFi.localIP().toString().c_str());

  display.display();

  delay(2000);

 

  // Web server endpoint

  server.on("/", []() {

    String html = "<html><head><meta http-equiv='refresh' content='3'></head><body><h2>Water Level: " + waterLevelStatus + "</h2></body></html>";

    server.send(200, "text/html", html);

  });

  server.begin();

}

 

void loop() {

  server.handleClient();

 

  bool low = digitalRead(LOW_PIN) == LOW;

  bool mid = digitalRead(MID_PIN) == LOW;

  bool high = digitalRead(HIGH_PIN) == LOW;

 

  // Determine level status

  display.clearDisplay();

  display.setCursor(0, 0);

  display.setTextSize(1);

  display.println("Water Level:");

 

  if (high) {

    waterLevelStatus = "FULL";

    display.setTextSize(2);

    display.setCursor(0, 20);

    display.println("FULL");

    digitalWrite(LED_HIGH, HIGH);

    digitalWrite(LED_MID, LOW);

    digitalWrite(LED_LOW, LOW);

    //ledcWriteTone(BUZZER_CHANNEL, 1500);

    //delay(200);

    //ledcWriteTone(BUZZER_CHANNEL, 0);

    tone(BUZZER_PIN, 1500);

delay(200);

noTone(BUZZER_PIN);

  } else if (mid) {

    waterLevelStatus = "MEDIUM";

    display.setTextSize(2);

    display.setCursor(0, 20);

    display.println("MEDIUM");

    digitalWrite(LED_HIGH, LOW);

    digitalWrite(LED_MID, HIGH);

    digitalWrite(LED_LOW, LOW);

    //ledcWriteTone(BUZZER_CHANNEL, 0);

    noTone(BUZZER_PIN);

  } else if (low) {

    waterLevelStatus = "LOW";

    display.setTextSize(2);

    display.setCursor(0, 20);

    display.println("LOW");

    digitalWrite(LED_HIGH, LOW);

    digitalWrite(LED_MID, LOW);

    digitalWrite(LED_LOW, HIGH);

    //ledcWriteTone(BUZZER_CHANNEL, 1000);

    //delay(500);

    //ledcWriteTone(BUZZER_CHANNEL, 0);

    tone(BUZZER_PIN, 1000);

delay(500);

noTone(BUZZER_PIN);

  } else {

    waterLevelStatus = "EMPTY";

    display.setTextSize(2);

    display.setCursor(0, 20);

    display.println("EMPTY");

    digitalWrite(LED_HIGH, LOW);

    digitalWrite(LED_MID, LOW);

    digitalWrite(LED_LOW, LOW);

    //ledcWriteTone(BUZZER_CHANNEL, 800);

    //delay(800);

    //ledcWriteTone(BUZZER_CHANNEL, 0);

    tone(BUZZER_PIN, 800);

delay(800);

noTone(BUZZER_PIN);

  }

 

  display.display();

  delay(1000);

}


Comments

Popular posts from this blog

Clap On Off Switch Circuit Using Arduino

  Arduino Clap LED program #define MicAO 8 int ledPin = 13; int clap = 0; long detection_range_start = 0; long detection_range = 0; boolean status_lights = false; void setup() {   pinMode(MicAO, INPUT);   pinMode(ledPin,OUTPUT);   } void loop() { int status_MicAO = digitalRead(MicAO); if (status_MicAO == 0) { if (clap == 0) { detection_range_start = detection_range = millis(); clap++; } else if (clap > 0 && millis()-detection_range >= 50) { detection_range = millis(); clap++; } } if (millis()-detection_range_start >= 400) { if (clap == 2) { if (!status_lights) { status_lights = true; digitalWrite(ledPin, HIGH); } else if (status_lights) { status_lights = false; digitalWrite(ledPin, LOW); } } clap = 0; } }

DIY ORTOMI ROBOT FACE USING ESP32 CONNECTION DIAGRAM

  0.96” I2C   28x64 SSD1306 OLED Display Wiring :- VCC – 3.3V GND – GND SCL(OLED) – GPIO 22 ( ESP32 ) SDA(OLED) – GPIO 21 ( ESP32 )   TTP223 Touch Sensor Wiring :- VCC – 3.3V {Add 10R resistor with this pin} (ESP32) GND – GND (ESP32) I / O   – GPIO 14 (ESP32)   Speaker OR Buzzer :-   + POSITIVE –   GPIO 25 (ESP32) - NEGETIVE - GND (ESP32)   Required Libraries to Install:- Adafruit_GFX Adafruit_SSD1306 Wire     Note:- Download Emotions.h and SoundFX.h file for link below and paste in same folder where code.uno file save.     Full Code:- RobotFace.ino #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> //#include "Emotions.h" #include "Emotions_CLEAN.h" #include "SoundFX.h"   #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET     -1 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_H...