Water Monitoring system — ESP32 simulation

An interactive ESP32 circuit simulation you can run free in your browser on Velxio, by gauravudrakar123.

Components

Sketch code

#include <WiFi.h>
#include <HTTPClient.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

/*
  ESP32 SMART WATER MONITORING SYSTEM

  PINS
  HC-SR04 TRIG  -> GPIO 27
  HC-SR04 ECHO  -> GPIO 26 (USE VOLTAGE DIVIDER)
  OLED SDA      -> GPIO 21
  OLED SCL      -> GPIO 22
  LED           -> GPIO 14
  BUZZER        -> GPIO 13

  IMPORTANT:
  1. Do NOT put ```cpp or ``` in the Arduino editor.
  2. This program uses SIMULATION_MODE = true for a smooth 0-100% demo.
  3. Set SIMULATION_MODE = false to use the real HC-SR04.
*/

#define WIFI_SSID     "Eye Phone"
#define WIFI_PASSWORD "sanyttttt"

#define THINGSPEAK_API_KEY "W0412S1EMNL59GY1"
#define THINGSPEAK_URL "http://api.thingspeak.com/update"

#define TRIG_PIN   27
#define ECHO_PIN   26
#define LED_PIN    14
#define BUZZER_PIN 13

#define OLED_SDA 21
#define OLED_SCL 22
#define OLED_ADDR 0x3C

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

#define TANK_HEIGHT_CM 30.0
#define TANK_CAPACITY_L 500.0

#define FULL_LEVEL 80.0
#define BUZZER_TIME 30000UL

#define SIMULATION_MODE true
#define SIMULATION_STEP_MS 100

#define SENSOR_INTERVAL_MS 100
#define OLED_INTERVAL_MS 200
#define SERIAL_INTERVAL_MS 200
#define THINGSPEAK_INTERVAL_MS 15000

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

float waterLevel = 0.0;
float waterHeight = 0.0;
float waterVolume = 0.0;
float distanceCm = TANK_HEIGHT_CM;

bool oledOK = false;
bool alarmTriggered = false;
bool buzzerActive = false;

unsigned long buzzerStartTime = 0;
unsigned long lastSensorTime = 0;
unsigned long lastOLEDTime = 0;
unsigned long lastSerialTime = 0;
unsigned long lastThingSpeakTime = 0;
unsigned long lastWiFiAttempt = 0;

float simulatedLevel = 0.0;
int simulationDirection = 1;

void buzzerOff() {
  digitalWrite(BUZZER_PIN, LOW);
  buzzerActive = false;
}

void buzzerOn() {
  digitalWrite(BUZZER_PIN, HIGH);
  buzzerActive = true;
  buzzerStartTime = millis();
}

void connectWiFi() {
  if (WiFi.status() == WL_CONNECTED) return;

  Serial.print("Connecting to WiFi");
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  unsigned long start = millis();

  while (WiFi.status() != WL_CONNECTED && millis() - start < 10000) {
    delay(250);
    Serial.print(".");
  }

  Serial.println();

  if (WiFi.status() == WL_CONNECTED) {
    Serial.print("WiFi connected. IP: ");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println("WiFi not connected. Monitoring will continue.");
  }
}

void maintainWiFi() {
  if (WiFi.status() == WL_CONNECTED) return;

  if (millis() - lastWiFiAttempt >= 10000) {
    lastWiFiAttempt = millis();
    connectWiFi();
  }
}

void updateValuesFromLevel(float level) {
  waterLevel = constrain(level, 0.0, 100.0);

  waterHeight = (waterLevel / 100.0) * TANK_HEIGHT_CM;
  waterVolume = (waterLevel / 100.0) * TANK_CAPACITY_L;
  distanceCm = TANK_HEIGHT_CM - waterHeight;

  if (distanceCm < 0) distanceCm = 0;
  if (distanceCm > TANK_HEIGHT_CM) distanceCm = TANK_HEIGHT_CM;