#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Relay Pin
#define FILL_VALVE_PIN 6 // Relay untuk katup pengisian air
#define DRAIN_PUMP_PIN 5 // Relay untuk pompa penguras
#define AGITATE_LEFT_PIN 4 // Relay motor agitasi arah kiri
#define AGITATE_RIGHT_PIN 3 // Relay motor agitasi arah kanan
// Tombol Pin
#define ON_BUTTON_PIN 7
#define UP_BUTTON_PIN 9
#define DOWN_BUTTON_PIN 10
#define START_BUTTON_PIN 11
#define MENU_BUTTON_PIN 13
#define LEVEL_BUTTON_PIN 12 // Tombol untuk memilih level air
int mode = 0; // 0: Cuci dua arah, 1: Bilas, 2: Pengeringan, 3: Otomatis
int waterLevel = 0; // 0: Easy, 1: Medium, 2: Hard
int timer = 10; // Durasi default (detik)
bool isOn = false; // Status ON/OFF
bool isRunning = false; // Status siklus berjalan
void setup() {
lcd.begin(0x27, 16, 2);
lcd.backlight();
lcd.print(" .. MESIN SIAP ..");
pinMode(FILL_VALVE_PIN, OUTPUT);
pinMode(DRAIN_PUMP_PIN, OUTPUT);
pinMode(AGITATE_LEFT_PIN, OUTPUT);
pinMode(AGITATE_RIGHT_PIN, OUTPUT);
pinMode(ON_BUTTON_PIN, INPUT_PULLUP);
//pinMode(STOP_BUTTON_PIN, INPUT_PULLUP);
pinMode(UP_BUTTON_PIN, INPUT_PULLUP);
pinMode(DOWN_BUTTON_PIN, INPUT_PULLUP);
pinMode(START_BUTTON_PIN, INPUT_PULLUP);
pinMode(MENU_BUTTON_PIN, INPUT_PULLUP);
pinMode(LEVEL_BUTTON_PIN, INPUT_PULLUP); // Inisialisasi tombol level
}
void loop() {
if (digitalRead(ON_BUTTON_PIN) == LOW) {
isOn = true;
lcd.clear();
lcd.print(" ... Proses ON ...");
delay(300);
}
if (isOn && !isRunning) {
if (digitalRead(MENU_BUTTON_PIN) == LOW) {
mode = (mode + 1) % 4;
displayMode();
delay(300);
}
if (digitalRead(LEVEL_BUTTON_PIN) == LOW) {
waterLevel = (waterLevel + 1) % 3; // Cycle through water levels
displayWaterLevel();
delay(300);
}
if (digitalRead(UP_BUTTON_PIN) == LOW) {
timer++;
lcd.setCursor(0, 2);
lcd.print("Timer: ");
lcd.print(timer);
lcd.print(" min");
delay(300);
}
if (digitalRead(DOWN_BUTTON_PIN) == LOW) {
timer = max(1, timer - 1);
lcd.setCursor(0, 2);
lcd.print("Timer: ");
lcd.print(timer);
lcd.print(" min");
delay(300);
}
if (digitalRead(START_BUTTON_PIN) == LOW) {
isRunning = true;
startCycle(mode);
}
}
}
void displayMode() {
lcd.clear();
switch (mode) {
case 0:
lcd.print("Mencuci ...");
break;
case 1:
lcd.print("Bilas ...");
break;
case 2:
lcd.print("Pengering ...");
break;
case 3:
lcd.print("Automatis ...");
break;
}
}
void displayWaterLevel() {
lcd.setCursor(0, 1);
switch (waterLevel) {
case 0:
lcd.print("Level: Easy ");
break;
case 1:
lcd.print("Level: Medium ");
break;
case 2:
lcd.print("Level: Hard ");
break;
}
}
void startCycle(int cycleMode) {
lcd.clear();
int fillTime;
// Tentukan waktu pengisian air berdasarkan level yang dipilih
switch (waterLevel) {
case 0: fillTime = 12000; // Easy: 2 menit
break;
case 1: fillTime =24000; // Medium: 4 menit
break;
case 2: fillTime = 36000; // Hard: 6 menit
break;
}
switch (cycleMode) {
case 0:
lcd.print("Mengisi Air...");
digitalWrite(FILL_VALVE_PIN, HIGH);
delay(fillTime);
delay(timer * 1000);
digitalWrite(FILL_VALVE_PIN, LOW);
lcd.clear();
lcd.print("Mencuci...");
for (int i = 0; i < timer; i++) {
digitalWrite(AGITATE_LEFT_PIN, HIGH);
delay(5000);
digitalWrite(AGITATE_LEFT_PIN, LOW);
delay(800);
digitalWrite(AGITATE_RIGHT_PIN, HIGH);
delay(5000);
digitalWrite(AGITATE_RIGHT_PIN, LOW);
delay(800);
}
lcd.clear();
lcd.print("Menguras Air");
digitalWrite(DRAIN_PUMP_PIN, HIGH);
delay(fillTime);
delay(timer * 1000);
digitalWrite(DRAIN_PUMP_PIN, LOW);
break;
case 1:
lcd.print("Mengisi Air...");
digitalWrite(FILL_VALVE_PIN, HIGH);
delay(fillTime);
delay(timer * 1000);
digitalWrite(FILL_VALVE_PIN, LOW);
lcd.clear();
lcd.print("Membilas...");
digitalWrite(AGITATE_LEFT_PIN, HIGH);
delay(timer * 1000);
digitalWrite(AGITATE_LEFT_PIN, LOW);
break;
case 2:
lcd.clear();
lcd.print("Menguras Air");
digitalWrite(DRAIN_PUMP_PIN, HIGH);
delay(fillTime);
delay(timer * 1000);
lcd.clear();
lcd.print("Mengeringkan");
digitalWrite(AGITATE_LEFT_PIN, HIGH);
delay(timer * 1000);
digitalWrite(AGITATE_LEFT_PIN, LOW);
digitalWrite(DRAIN_PUMP_PIN, LOW);
break;
case 3:
lcd.print("Otomatis...");
startCycle(0);
delay(1200);
startCycle(1);
delay(1200);
startCycle(2);
break;
}
lcd.clear();
lcd.print("Siklus Selesai");
isRunning = false;
}
void stopAll() {
digitalWrite(FILL_VALVE_PIN, LOW);
digitalWrite(DRAIN_PUMP_PIN, LOW);
digitalWrite(AGITATE_LEFT_PIN, LOW);
digitalWrite(AGITATE_RIGHT_PIN, LOW);
}