#include <EEPROM.h> // Bibliothèque pour l'accès à la mémoire EEPROM
#include <LiquidCrystal.h> // Bibliothèque pour contrôler l'afficheur LCD
LiquidCrystal lcd(2,3,4,5,6,7); // Initialisation de l'objet pour l'écran LCD
long duration, inches; // Variables pour stocker la durée du signal ultrasonique et la distance mesurée en pouces
int set_val, percentage; // Variables pour la valeur de référence, le pourcentage de niveau d'eau
bool state, pump; // Variables pour l'état du système et l'état de la pompe
void setup() {
lcd.begin(16, 2); // Initialisation de l'écran LCD avec 16 colonnes et 2 lignes
lcd.print("WATER LEVEL:"); // Affichage du titre "WATER LEVEL:"
lcd.setCursor(0, 1); // Déplacement du curseur à la deuxième ligne
lcd.print("PUMP:OFF MANUAL"); // Affichage de l'état de la pompe
pinMode(8, OUTPUT); // Définition de la broche 8 comme sortie pour contrôler le capteur ultrasonique
pinMode(9, INPUT); // Définition de la broche 9 comme entrée pour recevoir le signal du capteur ultrasonique
pinMode(10, INPUT_PULLUP); // Définition de la broche 10 comme entrée avec résistance de tirage interne activée pour le bouton 1
pinMode(11, INPUT_PULLUP); // Définition de la broche 11 comme entrée avec résistance de tirage interne activée pour le bouton 2
pinMode(12, OUTPUT); // Définition de la broche 12 comme sortie pour contrôler la pompe
set_val = EEPROM.read(0); // Lecture de la valeur de référence à partir de la mémoire EEPROM
if(set_val > 150) set_val = 150; // Vérification et ajustement de la valeur de référence si elle est supérieure à 150
}
void loop() {
// Mesure de la distance en utilisant le capteur ultrasonique
digitalWrite(3, LOW);
delayMicroseconds(2);
digitalWrite(8, HIGH);
delayMicroseconds(10);
digitalWrite(8, LOW);
duration = pulseIn(9, HIGH);
inches = microsecondsToInches(duration);
// Calcul du pourcentage de niveau d'eau
percentage = (set_val - inches) * 100 / set_val;
// Affichage du pourcentage de niveau d'eau sur l'écran LCD
lcd.setCursor(12, 0);
if(percentage < 0) percentage = 0;
lcd.print(percentage);
lcd.print("% ");
// Contrôle de la pompe en fonction du niveau d'eau
if(percentage < 30 && digitalRead(11)) pump = 1;
if(percentage > 99) pump = 0;
digitalWrite(12, !pump);
// Affichage de l'état de la pompe sur l'écran LCD
lcd.setCursor(5, 1);
if(pump == 1) lcd.print("ON ");
else if(pump == 0) lcd.print("OFF ");
// Affichage du mode de fonctionnement de la pompe sur l'écran LCD
lcd.setCursor(9, 1);
if(!digitalRead(11)) lcd.print("MANUAL");
else lcd.print("AUTO ");
// Gestion des actions des boutons
if(!digitalRead(10) && !state && digitalRead(11)) {
state = 1;
set_val = inches;
EEPROM.write(0, set_val);
}
if(!digitalRead(10) && !state && !digitalRead(11)) {
state = 1;
pump = !pump;
}
if(digitalRead(10)) state = 0;
delay(500); // Délai pour stabiliser la lecture et réduire le nombre de lectures
}
long microsecondsToInches(long microseconds) {
return microseconds / 74 / 2; // Conversion de microsecondes en pouces
}