#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// -------- PIN DEFINITIONS --------
#define TRIG 5
#define ECHO 18
#define RELAY 19
#define BUZZER 23
#define SERVO_PIN 4
#define LEAK_SENSOR 34
#define BUTTON 14
LiquidCrystal_I2C lcd(0x27, 16, 2);
// PWM channel (still needed for writing)
#define PWM_CHANNEL 0
long duration;
float distance;
int waterLevel;
// -------- SERVO FUNCTION --------
void setServoAngle(int angle) {
int duty = map(angle, 0, 180, 1638, 8192);
ledcWrite(PWM_CHANNEL, duty);
}
// -------- WATER LEVEL --------
int getWaterLevel() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duration = pulseIn(ECHO, HIGH);
distance = duration * 0.034 / 2;
int level = map(distance, 20, 0, 0, 100);
return constrain(level, 0, 100);
}
// -------- SETUP --------
void setup() {
Serial.begin(115200);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(RELAY, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
// ✅ New API
ledcAttach(SERVO_PIN, 50, 16);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("SMART WATER SYS");
delay(2000);
lcd.clear();
}
// -------- LOOP --------
void loop() {
waterLevel = getWaterLevel();
int leakValue = analogRead(LEAK_SENSOR);
bool leakDetected = (leakValue > 2000);
bool emergencyPressed = (digitalRead(BUTTON) == LOW);
lcd.clear();
if (leakDetected || emergencyPressed) {
digitalWrite(RELAY, LOW);
digitalWrite(BUZZER, HIGH);
setServoAngle(0);
lcd.setCursor(0, 0);
lcd.print("!!! ALERT !!!");
lcd.setCursor(0, 1);
if (leakDetected)
lcd.print("Leak Detected");
else
lcd.print("Emergency Stop");
} else {
digitalWrite(BUZZER, LOW);
setServoAngle(90);
if (waterLevel < 30) {
digitalWrite(RELAY, HIGH);
} else if (waterLevel > 90) {
digitalWrite(RELAY, LOW);
}
lcd.setCursor(0, 0);
lcd.print("Level:");
lcd.print(waterLevel);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Pump:");
lcd.print(digitalRead(RELAY) ? "ON " : "OFF");
}
delay(800);
}