#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
int TRIG_PIN = 13;
int ECHO_PIN = 12;
int SERVO_PIN = 11;
int DISTANCE_THRESHOLD = 350;
float WATER_LEVEL_OFFSET = 20.0;
LiquidCrystal_I2C lcd(0x27, 16, 2);
float duration, distance, waterlevel;
Servo servo;
void setup() {
Serial.begin(9600);
// Initialize LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.print("Distance:");
lcd.setCursor(0, 1);
lcd.print("Level:");
// Setup pins
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
servo.attach(SERVO_PIN);
servo.write(0);
}
void loop() {
// Trigger ultrasonic sensor
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Read distance and calculate water level
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.017;
waterlevel = distance - WATER_LEVEL_OFFSET;
// Control servo based on water level
if (waterlevel < DISTANCE_THRESHOLD) {
int servo_position = map(waterlevel, 0, DISTANCE_THRESHOLD, 0, 180);
servo.write(servo_position);
}
// Display distance and level on LCD
lcd.setCursor(9, 0);
lcd.print(" "); // Clear previous distance value
lcd.setCursor(9, 0);
lcd.print(distance);
lcd.setCursor(6, 1);
lcd.print(" "); // Clear previous level value
lcd.setCursor(6, 1);
lcd.print(waterlevel);
// Print to Serial Monitor for debugging
Serial.print("Distance: ");
Serial.print(distance);
Serial.print("m Level: ");
Serial.print(waterlevel);
Serial.println("m");
Serial.println(" ");
delay(500);
}