#include "HX711.h"
#include <ESP32Servo.h>
#define PIN_ULTRASOUND_TRIG 26
#define PIN_ULTRASOUND_ECHO 25
#define PIN_LED_FOOD 19
#define PIN_POTENTIOMETER 34
#define PIN_LED_WATER 18
#define HX711_DT 5
#define HX711_SCK 4
#define SERVO_PIN 23
HX711 balanza;
Servo servo;
bool servoAbierto = false;
void setup() {
Serial.begin(115200);
pinMode(PIN_ULTRASOUND_TRIG, OUTPUT);
pinMode(PIN_ULTRASOUND_ECHO, INPUT);
pinMode(PIN_LED_FOOD, OUTPUT);
pinMode(PIN_LED_WATER, OUTPUT);
// Balanza
balanza.begin(HX711_DT, HX711_SCK);
balanza.set_scale();
balanza.tare();
// Servo
servo.attach(SERVO_PIN);
servo.write(0); // posición inicial (cerrado)
Serial.println("Inicializando...");
}
void loop() {
long duration;
float distance;
int nivel;
float peso;
// --- Ultrasonido ---
digitalWrite(PIN_ULTRASOUND_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_ULTRASOUND_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_ULTRASOUND_TRIG, LOW);
duration = pulseIn(PIN_ULTRASOUND_ECHO, HIGH, 30000); // timeout de 30 ms
if (duration > 0) {
distance = duration * 0.034 / 2;
if (distance > 50) {
digitalWrite(PIN_LED_FOOD, HIGH);
Serial.println("Rellenar comedero!!!");
} else {
digitalWrite(PIN_LED_FOOD, LOW);
Serial.println("Comida ok");
}
}
// --- Nivel de agua ---
nivel = analogRead(PIN_POTENTIOMETER);
if (nivel < 1500) {
digitalWrite(PIN_LED_WATER, HIGH);
Serial.println("Rellenar agua!!!");
} else {
digitalWrite(PIN_LED_WATER, LOW);
Serial.println("Agua ok");
}
// --- Peso y control del servo ---
if (balanza.is_ready()) {
peso = balanza.get_units(5);
if (peso <= 100) {
if(!servoAbierto){
servo.write(25); // mover 25 grados
servoAbierto = true;
}
Serial.println("Servo ABIERTO");
}
else{
if(servoAbierto){
servo.write(0); // volver a posición inicial
servoAbierto = false;
}
Serial.println("Servo CERRADO");
}
}
else {
Serial.println("HX711 no está listo");
}
delay(500);
}