#include "HX711.h"
// Pines del sensor ultrasonido HC-SR04 para detectar a la mascota
#define PIN_TRIG_MASCOTA 12
#define PIN_ECHO_MASCOTA 14
// Pines del sensor ultrasonido HC-SR04 para detectar la comida en la tolva
#define PIN_TRIG_COMIDA 33
#define PIN_ECHO_COMIDA 32
// Pines para el sensor de peso HX711 de 50 kg (para pesar la mascota)
#define PIN_DT_20 23
#define PIN_SCK_20 22
// Pines para el sensor de peso HX711 de 5 kg (para pesar la comida)
#define PIN_DT_5 17
#define PIN_SCK_5 16
// Pines para controlar el motor
#define PIN_DIR_MOTOR 18
#define PIN_STEP_MOTOR 19
// Pin para el buzzer
#define PIN_BUZZER 21
// Crear objetos para las balanzas
HX711 balanzaMascota;
HX711 balanzaComida;
void setup() {
// Inicializar comunicación serial
Serial.begin(115200);
// Configuración del sensor HC-SR04 para detectar a la mascota
pinMode(PIN_TRIG_MASCOTA, OUTPUT);
pinMode(PIN_ECHO_MASCOTA, INPUT);
// Configuración del sensor HC-SR04 para detectar comida en la tolva
pinMode(PIN_TRIG_COMIDA, OUTPUT);
pinMode(PIN_ECHO_COMIDA, INPUT);
// Configuración de la balanza para la mascota (sensor HX711 de 50 kg)
balanzaMascota.begin(PIN_DT_20, PIN_SCK_20); // Inicializar el HX711
balanzaMascota.set_scale(420); // Ajustar el factor de escala (según calibración)
balanzaMascota.tare(); // Poner a cero la balanza
// Configuración de la balanza para la comida (sensor HX711 de 5 kg)
balanzaComida.begin(PIN_DT_5, PIN_SCK_5);
balanzaComida.set_scale(0.42);
balanzaComida.tare();
// Configuración de los pines de control del motor
pinMode(PIN_STEP_MOTOR, OUTPUT);
pinMode(PIN_DIR_MOTOR, OUTPUT);
// Configuración del pin del buzzer
pinMode(PIN_BUZZER, OUTPUT);
}
void loop() {
// Verificar si hay datos disponibles en la consola serial
if (Serial.available() > 0) {
char command = Serial.read(); // Leer el comando de la consola
// Ejecutar la función correspondiente según el comando recibido
switch (command) {
case '1': pesarMascota(); break; // Pesar a la mascota
case '2': pesarComida(); break; // Pesar la comida
case '3': comidaTolva(); break; // Medir la distancia de la comida en la tolva
case '4': motor(); sonarBuzzer(); break; // Girar el motor y activar el buzzer
}
}
// Comprobar constantemente si la mascota se encuentra cerca del sensor
detectarMascota();
delay(100); // Pausa para evitar sobrecarga de procesos
}
void pesarMascota() {
// Leer el peso actual de la mascota usando la balanza configurada para ello
float peso = balanzaMascota.get_units();
Serial.print("Peso de la mascota: ");
Serial.print(peso);
Serial.println(" kg");
}
void pesarComida() {
// Leer el peso actual de la comida usando la balanza configurada para ello
float peso = balanzaComida.get_units();
Serial.print("Peso de la comida: ");
Serial.print(peso);
Serial.println(" g");
}
void detectarMascota() {
// Iniciar una nueva medición de distancia con el sensor ultrasonido de la mascota
digitalWrite(PIN_TRIG_MASCOTA, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG_MASCOTA, LOW);
// Leer la duración del pulso, y calcular la distancia (en cm) a partir del tiempo de viaje
int duration = pulseIn(PIN_ECHO_MASCOTA, HIGH);
int distance = duration / 58;
if (distance < 20) { // Verifica si la mascota está dentro de 20 cm
Serial.println("La mascota se ha acercado");
}
}
void comidaTolva() {
// Iniciar una nueva medición de distancia con el sensor ultrasonido de la comida
digitalWrite(PIN_TRIG_COMIDA, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG_COMIDA, LOW);
// Leer la duración del pulso y calcular la distancia a la comida en la tolva
int duration = pulseIn(PIN_ECHO_COMIDA, HIGH);
int distance = duration / 58;
Serial.print("Distancia a la comida de la tolva: ");
Serial.print(distance);
Serial.println(" cm");
}
void motor() {
// Girar el motor en sentido horario para distribuir la comida
Serial.println("Giro en sentido horario");
digitalWrite(PIN_DIR_MOTOR, LOW); // Establecer la dirección de giro
// Realizar 200 pasos para completar una vuelta (ajustar según el motor)
for (int i = 0; i < 200; i++) {
digitalWrite(PIN_STEP_MOTOR, HIGH);
delayMicroseconds(1000); // Control de velocidad del motor
digitalWrite(PIN_STEP_MOTOR, LOW);
delayMicroseconds(1000);
}
delay(1000); // Pausa después del giro del motor
}
void sonarBuzzer() {
// Activar el buzzer después de girar el motor como notificación
Serial.println("Buzzer activado");
digitalWrite(PIN_BUZZER, HIGH); // Activar el buzzer
delay(500); // Mantener el sonido durante medio segundo
digitalWrite(PIN_BUZZER, LOW); // Apagar el buzzer
}