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

ESP32-Based Water Level and Temperature Monitoring System with OLED Display

View and Edit Project In Cirkit DesignerImage of ESP32-Based Water Level and Temperature Monitoring System with OLED Display

Circuit Documentation

Summary

This circuit is designed to measure temperature and water volume using an ESP32 microcontroller, a DS18B20 temperature sensor, an HC-SR04 ultrasonic sensor, and display the data on a 0.96" OLED screen. It also features a buzzer and an LED for alerting purposes. The circuit is powered by a battery case.

Component List

ESP32

DS18B20

Buzzer

HC-SR04 Ultrasonic Sensor

0.96" OLED

LED: Two Pin (red)

Resistor

My battery case

Wiring Details

ESP32

DS18B20

Buzzer

HC-SR04 Ultrasonic Sensor

0.96" OLED

LED: Two Pin (red)

Resistor

My battery case

Documented Code

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <NewPing.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET    -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define ONE_WIRE_BUS 15
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

#define TRIG_PIN 14
#define ECHO_PIN 27
#define MAX_DISTANCE 200 // Maximum distance for the sensor (in cm)
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);

#define BUZZER_PIN 12
#define LED_PIN 13

const float BOTTLE_RADIUS = 3.25; // Bottle radius in cm
const float BOTTLE_HEIGHT = 19.0; // Bottle height in cm
unsigned long previousMillis = 0;
const long interval = 17000; // 17 seconds

void setup() {
  Serial.begin(115200);
  
  // Initialize OLED
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("OLED failed to initialize"));
    for(;;);
  }
  display.clearDisplay();
  
  // Initialize temperature sensor
  sensors.begin();
  
  // Initialize buzzer and LED pins
  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
  
  // Set LED to low (use resistor to adjust brightness)
  digitalWrite(LED_PIN, LOW); // LED off initially
}

void loop() {
  // Read temperature from DS18B20
  sensors.requestTemperatures();
  float temperature = sensors.getTempCByIndex(0);

  // Read distance from HC-SR04
  float distance = sonar.ping_cm();

  // Calculate water volume in mL
  float height_water = BOTTLE_HEIGHT - distance; // Water height in cm
  float volume_water = 3.14159 * BOTTLE_RADIUS * BOTTLE_RADIUS * height_water; // Volume in cm³
  volume_water *= 1.0; // Volume already in mL (1 cm³ = 1 mL)

  // Display temperature and volume on OLED
  display.clearDisplay();
  display.setTextSize(2); // Increase text size
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0,0);
  display.print("Temp: ");
  display.print(temperature);
  display.println(" C");

  display.print("Volume: ");
  display.print(volume_water);
  display.println(" mL");

  display.display();

  // Timer for buzzer and LED
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    
    // Sound buzzer and turn on LED simultaneously
    digitalWrite(LED_PIN, HIGH); // Turn on LED
    tone(BUZZER_PIN, 1000); // Turn on buzzer at 1000 Hz frequency
    delay(3000); // Buzzer sound and LED on duration for 3 seconds
    noTone(BUZZER_PIN); // Turn off buzzer
    digitalWrite(LED_PIN, LOW); // Turn off LED
  }

  delay(500); // 0.5 second pause for loop
}

This code is designed to run on the ESP32 microcontroller. It initializes the OLED display, temperature sensor, and ultrasonic sensor in the setup() function. In the loop() function, it reads the temperature and calculates the water volume based on the distance measured by the ultrasonic sensor. The results are displayed on the OLED. Additionally, every 17 seconds, the buzzer sounds and the LED lights up for 3 seconds as an alert.