/* Like all Arduino code - copied from somewhere else :)
So don't claim it as your own
-----------------------------------------------------
Projet :
Date : octobre 2024
Développeur : BF
Description : Gestion d'une trappe d'aération électrique
*/
#include <DHT.h> // Bibliothèque pour le capteur de température DHT
#include <Wire.h> // Bibliothèque pour I2C
#include <LiquidCrystal_I2C.h> // Bibliothèque pour écran LCD I2C
// Pins des capteurs et relais
#define DHTPIN 2 // Pin du capteur DHT
#define DHTTYPE DHT22 // Type du capteur de température
#define pluiePin 3 // Relais unique pour ouvrir/fermer la trappe
#define relaisTrappe 4 // Relais unique pour ouvrir/fermer la trappe
#define switchManuel 6 // Interrupteur pour mode manuel/auto
#define switchAuto 7 // Interrupteur pour mode manuel/auto
#define boutonOuvrir 8 // Bouton pour ouvrir la trappe manuellement
#define boutonFermer 9 // Bouton pour fermer la trappe manuellement
#define boutonTempHautPlus 10 // Bouton pour augmenter la consigne de température haute
#define boutonTempHautMoins 11 // Bouton pour diminuer la consigne de température haute
#define boutonTempBasPlus 12 // Bouton pour augmenter la consigne de température basse
#define boutonTempBasMoins 13 // Bouton pour diminuer la consigne de température basse
// Seuils de température (valeurs initiales)
float tempHaut = 25.0; // Température au-dessus de laquelle on ouvre la trappe
float tempBas = 22.0; // Température en dessous de laquelle on ferme la trappe
// Variables pour l'anti-rebond et les boutons
unsigned long lastBoutonOuvrirTime = 0; // Temps de la dernière activation du bouton d'ouverture
unsigned long lastBoutonFermerTime = 0; // Temps de la dernière activation du bouton de fermeture
unsigned long lastBoutonTempHautPlusTime = 0; // Anti-rebond pour boutonTempHautPlus
unsigned long lastBoutonTempHautMoinsTime = 0; // Anti-rebond pour boutonTempHautMoins
unsigned long lastBoutonTempBasPlusTime = 0; // Anti-rebond pour boutonTempBasPlus
unsigned long lastBoutonTempBasMoinsTime = 0; // Anti-rebond pour boutonTempBasMoins
const unsigned long debounceDelay = 200; // Délai anti-rebond (200 ms)
// Variables pour la gestion de l'affichage
unsigned long lastLcdDisplayTime = 0; // Temps de la dernière mise à jour de l'affichage série
const unsigned long lcdDisplayInterval = 3000; // Intervalle d'affichage dans l'interface série (5 secondes)
// Variables globales
bool modeManuel = false; // Variable pour savoir si on est en mode manuel ou non
bool modeAutomatique = false; // Variable pour savoir si on est en mode manuel ou non
bool pluie; // Variable pour l'état du capteur de pluie
// Capteur DHT et écran LCD
DHT dht(DHTPIN, DHTTYPE); // Initialisation du capteur DHT
float temperature; // Variable pour la température
LiquidCrystal_I2C lcd(0x27, 20, 4); // Initialisation de l'écran LCD (adresse 0x27, 16 colonnes, 2 lignes)
// État de la trappe, fermée par défaut
bool trappeOuverte = false;
// Variables pour gérer l'interval entre les lectures des capteurs
unsigned long dernierTempsLecture = 0; // Stocke le temps de la dernière lecture
const unsigned long intervalleLecture = 10000; // Intervalle de 10 secondes (10000 ms)
void setup() {
Serial.begin(9600);
// Initialisation des broches
pinMode(pluiePin, INPUT_PULLUP);
pinMode(relaisTrappe, OUTPUT);
pinMode(switchManuel, INPUT_PULLUP);
pinMode(switchAuto, INPUT_PULLUP);
pinMode(boutonOuvrir, INPUT_PULLUP);
pinMode(boutonFermer, INPUT_PULLUP);
pinMode(boutonTempHautPlus, INPUT_PULLUP); // Bouton pour augmenter la consigne haute
pinMode(boutonTempHautMoins, INPUT_PULLUP); // Bouton pour diminuer la consigne haute
pinMode(boutonTempBasPlus, INPUT_PULLUP); // Bouton pour augmenter la consigne basse
pinMode(boutonTempBasMoins, INPUT_PULLUP); // Bouton pour diminuer la consigne basse
// Initialisation du capteur de température et de l'écran LCD
dht.begin();
lcd.init();
lcd.backlight(); // Activer le rétroéclairage de l'écran LCD
// Affichage initial
lcd.setCursor(0, 0);
lcd.print("System ready...");
delay(2000);
lcd.noBacklight(); // Éteindre le rétroéclairage
}
void loop() {
unsigned long currentMillis = millis();
// Vérifier si 10 secondes se sont écoulées depuis la dernière lecture
if (currentMillis - dernierTempsLecture >= intervalleLecture) {
// Mettre à jour le temps de la dernière lecture
dernierTempsLecture = currentMillis;
// Lecture des capteurs
temperature = dht.readTemperature();
pluie = digitalRead(pluiePin); // 1 = Pas de pluie, 0 = Pluie
}
// Lecture des boutons avec anti-rebond
bool ouvrirManuel = lireBouton(boutonOuvrir, lastBoutonOuvrirTime, currentMillis);
bool fermerManuel = lireBouton(boutonFermer, lastBoutonFermerTime, currentMillis);
bool consigneHautPlus = lireBouton(boutonTempHautPlus, lastBoutonTempHautPlusTime, currentMillis);
bool consigneHautMoins = lireBouton(boutonTempHautMoins, lastBoutonTempHautMoinsTime, currentMillis);
bool consigneBasPlus = lireBouton(boutonTempBasPlus, lastBoutonTempBasPlusTime, currentMillis);
bool consigneBasMoins = lireBouton(boutonTempBasMoins, lastBoutonTempBasMoinsTime, currentMillis);
// Sélection des modes automatique ou manuel
bool modeManuel = digitalRead(switchManuel);
bool modeAutomatique = digitalRead(switchAuto);
// Mode manuel : gérer l'ouverture et la fermeture avec les boutons
if (modeManuel) {
Serial.println("Mode Manuel");
if (ouvrirManuel) {
ouvrirTrappe();
} else if (fermerManuel) {
fermerTrappe();
}
}
// Mode automatique : contrôle par température et pluie
else if (modeAutomatique) {
Serial.println("Mode automatique");
if (pluie == LOW) {
Serial.println("Il pleut...");
fermerTrappe(); // Il pleut, fermer la trappe
}
else {
if (temperature > tempHaut) {
if (!trappeOuverte) {
ouvrirTrappe();
}
}
else if (temperature < tempBas) {
if (trappeOuverte) {
fermerTrappe();
}
}
}
}
else {
Serial.println("Mode arrêté");
fermerTrappe();
}
// Modifier les consignes de température via les boutons
if (consigneHautPlus) {
tempHaut += 1.0; // Augmenter la température haute de 0.5°C
}
if (consigneHautMoins) {
tempHaut -= 1.0; // Diminuer la température haute de 0.5°C
}
if (consigneBasPlus) {
tempBas += 1.0; // Augmenter la température basse de 0.5°C
}
if (consigneBasMoins) {
tempBas -= 1.0; // Diminuer la température basse de 0.5°C
}
// Gestion de l'affichage dans l'interface série
if (currentMillis - lastLcdDisplayTime >= lcdDisplayInterval) {
// Mise à jour de l'affichage LCD
lcd.clear();
// Affichage sur le LCD
lcd.setCursor(0, 0);
lcd.print("Mode : ");
if (modeManuel) {
lcd.print("Manuel");
}
else if (modeAutomatique) {
lcd.print("Automatique");
}
else {
lcd.print("Arr");
lcd.write(234); // Pour afficher les caractère ascii --> https://docs.wokwi.com/parts/wokwi-lcd1602
lcd.print("t");
}
lcd.setCursor(0, 1);
lcd.print("Temp. : ");
lcd.print(temperature,1);
lcd.write(176);
lcd.print("C");
lcd.setCursor(0, 2);
lcd.print("ConsH : ");
lcd.print(tempHaut,1);
lcd.write(176);
lcd.print("C");
lcd.setCursor(0, 3);
lcd.print("ConsB : ");
lcd.print(tempBas,1);
lcd.write(176); // Pour afficher les caractère ascii --> https://docs.wokwi.com/parts/wokwi-lcd1602
lcd.print("C");
lastLcdDisplayTime = currentMillis; // Réinitialiser le temps de dernière mise à jour
}
}
// Fonction pour ouvrir la trappe
void ouvrirTrappe() {
if (!trappeOuverte) {
digitalWrite(relaisTrappe, HIGH); // Active le relais pour ouvrir la trappe
trappeOuverte = true;
}
}
// Fonction pour fermer la trappe
void fermerTrappe() {
if (trappeOuverte) {
digitalWrite(relaisTrappe, LOW); // Désactive le relais pour fermer la trappe
trappeOuverte = false;
}
}
// Fonction mode arrêt
void ferme() {
Serial.print("Ferme");
digitalWrite(relaisTrappe, LOW); // Désactive le relais pour fermer la trappe
trappeOuverte = false;
}
// Fonction pour gérer l'anti-rebond des boutons
bool lireBouton(int pin, unsigned long &lastTime, unsigned long currentMillis) {
if (currentMillis - lastTime > debounceDelay) {
if (digitalRead(pin) == LOW) {
lastTime = currentMillis;
return true;
}
}
return false;
}