#include <EEPROM.h> // Library untuk membaca dan menulis data ke EEPROM
#include <LiquidCrystal.h> // Library untuk mengontrol LCD
// Inisialisasi objek LCD dengan pin yang terhubung ke mikrokontroler
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
long duration, inches; // Variabel untuk durasi dan jarak dalam inci
int set_val, percentage; // Variabel untuk nilai referensi dan persentase level air
bool state, pump; // Variabel untuk status tombol dan status pompa
void setup() {
lcd.begin(16, 2); // Mengatur LCD dengan 16 kolom dan 2 baris
lcd.print("WATER LEVEL:"); // Menampilkan teks "WATER LEVEL:" pada baris pertama
lcd.setCursor(0, 1);
lcd.print("PUMP:OFF MANUAL"); // Menampilkan teks "PUMP:OFF MANUAL" pada baris kedua
pinMode(8, OUTPUT); // Mengatur pin 8 sebagai output untuk trigger sensor ultrasonik
pinMode(9, INPUT); // Mengatur pin 9 sebagai input untuk echo sensor ultrasonik
pinMode(10, INPUT_PULLUP); // Mengatur pin 10 sebagai input dengan pull-up internal untuk tombol manual
pinMode(11, INPUT_PULLUP); // Mengatur pin 11 sebagai input dengan pull-up internal untuk mode auto/manual
pinMode(12, OUTPUT); // Mengatur pin 12 sebagai output untuk mengontrol pompa
set_val = EEPROM.read(0); // Membaca nilai referensi dari EEPROM pada alamat 0
if (set_val > 150) set_val = 150; // Membatasi nilai referensi maksimal 150
}
void loop() {
// Mengirim sinyal trigger ke sensor ultrasonik
digitalWrite(3, LOW);
delayMicroseconds(2);
digitalWrite(8, HIGH);
delayMicroseconds(10);
digitalWrite(8, LOW);
// Membaca durasi pantulan gelombang ultrasonik
duration = pulseIn(9, HIGH);
// Menghitung jarak dalam inci
inches = microsecondsToInches(duration);
// Menghitung persentase level air berdasarkan nilai referensi
percentage = (set_val - inches) * 100 / set_val;
if (percentage < 0) percentage = 0; // Menjaga agar persentase tidak negatif
// Menampilkan persentase level air pada LCD
lcd.setCursor(12, 0);
lcd.print(percentage);
lcd.print("% ");
// Mengontrol pompa berdasarkan level air dan mode operasi
if (percentage < 30 & digitalRead(11)) pump = 1; // Menyalakan pompa jika level air di bawah 30% dalam mode otomatis
if (percentage > 99) pump = 0; // Mematikan pompa jika level air di atas 99%
digitalWrite(12, !pump); // Mengatur output untuk mengontrol pompa
// Menampilkan status pompa pada LCD
lcd.setCursor(5, 1);
if (pump == 1) lcd.print("ON ");
else if (pump == 0) lcd.print("OFF");
// Menampilkan mode operasi (manual/otomatis) pada LCD
lcd.setCursor(9, 1);
if (!digitalRead(11)) lcd.print("MANUAL");
else lcd.print("AUTO ");
// Mengatur nilai referensi dengan tombol atau mengubah status pompa
if (!digitalRead(10) & !state & digitalRead(11)) {
state = 1;
set_val = inches;
EEPROM.write(0, set_val); // Menyimpan nilai referensi baru ke EEPROM
}
if (!digitalRead(10) & !state & !digitalRead(11)) {
state = 1;
pump = !pump; // Mengubah status pompa dalam mode manual
}
if (digitalRead(10)) state = 0; // Mengatur status tombol
delay(500); // Menunggu 500 milidetik sebelum mengulang loop
}
// Fungsi untuk mengkonversi durasi pantulan gelombang ultrasonik ke jarak dalam inci
long microsecondsToInches(long microseconds) {
return microseconds / 74 / 2;
}