#include <HX711.h> // Library HX711
#include <ESP32Servo.h> // Servo khusus ESP32
#include <LiquidCrystal_I2C.h> // LCD I2C
// Definisi Pin (sesuai konfigurasi baru kamu)
#define HX711_DOUT 21 // HX711 Data Out → GPIO 21
#define HX711_CLK 22 // HX711 Clock → GPIO 22
#define PROXIMITY_PIN 19 // Tombol Proximity / Deteksi barang
#define SERVO_PIN 18 // Servo PWM
// Objek
HX711 scale;
Servo myservo;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C default 0x27
// Variabel
float calibration_factor = 0.00035; // Untuk simulasi Wokwi (kalibrasi ulang di real)
int counter = 0;
unsigned long lastDetection = 0;
void setup() {
Serial.begin(115200);
delay(200);
// Inisialisasi HX711
scale.begin(HX711_DOUT, HX711_CLK);
scale.set_scale(calibration_factor);
scale.tare(20); // Nol-kan
// Inisialisasi LCD I2C (pin SDA=4, SCL=15)
// Catatan: Library LiquidCrystal_I2C default pakai Wire (I2C default 21/22)
// Karena kita ganti ke 4/15, kita harus set custom Wire!
Wire.begin(4, 15); // SDA = GPIO4, SCL = GPIO15
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SISTEM SIAP!");
lcd.setCursor(0, 1);
lcd.print("Total: 0 Tunggu");
// Proximity
pinMode(PROXIMITY_PIN, INPUT_PULLUP);
// Servo
myservo.attach(SERVO_PIN);
myservo.write(90);
Serial.println("Sistem siap! Geser slider berat HX711, tekan tombol proximity untuk tes.");
}
void loop() {
if (digitalRead(PROXIMITY_PIN) == LOW && (millis() - lastDetection > 2000)) {
lastDetection = millis();
Serial.println("Barang terdeteksi!");
float berat = scale.get_units(10);
if (berat < 0) berat = 0;
Serial.print("Berat: ");
Serial.print(berat, 1);
Serial.println(" gram");
counter++;
Serial.print("Total barang: ");
Serial.println(counter);
// Update LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Berat: ");
lcd.print(berat, 1);
lcd.print("g");
lcd.setCursor(0, 1);
lcd.print("Total: ");
lcd.print(counter);
// Pilah servo
String kategori = "";
if (berat < 150) {
myservo.write(0);
Serial.println("→ BIN RINGAN (0°)");
kategori = "RINGAN";
} else if (berat < 400) {
myservo.write(90);
Serial.println("→ BIN SEDANG (90°)");
kategori = "SEDANG";
} else {
myservo.write(180);
Serial.println("→ BIN BERAT (180°)");
kategori = "BERAT ";
}
lcd.setCursor(10, 1);
lcd.print(kategori);
delay(3000);
myservo.write(90);
Serial.println("Servo netral (90°)");
// Standby LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SISTEM SIAP!");
lcd.setCursor(0, 1);
lcd.print("Total: ");
lcd.print(counter);
lcd.print(" Tunggu");
}
delay(100);
}