#include <HX711.h>
#include <ESP32Servo.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// --- Konstanta Pin ---
#define TRIG_PIN 26 // GPIO untuk Trigger HC-SR04
#define ECHO_PIN 25 // GPIO uAntuk Echo HC-SR04
#define SERVO_PIN 13 // GPIO PWM untuk Servo
#define HX711_DT 33 // GPIO untuk Data HX711
#define HX711_SCK 32 // GPIO untuk Clock HX711
#define OLED_SDA 21 // GPIO SDA OLED (I2C)
#define OLED_SCL 22 // GPIO SCL OLED (I2C)
// --- OLED Display ---
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// --- Objek ---
HX711 scale;
Servo servo;
const float calibration_factor = 7050.0; // Kalibrasi load cell
const float harga_per_kg = 3000.0; // Harga per kilogram
float berat = 0;
float rupiah = 0;
long duration;
float distance;
void setup() {
Serial.begin(115200);
Serial.println("Inisialisasi sistem...");
// --- Inisialisasi Servo ---
servo.attach(SERVO_PIN);
servo.write(0); // Tutup di awal
// --- Inisialisasi Load Cell ---
scale.begin(HX711_DT, HX711_SCK);
scale.set_scale(calibration_factor);
scale.tare(); // Reset ke 0
// --- Inisialisasi Sensor Ultrasonik ---
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// --- Inisialisasi I2C untuk OLED khusus ESP32 ---
Wire.begin(OLED_SDA, OLED_SCL);
// --- Inisialisasi OLED ---
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Alamat I2C 0x3C
Serial.println("Gagal inisialisasi OLED");
while (true);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Sistem Siap!");
display.display();
delay(1000);
}
void loop() {
// --- Baca Berat ---
berat = scale.get_units();
if (berat < 0) berat = 0;
// --- Baca Jarak ---
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2;
// --- Hitung Total Harga ---
rupiah = berat * harga_per_kg;
// --- Tampilan OLED ---
display.clearDisplay();
display.setCursor(0, 0);
if (berat >= 1.0) {
display.println("Berat:");
display.print(berat, 2); display.println(" kg");
display.println("Harga:");
display.print("Rp "); display.println((long)rupiah);
servo.write(90); // Buka
} else {
display.println("Tunggu Sampah...");
display.print("Jarak: ");
display.print(distance, 0); display.println(" cm");
servo.write(0); // Tutup
}
display.display();
// --- Debug Monitor Serial ---
Serial.print("Berat: "); Serial.print(berat); Serial.print(" kg | ");
Serial.print("Jarak: "); Serial.print(distance); Serial.print(" cm | ");
Serial.print("Rp: "); Serial.println(rupiah);
delay(500);
}