#include <ESP32Servo.h>
#include <HX711.h>
// Définition des broches
#define TRIG_PIN 5
#define ECHO_PIN 18
#define SERVO_PIN 19
#define HX711_DT 25
#define HX711_SCK 26
#define LED_GREEN 16
#define BUZZER 21
// Initialisation des objets
Servo servo;
HX711 scale;
// Variables globales
const float WEIGHT_EMPTY_THRESHOLD = 10.0; // Poids minimum pour considérer le réservoir vide
const float WEIGHT_FULL_THRESHOLD = 100.0; // Poids pour considérer le réservoir plein
const int DISTANCE_THRESHOLD = 20; // Distance en cm pour détecter la présence de l'animal
const int FEED_DELAY = 3000; // Durée d'ouverture du servo pour distribuer la nourriture (en millisecondes)
const int FEED_COOLDOWN = 60000; // Temps d'attente (en millisecondes) avant une nouvelle distribution
const unsigned long DETECTION_DURATION = 10000; // Durée de détection en millisecondes (10 secondes)
unsigned long lastFeedTime = 0; // Timestamp de la dernière distribution
unsigned long detectionStartTime = 0; // Temps de début de la fenêtre de détection
int detectionCount = 0; // Compteur de détections
void setup() {
Serial.begin(115200);
// Configuration des broches
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(BUZZER, OUTPUT);
// Initialisation du servo
servo.attach(SERVO_PIN);
servo.write(0); // Position fermée
// Initialisation du capteur de poids
scale.begin(HX711_DT, HX711_SCK);
scale.set_scale(); // Calibrer selon votre capteur
scale.tare(); // Mettre à zéro le capteur
}
void loop() {
float distance = measureDistance();
float weight = scale.get_units();
// Gestion du capteur de poids
if (weight < WEIGHT_EMPTY_THRESHOLD) {
digitalWrite(LED_GREEN, LOW); // Éteindre la LED si le réservoir est vide
play_tone(1000, 500); // Jouer une tonalité si le réservoir est vide
Serial.println("Réservoir vide. Veuillez le remplir.");
} else if (weight > WEIGHT_FULL_THRESHOLD) {
digitalWrite(LED_GREEN, HIGH); // Allumer la LED si le réservoir est plein
Serial.println("Réservoir plein.");
} else {
digitalWrite(LED_GREEN, HIGH); // Allumer la LED si le réservoir contient encore de la nourriture
Serial.println("Réservoir partiellement rempli.");
}
// Détection de l'animal et distribution de nourriture
if (distance < DISTANCE_THRESHOLD && millis() - lastFeedTime > FEED_COOLDOWN) {
Serial.println("Animal détecté, distribution de nourriture...");
distributeFood();
lastFeedTime = millis();
}
delay(5000); // Pause pour éviter des mesures trop fréquentes
}
float measureDistance() {
// Envoi d'une impulsion
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(20);
digitalWrite(TRIG_PIN, LOW);
// Lecture de la durée de l'écho
long duration = pulseIn(ECHO_PIN, HIGH);
// Calcul de la distance
float distance = (duration * 0.034) / 2;
return distance;
}
void distributeFood() {
servo.write(90); // Ouvrir le servo
delay(FEED_DELAY);
servo.write(0); // Fermer le servo
}
void play_tone(uint16_t frequency, uint16_t duration_ms) {
int period = 1000000 / frequency; // Période en microsecondes
int half_period = period / 2; // Demi-période pour le rapport cyclique 50%
unsigned long startTime = millis();
while (millis() - startTime < duration_ms) {
digitalWrite(BUZZER, HIGH); // Activer le buzzer
delayMicroseconds(half_period);
digitalWrite(BUZZER, LOW); // Désactiver le buzzer
delayMicroseconds(half_period);
}
}