#include <Wire.
h>
#include <LiquidCrystal_I2C.h>
// LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Broches
#define TRIG_PIN 9
#define ECHO_PIN 10
#define RELAY_PIN 7
long duree;
float distance;
// Fonction pour mesurer la distance proprement
float prendreMesure() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duree = pulseIn(ECHO_PIN, HIGH, 30000); // Timeout de 30ms
if (duree == 0) {
return 999.0;
} else {
return (duree * 0.034) / 2.0;
void setup()
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
// Relais OFF au démarrage (HIGH pour la plupart des modules relais actifs à l'état bas)
digitalWrite(RELAY_PIN, HIGH);
[Link](9600);
[Link]();
[Link]();
[Link](0, 0);
[Link]("FONTAINE AUTO");
[Link](0, 1);
[Link]("Demarrage...");
delay(2000);
[Link]();
void loop()
// Première mesure
distance = prendreMesure();
// --- FILTRAGE DES FAUSSES ALERTES ---
// Si on détecte quelque chose à moins de 8cm, on revérifie 50ms plus tard
// pour être sûr que ce n'est pas un parasite électrique ou une goutte d'eau.
if (distance <= 8) {
delay(50);
distance = prendreMesure();
// Affichage de la distance validée
[Link]("Distance : ");
[Link](distance);
[Link](" cm");
[Link](0, 0);
[Link]("Dist:");
[Link](distance, 1);
[Link](" cm ");
// --- LOGIQUE DE COMMANDE ---
if (distance <= 8)
[Link](0, 1);
[Link]("Pompe ON ");
digitalWrite(RELAY_PIN, LOW); // Allume la pompe
delay(4000); // Temps d'arrosage (ajusté à 4s pour plus de sécurité)
digitalWrite(RELAY_PIN, HIGH); // Éteint la pompe CRUCIAL
[Link](0, 1);
[Link]("Lavage fini ");
// TRÈS IMPORTANT : On attend 3 secondes complètes pour que l'eau s'arrête
// de couler et que l'utilisateur retire ses mains avant de mesurer à nouveau.
delay(3000);
else
digitalWrite(RELAY_PIN, HIGH); // Sécurité : maintient le relais éteint
[Link](0, 1);
[Link]("Attente main ");
delay(100); // Petite pause avant la prochaine boucle