#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include "HX711.h"
// Pin configuration
const int trigPin = PA8;
const int echoPin = PA9;
const int buzzerPin = PA2;
const int relayPin = PA3;
const int servoPin = PA4;
const int proximityPin = PA5; // digunakan sebagai sensor logam (aktif: HIGH)
// Load cell pins
#define DT PA6
#define SCK PA7
HX711 scale;
Servo myServo;
LiquidCrystal_I2C lcd(0x27, 16, 2);
long duration;
int distance;
float weight;
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(relayPin, OUTPUT);
pinMode(proximityPin, INPUT);
myServo.attach(servoPin);
myServo.write(90); // posisi awal (tidak menggeser)
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Botol Checker");
lcd.setCursor(0, 1);
lcd.print("Inisialisasi...");
scale.begin(DT, SCK);
delay(2000);
scale.set_scale();
scale.tare(); // mengatur 0
lcd.clear();
}
void loop() {
distance = getDistance();
if (distance < 10) { // botol terdeteksi masuk
digitalWrite(relayPin, HIGH); // aktifkan conveyor
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Botol Terdeteksi");
delay(1000); // waktu botol menuju load cell
digitalWrite(relayPin, LOW); // stop conveyor
delay(1000); // waktu botol diam di atas load cell
weight = scale.get_units(5);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Berat: ");
lcd.print(weight);
lcd.print(" g");
if (weight < 100 || weight > 200) {
lcd.setCursor(0, 1);
lcd.print("Berat Salah!");
myServo.write(0); // geser ke jalur reject
delay(2000);
myServo.write(90); // kembali ke posisi awal
} else {
lcd.setCursor(0, 1);
lcd.print("Berat Sesuai");
}
delay(1500);
// Cek material
int metalDetected = digitalRead(proximityPin);
if (metalDetected == HIGH) {
digitalWrite(buzzerPin, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Material: Logam");
} else {
digitalWrite(buzzerPin, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Material: NonLogam");
}
lcd.setCursor(0, 1);
lcd.print("Sortir selesai");
delay(3000);
lcd.clear();
}
delay(200);
}
int getDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
return duration * 0.034 / 2;
}