#include <EEPROM.h>
#include <Servo.h>
#include <LiquidCrystal.h>
// Menginisialisasi LCD dengan pin yang digunakan
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
Servo myservo;
long duration, inches;
int set_val, percentage; // set variabel
bool state, pump;
int buttonPin = 13;
void setup() {
lcd.begin(16, 2); // sett ukuran lcd
lcd.print("WATER LEVEL:");
lcd.setCursor(0, 1);
lcd.print("PUMP:OFF MANUAL");
pinMode(8, OUTPUT);
pinMode(9, INPUT);
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(12, OUTPUT);
pinMode(buttonPin, INPUT);
set_val = EEPROM.read(0); // Membaca nilai setpoint dari EEPROM
if (set_val > 150) set_val = 150; // Membatasi nilai setpoint maksimal 150
myservo.attach(10); // Menghubungkan servo ke pin 10
}
void loop() {
// Mengirim sinyal ke sensor ultrasonic
digitalWrite(3, LOW);
delayMicroseconds(2);
digitalWrite(8, HIGH);
delayMicroseconds(10);
digitalWrite(8, LOW);
duration = pulseIn(9, HIGH); // Membaca durasi pulsa echo
inches = microsecondsToInches(duration); // Mengubah durasi menjadi jarak dalam inci
// Menghitung persentase level air
percentage = (set_val - inches) * 100 / set_val;
if (percentage < 0) percentage = 0; // Menyaring nilai negatif
// Menampilkan persentase level air di LCD
lcd.setCursor(12, 0);
lcd.print(percentage);
lcd.print("% ");
// Logika pengaturan pompa berdasarkan level air
if (percentage < 30 && digitalRead(11)) pump = 1; // Nyalakan pompa jika level di bawah 30% dan dalam mode otomatis
if (percentage > 99) pump = 0; // Matikan pompa jika level mencapai 100%
digitalWrite(12, !pump); // Mengatur output pompa
// Menampilkan status pompa di LCD
lcd.setCursor(5, 1);
if (pump == 1) lcd.print("ON ");
else if (pump == 0) lcd.print("OFF");
// Menampilkan mode operasi (MANUAL/AUTO) di LCD
lcd.setCursor(9, 1);
if (!digitalRead(11)) lcd.print("MANUAL");
else lcd.print("AUTO ");
// Mengatur setpoint jika tombol ditekan dalam mode otomatis
if (!digitalRead(10) && !state && digitalRead(11)) {
state = 1;
set_val = inches; // Set nilai setpoint ke nilai jarak saat ini
EEPROM.write(0, set_val); // Menyimpan nilai setpoint ke EEPROM
}
// Mengubah status pompa jika tombol ditekan dalam mode manual
if (!digitalRead(10) && !state && !digitalRead(11)) {
state = 1;
pump = !pump; // Mengubah status pompa
}
// Kontrol servo berdasarkan status pompa
if (pump == 0) {
myservo.write(180); // Mengatur servo ke posisi 180 derajat (mati)
} else if (pump == 1) {
myservo.write(0); // Mengatur servo ke posisi 0 derajat (hidup)
}
// Mode kontrol manual menggunakan tombol push button
if (!digitalRead(11)) {
lcd.setCursor(9, 1);
lcd.print("MANUAL");
if (!state && digitalRead(buttonPin)) {
state = 1;
set_val = inches; // Set nilai setpoint ke nilai jarak saat ini
EEPROM.write(0, set_val); // Menyimpan nilai setpoint ke EEPROM
delay(10);
}
} else {
lcd.setCursor(9, 1);
lcd.print("AUTO ");
state = 0; // Reset state ketika dalam mode otomatis
}
// Kontrol pompa berdasarkan tombol dalam mode manual
if (state && digitalRead(11)) {
pump = digitalRead(buttonPin);
}
// Kontrol servo berdasarkan status pompa
if (pump == 0) {
myservo.write(180); // Mengatur servo ke posisi 180 derajat (mati)
} else if (pump == 1) {
myservo.write(0); // Mengatur servo ke posisi 0 derajat (hidup)
}
delay(500); // Menunggu selama 500 milidetik sebelum pengulangan loop
}
// Fungsi untuk mengubah durasi pulsa menjadi jarak dalam inci
long microsecondsToInches(long microseconds) {
return microseconds / 74 / 2;
}