#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// LCD: 16x2 I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pin Definitions
const int greenLED = 2;
const int yellowLED = 3;
const int redLED = 4;
const int buzzer = 5;
const int button = 6;
const int waterSensor = A0;
// Alarm State
bool fullAlarmActive = false;
bool fullAlarmAcknowledged = false;
bool emptyAlarmActive = false;
int previousLevel = -1;
void setup() {
pinMode(greenLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
pinMode(redLED, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(button, INPUT_PULLUP); // Active LOW
lcd.begin(16, 2);
lcd.backlight();
lcd.print("Water Level Init");
delay(1500);
lcd.clear();
Serial.begin(9600);
}
void loop() {
int waterLevel = analogRead(waterSensor);
bool buttonPressed = digitalRead(button) == LOW;
Serial.println(waterLevel);
lcd.setCursor(0, 0);
lcd.print("Level: ");
lcd.print(waterLevel);
lcd.print(" ");
// Reset LEDs every loop
digitalWrite(greenLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(redLED, LOW);
// -------- FULL ALARM HANDLING --------
if (waterLevel == 1023 && !fullAlarmAcknowledged) {
fullAlarmActive = true;
}
// Wait for user button press to stop full alarm
if (fullAlarmActive) {
lcd.setCursor(0, 1);
lcd.print("Status: FULL!!! ");
// Siren effect
for (int i = 1000; i <= 2000; i += 200) {
tone(buzzer, i);
delay(40);
}
for (int i = 2000; i >= 1000; i -= 200) {
tone(buzzer, i);
delay(40);
}
// Wait for button press
if (buttonPressed) {
fullAlarmActive = false;
fullAlarmAcknowledged = true;
noTone(buzzer);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Full Acknowledged");
delay(1000);
lcd.clear();
}
return; // Skip rest
}
// After leaving FULL state (i.e. water < 1023), reset acknowledge
if (previousLevel == 1023 && waterLevel < 1023) {
fullAlarmAcknowledged = false;
}
// -------- EMPTY ALARM HANDLING --------
if (waterLevel == 0) {
emptyAlarmActive = true;
digitalWrite(greenLED, HIGH);
lcd.setCursor(0, 1);
lcd.print("Status: EMPTY ");
// Beep beep
tone(buzzer, 500);
delay(200);
noTone(buzzer);
delay(200);
previousLevel = waterLevel;
return; // Skip rest
}
// If water goes above 0, turn off empty alarm
if (waterLevel > 0 && emptyAlarmActive) {
emptyAlarmActive = false;
}
// -------- NORMAL RANGE DISPLAY --------
lcd.setCursor(0, 1);
if (waterLevel <= 340) {
digitalWrite(greenLED, HIGH);
lcd.print("Status: LOW ");
} else if (waterLevel <= 681) {
digitalWrite(yellowLED, HIGH);
lcd.print("Status: MEDIUM ");
} else if (waterLevel <= 1022) {
digitalWrite(redLED, HIGH);
lcd.print("Status: HIGH ");
}
noTone(buzzer);
previousLevel = waterLevel;
delay(300);
}