#include <LiquidCrystal.h>
#include <Servo.h> // Library untuk mengontrol servo motor
// Konfigurasi LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Servo myServo;
// Pin Output
const int relay1 = 8; // Katup Selenoid
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(relay3, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(tombolMode, INPUT_PULLUP);
pinMode(tombolAir, INPUT_PULLUP);
pinMode(tombolEksekusi, INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT);
myServo.attach(9); // Hubungkan servo ke pin 9
// Tampilan awal dan buzzer
lcd.print("Ayo Umbah-umbah");
tone(buzzerPin, 1000, 1000); // Bunyikan buzzer 1 detik
delay(1300);
tampilkanPilihan();
}
void loop() {
if (digitalRead(tombolMode) == LOW) {
mode = (mode % 3) + 1;
tampilkanPilihan();
delay(300);
}
if (digitalRead(tombolAir) == LOW) {
levelAir = (levelAir % 3) + 1;
tampilkanPilihan();
delay(300);
}
if (digitalRead(tombolEksekusi) == LOW) {
eksekusiProgram();
delay(300);
}
}
void tampilkanPilihan() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Mode: ");
lcd.print((mode == 1) ? "Normal" : (mode == 2) ? "Bilas 2x" : "Cepat");
lcd.setCursor(0, 1);
lcd.print("Air: ");
lcd.print((levelAir == 1) ? "Low" : (levelAir == 2) ? "Mid" : "High");
}
long bacaLevelAir() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
return duration * 0.034 / 2; // Konversi waktu ke jarak (cm)
}
void isiAir() {
long targetLevel = (levelAir == 1) ? 30 : (levelAir == 2) ? 20 : 10;
digitalWrite(relay1, HIGH);
while (bacaLevelAir() > targetLevel) {
lcd.setCursor(0, 1);
lcd.print("Air: ");
lcd.print(bacaLevelAir());
lcd.print(" cm ");
delay(500);
}
digitalWrite(relay1, LOW);
}
void eksekusiProgram() {
lcd.clear();
lcd.print("Processing...");
isiAir();
lcd.setCursor(0, 1);
lcd.print((mode == 1) ? "Mode: Normal" : (mode == 2) ? "Mode: Bilas 2x" : "Mode: Cepat");
if (mode == 1) prosesNormal();
else if (mode == 2) prosesBilas2x();
else prosesCepat();
lcd.clear();
lcd.print("Program Selesai");
lcd.setCursor(0, 1);
lcd.print("Mode: ");
lcd.print(mode); // Menampilkan mode yang dipilih
bunyikanAlarm();
}
void prosesNormal() {
isiAir();
lcd.setCursor(0, 1);
lcd.print("Mencuci...");
myServo.write(30); delay(2000); // Servo ke 30 derajat
pengurasan();
}
void prosesBilas2x() {
isiAir();
delay(5000);
pengurasan();
isiAir();
delay(5000);
pengurasan();
}
void prosesCepat() {
isiAir();
delay(3000);
pengurasan();
}
void pengurasan() {
lcd.setCursor(0, 1);
lcd.print("Menguras...");
digitalWrite(relay3, HIGH);
delay(3000);
digitalWrite(relay3, LOW);
}
void bunyikanAlarm() {
for (int i = 0; i < 3; i++) {
tone(buzzerPin, 1000, 500);
delay(1000);
}
}