#include <HX711.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi HX711
#define DOUT 2
#define CLK 3
HX711 scale;
// Inisialisasi PIR dan Relay
#define RELAY1 11
#define RELAY2 10
#define RELAY3 9
#define PIR2_PIN 8
// Inisialisasi LDR dan Potensio
#define LDR1 A0
#define LDR2 A1
#define LDR3 A2
#define POT A6
#define PIN_TRIG 4
#define PIN_ECHO 5
LiquidCrystal_I2C lcd(0x27, 16, 2);
float calibration_factor = 420;
bool waitingForStable = false;
bool systemActivated = false;
bool pintuTerbuka = false;
bool itemDetected = false;
bool waitingHidden = false;
unsigned long hiddenWaitStart = 0;
unsigned long itemStartTime = 0;
unsigned long lastUpdateTime = 0;
float weight = 0;
float nominal = 0;
float volume = 0;
float ratioMinyak = 0;
float ratioNonMinyak = 0;
int ldr1 = 0;
int ldr2 = 0;
int ldr3 = 0;
String listQR[] = {
"13052003-afin",
"15072000-fira"
};
int jumlahQR = 2;
void setup() {
Serial.begin(9600);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0); lcd.print("Memulai Sistem");
lcd.setCursor(0, 1); lcd.print("Mohon tunggu...");
// Inisialisasi HX711
scale.begin(DOUT, CLK);
scale.set_scale(calibration_factor);
scale.tare(-471.497); // set nol
// Inisialisasi PIR & Relay
pinMode(PIR2_PIN, INPUT);
pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); pinMode(RELAY3, OUTPUT);
digitalWrite(RELAY1, LOW); digitalWrite(RELAY2, LOW); digitalWrite(RELAY3, LOW);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(LDR1, INPUT); pinMode(LDR2, INPUT); pinMode(LDR3, INPUT);
pinMode(POT, INPUT);
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Scan QR Anda!");
delay(1000);
}
void loop() {
//Nunggu QR
if (!systemActivated) {
bool qrValid = scanQR(); // tunggu sampai QR valid
if (qrValid) {
systemActivated = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Scan berhasil!");
lcd.setCursor(0, 1);
lcd.print("Buka pintu...");
digitalWrite(RELAY1, HIGH); // buka kunci pintu
delay(1000);
}
}
//Pintu kebuka
if (systemActivated && !pintuTerbuka && digitalRead(PIR2_PIN) == HIGH) {
pintuTerbuka = true;
digitalWrite(RELAY1, LOW);
delay(1500);
}
//Proses deteksi ada minyak tertuang
if (systemActivated && pintuTerbuka && !itemDetected && !waitingHidden && !waitingForStable) {
weight = scale.get_units(10);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Timbang: ");
lcd.print(weight, 2);
lcd.print(" kg ");
//Jika ada minyak tertuang
if (weight > 0.1) {
itemDetected = true;
waitingForStable = true;
itemStartTime = millis();
lastUpdateTime = millis();
// waitingHidden = true;
// hiddenWaitStart = millis();
// lcd.clear();
// lcd.setCursor(0, 0);
// lcd.print("Sedang menimbang");
// lcd.setCursor(0, 1);
// lcd.print("Mohon tunggu");
}
}
// //Nunggu stabil
// if (waitingHidden && (millis() - hiddenWaitStart >= 15000)) {
// waitingHidden = false;
// lcd.clear();
// lcd.setCursor(0, 0);
// lcd.print("Menunggu stabil");
// }
//Proses nunggu stabil 30 detik
if (waitingForStable) {
unsigned long currentMillis = millis();
if (currentMillis - lastUpdateTime >= 1000) {
lastUpdateTime = currentMillis;
weight = scale.get_units(10);
int potValue = analogRead(POT);
ratioMinyak = (potValue / 1023.0) * 100.0;
ratioNonMinyak = 100.0 - ratioMinyak;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Berat: ");
lcd.print(weight, 2);
lcd.print(" kg");
lcd.setCursor(0, 1);
lcd.print("Minyak:");
lcd.print(ratioMinyak, 0);
lcd.print("% ");
//Nampilin 15s di LCD
unsigned long remaining = 30 - ((currentMillis - itemStartTime) / 1000);
if (remaining > 30) remaining = 0;
// lcd.setCursor(0, 2); lcd.print(remaining, 1);
if (currentMillis - itemStartTime >= 30000) {
waitingForStable = false;
tampilkanInformasi();
pompaNonMinyak();
pompaMinyak();
}
}
}
}
bool scanQR() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Scan QR Anda!");
Serial.println("Scan QR Anda!");
while (true) {
if (Serial.available() > 0) {
String qr = Serial.readStringUntil('\n');
qr.trim();
for (int i = 0; i < jumlahQR; i++) {
if (qr == listQR[i]) {
Serial.println("QR Valid: " + qr);
return true;
}
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("QR tidak valid");
lcd.setCursor(0, 1);
lcd.print("Coba lagi!");
Serial.println("QR TIDAK VALID!");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Scan QR Anda!");
Serial.println("Masukkan QR:");
}
}
}
void tampilkanInformasi() {
weight = scale.get_units(10);
volume = weight / 0.933;
nominal = volume * 6000 * (ratioMinyak / 100.0);
unsigned long tampilStart = millis();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Berat: ");
lcd.print(weight, 2);
lcd.print(" kg ");
lcd.setCursor(0, 1); lcd.print("Vol:"); lcd.print(volume, 2); lcd.print("L");
lcd.setCursor(0, 2); lcd.print("Rp"); lcd.print(nominal, 0);
ldr1 = analogRead(LDR1); ldr2 = analogRead(LDR2); ldr3 = analogRead(LDR3);
if(ldr1 >= 8 && ldr1 <= 300 && ldr2 >= 8 && ldr2 <= 300 && ldr3 >= 8 && ldr3 <= 300){
Serial.print("Jernih");
}
if(ldr1 >= 301 && ldr1 <= 700 && ldr2 >= 301 && ldr2 <= 700 && ldr3 >= 301 && ldr3 <= 700){
Serial.print("Keruh");
}
if(ldr1 >= 701 && ldr1 <= 1016 && ldr2 >= 701 && ldr2 <= 1016 && ldr3 >= 701 && ldr3 <= 1016){
Serial.print("Kotor");
}
while (millis() - tampilStart < 15000) {
delay(50);
}
}
void pompaMinyak() {
bool memompa = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Mohon tunggu...");
while (memompa) {
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
int duration = pulseIn(PIN_ECHO, HIGH, 30000);
float distance = duration / 58.0;
if (distance < 100) {
digitalWrite(RELAY2, HIGH);
} else {
digitalWrite(RELAY2, LOW);
memompa = false;
}
delay(500);
}
lcd.clear();
delay(1000);
systemActivated = false;
itemDetected = false;
waitingHidden = false;
waitingForStable = false;
pintuTerbuka = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Scan QR Anda!");
}
void pompaNonMinyak(){
bool memompaNonMinyak = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Mohon tunggu..");
while (memompaNonMinyak) {
int potValue = analogRead(POT);
if (potValue <= 1020) {
digitalWrite(RELAY3, HIGH);
} else {
digitalWrite(RELAY3, LOW);
memompaNonMinyak = false;
}
Serial.println(potValue);
delay(500);
}
}