#include <ESP32Servo.h>
#include <HX711.h>
// === Pin ===
#define LDR_PIN 34 // Pin analog untuk LDR
#define SERVO_PIN 32 // Pin sinyal Servo
#define HX711_DOUT 16 // Pin data HX711
#define HX711_SCK 4 // Pin clock HX711
// === Objek ===
HX711 scale;
Servo myServo;
// === Variabel Global ===
int threshold = 1000; // Ambang batas intensitas cahaya
int servoPos = 90; // Posisi awal servo
unsigned long lastKirimTime = 0;
const unsigned long intervalKirim = 3000; // Kirim data berat tiap 3 detik
unsigned long lastLdrChangeTime = 0;
const unsigned long kembalikanServoDelay = 0; // Kembali ke 90 derajat setelah 5 detik
// === Setup ===
void setup() {
Serial.begin(115200);
myServo.attach(SERVO_PIN);
myServo.write(servoPos); // Posisi default 90 derajat
Serial.println("ESP32 Weight Sensor");
// Inisialisasi HX711
scale.begin(HX711_DOUT, HX711_SCK);
scale.set_scale(); // ganti sesuai hasil kalibrasi
scale.tare(); // nolkan timbangan
Serial.println("HX711 Ready");
}
// === Fungsi tampilkan berat ===
void tampilkanBerat() {
if (scale.is_ready()) {
unsigned int ADC = scale.get_units();
float weight = float(ADC) / 2100.00 * 5.00; // Rumus kalibrasi manual
Serial.print("ADC = ");
Serial.print(ADC);
Serial.print(" Berat = ");
Serial.print(weight, 2);
Serial.println(" kg");
} else {
Serial.println("HX711 tidak siap.");
}
}
// === Fungsi kirim data berat ===
void kirimDataBerat() {
if (scale.is_ready()) {
unsigned int ADC = scale.get_units();
float weight = float(ADC) / 2100.00 * 5.00;
Serial.print("[KIRIM DATA] Berat terkirim: ");
Serial.print(weight, 2);
Serial.println(" kg");
} else {
Serial.println("[KIRIM DATA] HX711 tidak siap.");
}
}
// === Loop utama ===
void loop() {
int ldrValue = analogRead(LDR_PIN);
Serial.print("Nilai LDR: ");
Serial.println(ldrValue);
// Cek kondisi cahaya dan ubah posisi servo
if (ldrValue > threshold) {
if (servoPos != 135) {
servoPos = 135;
myServo.write(servoPos);
Serial.println("Cahaya Terang: Servo ke 135 derajat");
tampilkanBerat();
lastLdrChangeTime = millis();
}
} else {
if (servoPos != 45) {
servoPos = 45;
myServo.write(servoPos);
Serial.println("Cahaya Gelap: Servo ke 45 derajat");
tampilkanBerat();
lastLdrChangeTime = millis();
}
}
// Setelah 5 detik tanpa perubahan kondisi, kembalikan servo ke 90 derajat
if ((millis() - lastLdrChangeTime >= kembalikanServoDelay) && servoPos != 90) {
servoPos = 90;
myServo.write(servoPos);
Serial.println("Servo kembali ke posisi 90 derajat (diam).");
}
// Kirim berat setiap 3 detik
if (millis() - lastKirimTime >= intervalKirim) {
kirimDataBerat();
lastKirimTime = millis();
}
delay(500); // delay pendek
}