// === Pin Definitions ===
#define TRIG_PIN 23
#define ECHO_PIN 22
#define BUZZER_PIN 2
#define RED_LED 25
#define ORANGE_LED 26
#define GREEN_LED 27
// === Tank height (cm) ===
const float TANK_HEIGHT = 17.0;
// === Distance thresholds (from sensor to water surface) ===
// Note: smaller distance = higher water level
const float TOO_HIGH_MIN = 0.0;
const float TOO_HIGH_MAX = 5.0;
const float NORMAL_MIN = 5.0;
const float NORMAL_MAX = 11.0;
const float TOO_LOW_MIN = 11.0;
const float TOO_LOW_MAX = 17.0;
// === Variables ===
String lastStatus = "";
// === Measure distance (cm) ===
float measureDistanceCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 40000); // timeout 40ms
if (duration == 0) return -1;
return duration * 0.0343 / 2.0;
}
// === Beep twice (danger alert) ===
void beepTwice() {
for (int i = 0; i < 2; i++) {
digitalWrite(BUZZER_PIN, HIGH);
delay(150);
digitalWrite(BUZZER_PIN, LOW);
delay(150);
}
}
void setup() {
Serial.begin(115200);
Serial.println("💧 WATER LEVEL MONITOR STARTING...");
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(ORANGE_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
digitalWrite(RED_LED, LOW);
digitalWrite(ORANGE_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BUZZER_PIN, LOW);
delay(1000);
Serial.println("✅ System Ready.\n");
}
void loop() {
float distance = measureDistanceCM();
if (distance < 0) {
Serial.println("⚠️ STATUS: NO ECHO | DISTANCE: ----");
digitalWrite(RED_LED, LOW);
digitalWrite(ORANGE_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BUZZER_PIN, LOW);
return;
}
// Compute actual water height (cm)
float waterLevel = TANK_HEIGHT - distance;
if (waterLevel < 0) waterLevel = 0;
// Display readings on Serial Monitor
Serial.print("Distance to water: ");
Serial.print(distance, 1);
Serial.print(" cm | Water Level: ");
Serial.print(waterLevel, 1);
Serial.println(" cm");
// === TOO HIGH ===
if (distance >= TOO_HIGH_MIN && distance <= TOO_HIGH_MAX) {
Serial.println("STATUS: TOO HIGH (⚠️ Water Level DANGER - HIGH)");
digitalWrite(RED_LED, LOW);
digitalWrite(ORANGE_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
if (lastStatus != "HIGH") {
beepTwice();
lastStatus = "HIGH";
}
}
// === NORMAL ===
else if (distance >= NORMAL_MIN && distance <= NORMAL_MAX) {
Serial.println("STATUS: NORMAL (✅ Water Level SAFE)");
digitalWrite(RED_LED, LOW);
digitalWrite(ORANGE_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
digitalWrite(BUZZER_PIN, LOW);
lastStatus = "NORMAL";
}
// === TOO LOW ===
else if (distance >= TOO_LOW_MIN && distance <= TOO_LOW_MAX) {
Serial.println("STATUS: TOO LOW (⚠️ Water Level DANGER - LOW)");
digitalWrite(RED_LED, HIGH);
digitalWrite(ORANGE_LED, LOW);
digitalWrite(GREEN_LED, LOW);
if (lastStatus != "LOW") {
beepTwice();
lastStatus = "LOW";
}
}
// === OUT OF RANGE ===
else {
Serial.println("STATUS: OUT OF RANGE (Check sensor alignment or tank level)");
digitalWrite(RED_LED, LOW);
digitalWrite(ORANGE_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BUZZER_PIN, LOW);
lastStatus = "OUT OF RANGE";
}
Serial.println("------------------------------------");
delay(1000);
}