#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <Stepper.h>
#include <HX711.h>
#include <Ultrasonic.h>
// Inisialisasi Keypad
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {2, 1, 0, 14};
byte colPins[COLS] = {15, 16, 17, 18};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Inisialisasi LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pin untuk LED
const int led1 = 45; // LED untuk mode Mencuci
const int led2 = 47; // LED untuk mode Membilas
const int led3 = 49; // LED untuk indikator umum
const int buzzer = 33; // Pin untuk buzzer
// Pin untuk Pushbutton
const int buttonPin = 19; // Pin untuk pushbutton booting
const int cuciButtonPin = 25; // Pin untuk memilih mode Mencuci
const int bilasButtonPin = 27; // Pin untuk memilih mode Membilas
const int backButtonPin = 19; // Pin untuk kembali ke pemilihan mode
// Pin untuk Servo Motor (Pompa Air)
const int servoPin = 53; // Pin untuk Servo Motor
// Inisialisasi Servo
Servo pompaAir;
// Inisialisasi Stepper Motor (Biaxial Stepper)
const int stepsPerRevolution = 200;
Stepper stepper(stepsPerRevolution, 5, 6, 7, 8);
// Inisialisasi HX711 (Sensor Berat)
HX711 scale;
const int loadCellPin1 = A0;
const int loadCellPin2 = A1;
// Inisialisasi Ultrasonik
Ultrasonic ultrasonic(29, 23); // Trigger pin 12, Echo pin 13
// Variabel untuk proses booting, autentikasi, dan mode
bool isBooted = false;
bool isAuthenticated = false;
bool isModeSelected = false;
String selectedMode = "";
const String correctPIN = "1234";
String enteredPIN = "";
// Variabel untuk sensor berat
float weight = 11.0;
float weightThreshold = 10.0; // Batas berat cucian (10 kg)
// Variabel untuk sensor ultrasonik
long distance = 0; // Jarak air dari sensor ultrasonik
long distanceThreshold = 10; // Jarak air 10 cm
void setup() {
// Inisialisasi LED
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(buzzer, OUTPUT);
// Inisialisasi Pushbutton
pinMode(buttonPin, INPUT_PULLUP);
pinMode(cuciButtonPin, INPUT_PULLUP);
pinMode(bilasButtonPin, INPUT_PULLUP);
pinMode(backButtonPin, INPUT_PULLUP);
// Inisialisasi LCD
lcd.begin(16, 2);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Tekan tombol untuk");
lcd.setCursor(0, 1);
lcd.print("memulai booting...");
// Inisialisasi Servo
pompaAir.attach(servoPin);
// Inisialisasi Stepper Motor
stepper.setSpeed(60);
// Inisialisasi Sensor Berat
scale.begin(loadCellPin1, loadCellPin2);
}
void loop() {
if (!isBooted) {
bootSystem();
} else if (!isAuthenticated) {
authenticateUser();
} else if (!isModeSelected) {
selectMode();
} else {
// Setelah mode dipilih
if (selectedMode == "Mencuci") {
mencuci();
} else if (selectedMode == "Membilas") {
membilas();
}
}
}
void bootSystem() {
if (digitalRead(buttonPin) == LOW) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Booting...");
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
delay(500);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Boot Selesai!");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Masukkan PIN:");
isBooted = true;
}
}
void authenticateUser() {
char key = keypad.getKey();
if (key) {
if (key == '#') {
if (enteredPIN == correctPIN) {
isAuthenticated = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PIN Benar!");
delay(2000);
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PIN Salah!");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Masukkan PIN:");
}
enteredPIN = "";
} else if (key == '*') {
enteredPIN = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Masukkan PIN:");
} else {
enteredPIN += key;
lcd.setCursor(0, 1);
lcd.print(enteredPIN);
}
}
}
void selectMode() {
if (digitalRead(cuciButtonPin) == LOW) {
selectedMode = "Mencuci";
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
isModeSelected = true;
}
if (digitalRead(bilasButtonPin) == LOW) {
selectedMode = "Membilas";
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
isModeSelected = true;
}
if (digitalRead(backButtonPin) == LOW) {
isModeSelected = false;
selectedMode = "";
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
}
if (!isModeSelected) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tekan tombol untuk");
lcd.setCursor(0, 1);
lcd.print("Pilih mode:");
}
}
void mencuci() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pompa Air ON...");
pompaAir.write(90); // Nyalakan pompa air (servo ke posisi 90 derajat)
// Mengukur jarak air dengan sensor ultrasonik
distance = ultrasonic.read();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Jarak Air: ");
lcd.print(distance);
lcd.print(" cm");
// Jika jarak kurang dari 10 cm, matikan pompa
if (distance <= distanceThreshold) {
pompaAir.write(0); // Matikan pompa air
}
// Gerakkan stepper motor untuk memulai mesin cuci
lcd.setCursor(0, 1);
lcd.print("Mesin Cuci ON...");
stepper.step(stepsPerRevolution);
// Membaca berat cucian dari sensor
weight = scale.get_units(10); // Ambil rata-rata 10 pembacaan
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Berat: ");
lcd.print(weight);
lcd.print(" kg");
// Jika berat melebihi 10 kg
if (weight > weightThreshold) {
digitalWrite(buzzer, HIGH); // Nyalakan buzzer
digitalWrite(led3, HIGH); // Nyalakan LED merah
stepper.step(0); // Hentikan mesin cuci
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Berat Terlalu Berat!");
delay(3000); // Tampilkan pesan selama 3 detik
digitalWrite(buzzer, LOW); // Matikan buzzer
digitalWrite(led3, LOW); // Matikan LED merah
isModeSelected = false; // Kembali ke pemilihan mode
}
}
void membilas() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Proses Membilas...");
stepper.step(stepsPerRevolution * 10); // Mesin cuci berputar selama 10 detik
isModeSelected = false; // Kembali ke pemilihan mode setelah selesai
}