#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "HX711.h"
// === PIN DEFINISI ===
#define PIR_PIN PA0
#define POT_PIN PA1
#define RELAY_INLET PA2
#define RELAY_MOTOR PA3
#define RELAY_OUTLET PA4
#define RGB_RED PB0
#define RGB_GREEN PB1
#define RGB_BLUE PB10
#define BUZZER_PIN PA5
#define HX711_DT PB12
#define HX711_SCK PB13
// === OBJEK ===
LiquidCrystal_I2C lcd(0x27, 16, 2);
HX711 scale;
// === VARIABEL ===
float berat = 0;
int harga = 0;
bool proses_aktif = false;
bool sudah_selesai = false;
void setRGB(bool r, bool g, bool b) {
digitalWrite(RGB_RED, r);
digitalWrite(RGB_GREEN, g);
digitalWrite(RGB_BLUE, b);
}
void setup() {
Serial.begin(9600);
Serial.println("Laundry Otomatis Siap...");
// Inisialisasi pin
pinMode(PIR_PIN, INPUT);
pinMode(RELAY_INLET, OUTPUT);
pinMode(RELAY_MOTOR, OUTPUT);
pinMode(RELAY_OUTLET, OUTPUT);
pinMode(RGB_RED, OUTPUT);
pinMode(RGB_GREEN, OUTPUT);
pinMode(RGB_BLUE, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Inisialisasi I2C dengan pin PB7 (SDA) dan PB6 (SCL)
Wire.begin(PB7, PB6);
lcd.begin(16, 2);
lcd.backlight();
// Inisialisasi timbangan
scale.begin(HX711_DT, HX711_SCK);
scale.set_scale(420.f); // Sesuaikan dengan kalibrasi
scale.tare();
setRGB(0, 0, 1); // biru: standby
lcd.setCursor(0, 0);
lcd.print("Laundry Siap");
}
void prosesLaundry() {
proses_aktif = true;
berat = scale.get_units(5);
harga = berat * 10000;
Serial.println("== Proses Laundry Dimulai ==");
Serial.print("Berat: ");
Serial.println(berat);
Serial.print("Harga: Rp");
Serial.println(harga);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Berat: ");
lcd.print(berat, 1);
lcd.print(" kg");
lcd.setCursor(0, 1);
lcd.print("Harga: Rp");
lcd.print(harga);
delay(3000);
// === MASUKKAN AIR ===
setRGB(0, 0, 1);
lcd.clear();
lcd.print("Mengisi air...");
int pot = analogRead(POT_PIN);
int durasiAir = map(pot, 0, 4095, 1000, 10000) * 2;
Serial.print("Durasi air: ");
Serial.println(durasiAir);
digitalWrite(RELAY_INLET, HIGH);
delay(durasiAir);
digitalWrite(RELAY_INLET, LOW);
// === MENCUCI ===
setRGB(1, 0, 0); // merah: proses
lcd.clear();
lcd.print("Mencuci...");
digitalWrite(RELAY_MOTOR, HIGH);
delay(3000); // simulasi 3 detik
digitalWrite(RELAY_MOTOR, LOW);
// === OUTLET (TUNGGU 5 DETIK) ===
delay(5000);
lcd.clear();
lcd.print("Buang air...");
digitalWrite(RELAY_OUTLET, HIGH);
delay(3000);
digitalWrite(RELAY_OUTLET, LOW);
// === SELESAI ===
setRGB(0, 1, 0); // hijau: selesai
lcd.clear();
lcd.print("Cuci selesai!");
digitalWrite(BUZZER_PIN, HIGH);
delay(1000);
digitalWrite(BUZZER_PIN, LOW);
sudah_selesai = true;
proses_aktif = false;
scale.tare();
}
void loop() {
berat = scale.get_units(3);
Serial.print("Berat sekarang: ");
Serial.println(berat);
int pirStatus = digitalRead(PIR_PIN);
if (!proses_aktif && !sudah_selesai) {
lcd.setCursor(0, 0);
lcd.print("Timbang & Hadir");
lcd.setCursor(0, 1);
lcd.print("Berat: ");
lcd.print(berat, 1);
lcd.print(" kg ");
if (pirStatus == HIGH && berat > 0.05) {
prosesLaundry();
}
setRGB(0, 0, 1); // standby biru
}
// Reset sistem setelah kain diambil
if (sudah_selesai && berat < 0.05) {
sudah_selesai = false;
lcd.clear();
lcd.print("Laundry Siap");
setRGB(0, 0, 1);
Serial.println("Reset sistem. Tunggu pelanggan baru...");
}
delay(200);
}
Loading
stm32-bluepill
stm32-bluepill