// Définition des broches et variables
const int H1_PIN = A0; //Entrée Taux d'humidité
const int L1_PIN = 2; //Entrée lumière WC
const int L2_PIN = 4; //Entrée lumière Salle de Bain
const int VMC_PIN = 9; //Sortie VMC 1 : vitesse réduite
const int V2_PIN = 10; //Sortie VMC 2 : vitesse importante
const long dureeTL1 = 5; // Intervalle de la tempo en secondes
const long dureeTL2 = 10; // Intervalle de la tempo en secondes
const long dureeT1 = 15; // Intervalle de la tempo en millisecondes (300 secondes)
const long dureeT2 = 20; // Intervalle de la tempo en millisecondes (1800 secondes)
const long debutVMC = 10; // Intervalle de temps activant la VMC à la mise sous tension
const long debutV2 = 5; // Intervalle de temps activant la VMC vitesse 2 à la mise sous tension
const float seuilH1 = 4.8; // Seuil H1 correspondant à 75%
const float seuilH2 = 4.0; // Seuil H2 correspondant à 63%
bool humid = HIGH; // Vrai si Humidité > H1 faux si humidité < H2 Démarrage à HIGH
bool tempoL1 = LOW; // Temporisation Travail de L1 WC
bool bascL1 = LOW; // bascule mémorisant le front montant L2 SDB
bool tempoL2 = LOW; // Temporisation Travail de L2 SDB
bool bascL2 = LOW; // bascule mémorisant le front montant L2 SDB
bool tempoT1 = LOW; // Temporisation Repos de TL1 WC
bool bascT1 = LOW; // bascule mémorisant le front montant des conditions de T1
bool tempoT2 = LOW; // Temporisation Repos de TL2 WC
bool bascT2 = LOW; // bascule mémorisant le front montant des conditions de T2
unsigned long heureBascL1 = 0; // heure d'allumage de la lumière WC
unsigned long heureBascL2 = 0; // heure d'allumage de la lumière SDB
unsigned long heureBascT1 = 0; // heure de bascule de la tempo T1
unsigned long heureBascT2 = 0; // heure de bascule de la tempo T2
void setup() {
//Affectation des Entrées / Sorties
pinMode(H1_PIN, INPUT); // CApteur d'humidité
pinMode(L1_PIN, INPUT); // Lumière WC
pinMode(L2_PIN, INPUT); // Lumière SdB
pinMode(VMC_PIN, OUTPUT); //activation VMC
pinMode(V2_PIN, OUTPUT); // Vitesse 2 VMC si VMC activée
Serial.begin(9600); // Initialisation de la communication série pour le débogage
}
void loop() {
// Lecture des entrées
float valeurHumid = analogRead(H1_PIN) * (10.0 / 1023.0);
bool L1 = digitalRead(L1_PIN);
bool L2 = digitalRead(L2_PIN);
// lecture du temps actuel
unsigned int heureMillis = millis()/1000;
// affichage des entrées
Serial.print("Heure : ");
Serial.print(heureMillis);
Serial.print('\t'); // affiche un tab
Serial.print("| Mod 1H : ");
Serial.print(heureMillis % 3600);
Serial.print('\t'); // affiche un tab
if (L1) { Serial.print("| WC allumés");} else { Serial.print("| WC éteints");}
Serial.print('\t'); // affiche un tab
if (L2) { Serial.println("| SdB allumée");} else { Serial.println("| SdB éteinte");}
// Calcul des temporisations
// TL1 : Temporisation travail de 10 secondes après allumage de la lumière, RAZ sur extinction
// Tant que tempoTL ne dépasse pas le seuil, elle reste à zéro puis bacule à 30 seconde
if (L1 && !bascL1) { // Utilisation de && pour vérifier L1 et l'état de bascL1
bascL1 = 1; // mémorisation du front montant allumage d'une lumière
heureBascL1 = heureMillis; // Mémorisation de l'heure à la transition
}
if ((heureMillis - heureBascL1 >= dureeTL1) && L1){tempoL1 = HIGH;}
if (!L1) {
// Dès que L1 est éteinte on remet à zéro la bascule et la tempo
tempoL1=LOW;
bascL1 = 0;
heureBascL1 = 0 ;
} // fin calcul tempoL1
// TL2 : Temporisation travail de 30 secondes après allumage de la lumière, RAZ sur extinction
// Tant que tempoTL ne dépasse pas le seuil, elle reste à zéro puis bacule à 30 seconde
if (L2 && !bascL2) { // Utilisation de && pour vérifier L2 et l'état de bascL2
bascL2 = 1; // mémorisation du front montant allumage d'une lumière
heureBascL2 = heureMillis; // Mémorisation de l'heure à la transition
}
if ((heureMillis - heureBascL2 >= dureeTL2) && L2){tempoL2 = HIGH;}
if (!L2) {
// Dès que L1 est éteinte on remet à zéro la bascule et la tempo
tempoL2=LOW;
bascL2 = 0;
heureBascL2 = 0 ;
} // fin calcul tempoL2
// T1 : Temporisation repos de 5 minutes 300 secondes après extinction lumière WC et tempoL1
// Tant que tempoT1 ne dépasse pas le seuil, elle reste à zéro puis bacule à 300 secondes
if (tempoL1){ tempoT1=HIGH;} // Armement de la temporisaton la sortie passe à 1
if (tempoT1 && !L1 && (heureBascT1 == 0)) {heureBascT1 = heureMillis ;} // Début de la tempo sur front descendant L1
if ((heureMillis - heureBascT1 >= dureeT1) && !L1) { // Si on a éteint et atteint la tempo
heureBascT1 = 0;
tempoT1 = LOW;
}
// fin calcul tempoT1
// T2 : Temporisation repos de 30 minutes 1800 secondes après extinction lumière SDB et tempoL2
// Tant que tempoT2 ne dépasse pas le seuil, elle reste à zéro puis bacule à 1800 secondes
if (tempoL2){ tempoT2=HIGH;} // Armement de la temporisaton la sortie passe à 1
if (tempoT2 && !L2 && (heureBascT2 == 0)) {heureBascT2 = heureMillis ;} // Début de la tempo sur front descendant L1
if ((heureMillis - heureBascT2 >= dureeT2) && !L2) { // Si on a éteint et atteint la tempo
heureBascT2 = 0;
tempoT2 = LOW;
}
// fin calcul tempoT1
Serial.print("TempoL1 : ");
Serial.print(tempoL1);
Serial.print('\t'); // affiche un tab
Serial.print("| TempoL2 : ");
Serial.print(tempoL2);
Serial.print('\t'); // affiche un tab
Serial.print("| TempoT1 : ");
Serial.print(tempoT1);
Serial.print('\t'); // affiche un tab
Serial.print("| TempoT2 : ");
Serial.println(tempoT2);
if (bascL1) { Serial.print("BascL1=1");} else { Serial.print("BascL1=0");}
Serial.print('\t'); // affiche un tab
if (bascL2) { Serial.print("| BascL2=1");} else { Serial.print("| BascL2=0");}
Serial.print('\t'); // affiche un tab
if (bascT1) { Serial.print("| BascT1=1");} else { Serial.print("| BascT1=0");}
Serial.print('\t'); // affiche un tab
if (bascT2) { Serial.println("| BascT2=1");} else { Serial.println("| BascT2=0");}
Serial.print("Heure L1 : ");
Serial.print(heureBascL1);
Serial.print('\t'); // affiche un tab
Serial.print("| Heure L21 : ");
Serial.print(heureBascL2);
Serial.print('\t'); // affiche un tab
Serial.print("| Heure T1 : ");
Serial.print(heureBascT1);
Serial.print('\t'); // affiche un tab
Serial.print("| Heure T2 : ");
Serial.println(heureBascT2);
// Contrôle du seuil H1
if (valeurHumid > seuilH1) {humid = HIGH;} // Seuil H1 correspondant à 75%
// Contrôle du seuil H2
if (valeurHumid < seuilH2) {humid = LOW;} // Seuil H2 correspondant à 63%
// V1 : Sortie vitesse réduite de la VMC
digitalWrite(VMC_PIN, !(L1 || L2 || tempoT1 || tempoT2 || humid || ((heureMillis % 3600)<debutVMC)));
// V2 : Sortie vitesse forte de la VMC uniquement si l'humidité est forte
digitalWrite(V2_PIN, !((humid)||(heureMillis<debutV2)));
// Affichage des valeurs sur le moniteur série (à des fins de débogage)
Serial.print("Humidité : ");
Serial.println(valeurHumid);
Serial.println();
// Pause pour éviter une lecture trop rapide
delay(1000);
}