#include <LiquidCrystal.h>
// Konfigurasi LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Pin Relay
const int relay1 = 8; // Katup Selenoid
const int relay2 = 9; // Saklar Motor Pencucian
const int relay3 = 10; // Drain Motor
// Pin Sensor Ultrasonik
const int trigPin = 7;
const int echoPin = 6;
// Pin Tombol
const int tombolMode = A2;
const int tombolAir = A3;
const int tombolEksekusi = A4;
const int buzzerPin = A5;
// Variabel untuk pilihan
int mode = 1; // 1: Normal, 2: Bilas 2x, 3: Cepat
int levelAir = 1; // 1: Low, 2: Mid, 3: High
void setup() {
lcd.begin(16, 2);
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(tombolMode, INPUT_PULLUP);
pinMode(tombolAir, INPUT_PULLUP);
pinMode(tombolEksekusi, INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT); // Konfigurasi pin buzzer
// Memulai tampilan awal
lcd.print("Ayo Umbah-umbah");
delay(1000);
}
void loop() {
// Pilihan mode
if (digitalRead(tombolMode) == LOW) {
mode = (mode % 3) + 1;
tampilkanPilihan();
delay(300); // Anti-bouncing
}
// Pilihan level air
if (digitalRead(tombolAir) == LOW) {
levelAir = (levelAir % 3) + 1;
tampilkanPilihan();
delay(300); // Anti-bouncing
}
// Eksekusi
if (digitalRead(tombolEksekusi) == LOW) {
eksekusiProgram();
delay(300); // Anti-bouncing
}
}
void tampilkanPilihan() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Mode: ");
if (mode == 1) lcd.print("Normal");
else if (mode == 2) lcd.print("Bilas 2x");
else if (mode == 3) lcd.print("Cepat");
lcd.setCursor(0, 1);
lcd.print("Air: ");
if (levelAir == 1) lcd.print("Low");
else if (levelAir == 2) lcd.print("Mid");
else if (levelAir == 3) lcd.print("High");
}
void eksekusiProgram() {
lcd.clear();
lcd.print("Processing...");
// Isi air
lcd.setCursor(0, 1);
lcd.print("Mengisi air...");
isiAir();
// Proses pencucian
if (mode == 1) {
lcd.setCursor(0, 1);
lcd.print("Mode: Normal ");
prosesNormal();
} else if (mode == 2) {
lcd.setCursor(0, 1);
lcd.print("Mode: Bilas 2x ");
prosesBilas2x();
} else if (mode == 3) {
lcd.setCursor(0, 1);
lcd.print("Mode: Cepat ");
prosesCepat();
}
// Alarm selesai
lcd.setCursor(0, 1);
lcd.print("Sudah Selesai!");
bunyikanAlarm();
lcd.clear();
lcd.print("Siap digaringkan!");
delay(2000);
}
long bacaLevelAir() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
long distance = duration * 0.034 / 2; // Mengonversi waktu ke jarak (cm)
return distance;
}
void isiAir() {
long targetLevel;
// Tentukan target level air berdasarkan pilihan levelAir
if (levelAir == 1) targetLevel = 30; // Low (30 cm dari sensor)
else if (levelAir == 2) targetLevel = 20; // Mid (20 cm dari sensor)
else if (levelAir == 3) targetLevel = 10; // High (10 cm dari sensor)
// Nyalakan katup selenoid untuk mulai mengisi air
digitalWrite(relay1, HIGH);
// Isi air hingga mencapai target level
while (bacaLevelAir() > targetLevel) {
lcd.setCursor(0, 1);
lcd.print("Air: ");
lcd.print(bacaLevelAir());
lcd.print(" cm ");
delay(500); // Tunggu sebentar sebelum membaca lagi
}
// Matikan katup selenoid
digitalWrite(relay1, LOW);
}
void prosesNormal() {
// Isi air sebelum pencucian
lcd.setCursor(0, 1);
lcd.print("Isi Air... ");
isiAir();
// Pencucian
lcd.setCursor(0, 1);
lcd.print("Mencuci... ");
digitalWrite(relay2, HIGH);
delay(2000); // 2 detik (test)
digitalWrite(relay2, LOW);
// Pengurasan
lcd.setCursor(0, 1);
lcd.print("Menguras... ");
digitalWrite(relay3, HIGH);
delay(2000); // 2 detik (test)
digitalWrite(relay3, LOW);
// Isi air sebelum pembilasan
lcd.setCursor(0, 1);
lcd.print("Isi Air... ");
isiAir();
// Pembilasan 1
lcd.setCursor(0, 1);
lcd.print("Membilas... ");
digitalWrite(relay2, HIGH);
delay(2000); // 2 detik (test)
digitalWrite(relay2, LOW);
// Pengurasan
lcd.setCursor(0, 1);
lcd.print("Menguras... ");
digitalWrite(relay3, HIGH);
delay(2000); // 2 detik (test)
digitalWrite(relay3, LOW);
}
void prosesBilas2x() {
// Rendam
isiAir();
delay(10000); // 10 menit
// Pencucian
digitalWrite(relay2, HIGH);
delay(15000); // 15 menit
digitalWrite(relay2, LOW);
// Pengurasan
digitalWrite(relay3, HIGH);
delay(5000);
digitalWrite(relay3, LOW);
// Pembilasan 1
isiAir();
digitalWrite(relay2, HIGH);
delay(5000);
digitalWrite(relay2, LOW);
digitalWrite(relay3, HIGH);
delay(5000);
digitalWrite(relay3, LOW);
// Pembilasan 2
isiAir();
digitalWrite(relay2, HIGH);
delay(5000);
digitalWrite(relay2, LOW);
digitalWrite(relay3, HIGH);
delay(5000);
digitalWrite(relay3, LOW);
}
void prosesCepat() {
// Pencucian
isiAir();
digitalWrite(relay2, HIGH);
delay(10000); // 10 menit
digitalWrite(relay2, LOW);
// Pengurasan
digitalWrite(relay3, HIGH);
delay(5000);
digitalWrite(relay3, LOW);
// Pembilasan 1
isiAir();
digitalWrite(relay2, HIGH);
delay(5000);
digitalWrite(relay2, LOW);
digitalWrite(relay3, HIGH);
delay(5000);
digitalWrite(relay3, LOW);
}
void bunyikanAlarm() {
for (int i = 0; i < 5; i++) { // Ulangi 5 kali
tone(buzzerPin, 1000, 1000); // Bunyikan buzzer (1000 Hz, selama 1 detik)
delay(1000); // Tunggu 1 detik (untuk durasi bunyi selesai)
delay(1000); // Jeda 1 detik sebelum bunyi berikutnya
}
}