#include <HX711.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
// HX711
#define DT 4
#define SCK 5
HX711 scale;
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Servo
Servo myServo;
// LEDs + bouton
#define LED_GREEN 25
#define LED_RED 26
#define BUTTON 14
// Etat servo
bool isHeavy = false;
void setup() {
Serial.begin(115200);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
scale.begin(DT, SCK);
// π IMPORTANT pour Wokwi
scale.set_scale(1);
scale.tare();
lcd.init();
lcd.backlight();
myServo.setPeriodHertz(50);
myServo.attach(18, 500, 2400);
myServo.write(0); // position initiale
lcd.setCursor(0, 0);
lcd.print("System Ready");
delay(1500);
lcd.clear();
}
void loop() {
// π Lecture directe en KG
float weightKg = scale.get_units(5);
if (weightKg < 0) weightKg = 0;
Serial.print("Poids: ");
Serial.println(weightKg, 2);
// π Affichage propre
lcd.setCursor(0, 0);
lcd.print("Poids: ");
lcd.print(weightKg, 2);
lcd.print(" kg ");
lcd.setCursor(0, 1);
// π― SEUIL (tu peux changer)
float seuil = 2.0; // 2 kg
if (weightKg >= seuil && !isHeavy) {
// π devient lourd
isHeavy = true;
lcd.print("Lourd ");
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_RED, HIGH);
myServo.write(90); // SORT
}
else if (weightKg < seuil && isHeavy) {
// π redevient lΓ©ger
isHeavy = false;
lcd.print("Leger ");
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_RED, LOW);
myServo.write(0); // RENTRE
}
// π Bouton = TARE
if (digitalRead(BUTTON) == LOW) {
lcd.setCursor(0, 1);
lcd.print("Tare... ");
scale.tare();
delay(1500);
lcd.clear();
}
delay(200);
}