#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#define TRIG_PIN 3
#define ECHO_PIN 2
#define SERVO_PIN 5
#define RELAY_PIN 12
Servo myServo;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
myServo.attach(SERVO_PIN);
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
}
void loop() {
long duration;
float distance;
// Trigger ultrasonic pulse
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Read echo pulse duration
duration = pulseIn(ECHO_PIN, HIGH);
// Convert duration to distance
distance = duration * 0.034 / 2;
// Output readings to Serial Monitor
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// Display readings on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tinggi Air ");
lcd.print(distance);
lcd.print(" cm");
// Control pump, servo, and buzzer based on water level
if (distance > 15) { // Level LOW, turn pump on, move servo, and activate buzzer
digitalWrite(RELAY_PIN, HIGH);
myServo.write(90); // Move servo to 90 degrees
lcd.setCursor(0, 1);
lcd.print("Pompa: ON");
} else if (distance < 5) { // Level HIGH, turn pump off, reset servo, and deactivate buzzer
digitalWrite(RELAY_PIN, LOW);
myServo.write(0); // Reset servo to 0 degrees
lcd.setCursor(0, 1);
lcd.print("Pompa: OFF ");
}
delay(1000);
}