/*********************************************************
** Projet de 2nde SI 2024 : Container connecté **
** Classe de M Lauverjat - Lycée Colbert Lorient (56) **
**********************************************************
Afficheur LCD I2C : SDA sur A4 et SCL sur A5
Capteur HC-SR04 : Trig sur D12 et Echo sur D11
LEDs verte, jaune et rouge sur D8, D9 et D10
*/
#include <LiquidCrystal_I2C.h>
// Affectation des broches
#define pinLedVerte 8
#define pinLedJaune 9
#define pinLedRouge 10
#define pinEcho 11
#define pinTrig 12
// Déclaration de l'écran LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variables et constantes
const float diametre = 2.0; // Diamètre de la cuve en m
const float surface = 3.141592654 * diametre * diametre / 4; // Section de la cuve en m²
const float hMax = 4.0; // Profondeur de la cuve
const float Vmax = surface * hMax * 1000; // Volume maxi en L
jauge(float valeur = 50.0) {
float increment = 100 / 16;
for(int i=0 ; i<=15 ; i++){
lcd.setCursor(i,1);
if(valeur > (i+0.5)*increment) {
lcd.write(255); // Caractere plein
}
else {
lcd.write(32); // Espace (vide)
}
}
}
void setup() {
// Déclaration des broches
pinMode(pinLedVerte, OUTPUT);
pinMode(pinLedJaune, OUTPUT);
pinMode(pinLedRouge, OUTPUT);
pinMode(pinTrig, OUTPUT);
pinMode(pinEcho, INPUT);
// Initialisation du port série
Serial.begin(115200);
Serial.println("\n***************************************");
Serial.println("** Projet de container connecte **");
Serial.println("** Option SI en 2nde - Lycee Colbert **");
Serial.println("** Classe de M LAUVERJAT **");
Serial.println("***************************************");
// Initialisation de l'afficheuer et message d'accueil
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Option SI en 2nd");
lcd.setCursor(0,1);
lcd.print("Projet Container");
delay(2000);
lcd.clear();
}
void loop() {
// Mesure de la distance entre le capteur et la surface
float distance = distance_cm();
// Calcul du volume en litres (conversion en dm et dm²)
float volume = surface*100 * (hMax*10 - distance/10);
if (volume < 0) {
volume = 0;
}
float vol_pc = volume / Vmax * 100; // Volume en % du maxi
// Affichage sur le LCD
lcd.setCursor(0, 0);
lcd.print("Vol.:");
lcd.print(int(volume));
lcd.print(" L ");
lcd.setCursor(13,0);
lcd.print(int(vol_pc));
lcd.print("% ");
// Affichage de la jauge
int nop = jauge(vol_pc);
// Commande des LED
if (vol_pc <= 40) {
digitalWrite(pinLedVerte, HIGH);
digitalWrite(pinLedJaune, LOW);
digitalWrite(pinLedRouge, LOW);
}
else if (vol_pc <= 80) {
digitalWrite(pinLedVerte, LOW);
digitalWrite(pinLedJaune, HIGH);
digitalWrite(pinLedRouge, LOW);
}
else if (vol_pc <= 95) {
digitalWrite(pinLedVerte, LOW);
digitalWrite(pinLedJaune, LOW);
digitalWrite(pinLedRouge, HIGH);
}
else {
digitalWrite(pinLedVerte, LOW);
digitalWrite(pinLedJaune, LOW);
digitalWrite(pinLedRouge, HIGH);
delay(200);
digitalWrite(pinLedRouge, LOW);
delay(200);
}
// Affichage sur le port série
Serial.print("Distance = ");
Serial.print(distance_cm());
Serial.print(" cm - Volume = ");
Serial.print(volume);
Serial.print(" L - ");
Serial.print(vol_pc);
Serial.println(" %");
delay(1000);
}
float distance_cm() {
digitalWrite(pinTrig, LOW); // La broche TRIG doit être à LOW au repos
delayMicroseconds(2); // par sécurité...
digitalWrite(pinTrig, HIGH); // Signal TRIG
delayMicroseconds(10); // pendant 10 µs
digitalWrite(pinTrig, LOW); // Fin du signal
long mesure = pulseIn(pinEcho, HIGH); // On mesure le temps de l’ECHO (A/R)
float distance = mesure * 0.01715; // On calcule la distance pour une vitesse de son de 343 m/s
return distance;
}