#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "HX711.h"
#include <Servo.h>
// LCD I2C (alamat umum 0x27, 16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// HX711 Load Cell
#define DOUT PA2
#define CLK PA3
HX711 scale;
// Ultrasonik
#define TRIG_PIN PA8
#define ECHO_PIN PA9
// PIR
#define PIR_PIN PA1
// Buzzer aktif LOW
#define BUZZER_PIN PA0
// Servo
Servo conveyorServo;
#define SERVO_PIN PB10
// LCD I2C pins
#define SDA_PIN PB7
#define SCL_PIN PB6
int botolCount = 0;
float beratMin = 1.0; // Gram
float beratMax = 2.0; // Gram
void setup() {
Serial.begin(9600);
// Inisialisasi I2C
Wire.begin(SDA_PIN, SCL_PIN);
lcd.init();
lcd.backlight();
// Pin setup
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, HIGH); // buzzer OFF (aktif LOW)
conveyorServo.attach(SERVO_PIN);
conveyorServo.write(0); // Posisi awal servo
scale.begin(DOUT, CLK);
scale.set_scale(); // Kalibrasi jika perlu
scale.tare(); // Nol-kan beban
lcd.setCursor(0, 0);
lcd.print("Sistem Siap...");
delay(1000);
lcd.clear();
}
void loop() {
// Cek keberadaan botol dengan ultrasonik
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
if (distance < 10.0) {
botolCount++;
lcd.setCursor(0, 0);
lcd.print("Botol ke-");
lcd.print(botolCount);
Serial.print("Botol ke-"); Serial.println(botolCount);
delay(1000); // Beri waktu botol diam di atas load cell
// Baca berat botol
float berat = scale.get_units(10);
Serial.print("Berat: "); Serial.println(berat);
lcd.setCursor(0, 1);
lcd.print("Berat: ");
lcd.print(berat, 1);
lcd.print("g "); // spacing supaya rapi
if (berat < beratMin || berat > beratMax) {
// Berat tidak sesuai
digitalWrite(BUZZER_PIN, LOW); // Buzzer ON (aktif LOW)
lcd.setCursor(0, 1);
lcd.print("Berat TIDAK OK ");
Serial.println("Berat tidak sesuai!");
delay(2000);
digitalWrite(BUZZER_PIN, HIGH); // Buzzer OFF
} else {
// Berat sesuai
int pirStatus = digitalRead(PIR_PIN);
if (pirStatus == HIGH) {
lcd.setCursor(0, 1);
lcd.print("Berat OK. Kirim ");
conveyorServo.write(90);
delay(1500);
conveyorServo.write(0);
} else {
lcd.setCursor(0, 1);
lcd.print("Tunggu PIR... ");
}
}
delay(1000);
lcd.clear();
}
}