// **************************************************************************************************
// Pilotage d'une VMC selon allumage de la lumière dans deux pièces et taux d'humidité
// Richard CHAPUZOT le 25 janvier 2024
//
// Deux temporisations mixtes sont utilisées l'une pour les WC, l'autre pour la SdB
// Les temporisation sont travail sur l'allumage et repos sur l'extinction de la lumière
// La commande de la VMC est par 2 relais en série, le premier commute le 240V le second vers V1 ou V2
// Ainsi il n'est pas possible d'envoyer le 240V simultanément vers les 2 commandes de la VMC
// **************************************************************************************************
// 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
// Définition des constantes des temporisations mixtes TM1 et TM2
const long dureeTM11 = 5; // Durée retard travail de la tempo TM1 WC en secondes (30 secondes)
const long dureeTM12 = 15; // Durée retard repos de la tempo TM1 WC en secondes (300 secondes)
const long dureeTM21 = 10; // Durée retard travail de la tempo TM2 SDB en secondes (60 secondes)
const long dureeTM22 = 20; // Durée retard repos de la tempo TM2 SDB en secondes (1800 secondes)
const long debutVMC = 10; // Durée activation VMC à la mise sous tension et chaque heure
const long debutV2 = 5; // Durée activation VMC vitesse 2 à la mise sous tension et chaque heure
// Définition des constantes des deux seuils d'humidité avec hystéréris
const float seuilH1 = 4.8; // Seuil H1 correspondant à 75%
const float seuilH2 = 4.0; // Seuil H2 correspondant à 63%
// définition et initialisation des variables
bool humid = HIGH; // Vrai si Humidité > H1 faux si humidité < H2 Démarrage à HIGH
bool tempoM1 = LOW; // Temporisation Mixte de L1 WC
bool frontM1 = LOW; // bascule mémorisant le front montant L1 WC
bool frontD1 = LOW; // bascule mémorisant le front descendant L1 WC
bool tempoM2 = LOW; // Temporisation Mixte de L2 SDB
bool frontM2 = LOW; // bascule mémorisant le front montant L2 SDB
bool frontD2 = LOW; // bascule mémorisant le front descendant L2 SDB
unsigned long heureFrontM1 = 0; // heure d'allumage de la lumière WC
unsigned long heureFrontD1 = 0; // heure d'extinction de la lumière WC
unsigned long heureFrontM2 = 0; // heure d'allumage de la lumière SDB
unsigned long heureFrontD2 = 0; // heure d'extinction de la lumière SDB
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 heureDebut = millis();
unsigned int heureMillis = heureDebut/1000;
// affichage des entrées
Serial.println();
Serial.print("Heure : ");
Serial.print(heureMillis);
Serial.print('\t'); // affiche un tab
Serial.print("| Modulo 1H : ");
Serial.print(heureMillis % 3600);
// Affichage des valeurs sur le moniteur série (à des fins de débogage)
Serial.print('\t'); // affiche un tab
Serial.print("| Humidité : ");
Serial.println(valeurHumid);
if (L1) { Serial.print("WC allumés");} else { Serial.print("WC éteints");}
Serial.print('\t'); // affiche un tab
Serial.print('\t'); // affiche un tab
if (L2) { Serial.println("| SdB allumée");} else { Serial.println("| SdB éteinte");}
// Calcul des temporisations
// TM1 : Temporisation Mixte : travail de 10 secondes après allumage de la lumière,
// repos de 10 minutes après extinction de la lumière
// Tant que tempoTM1 ne dépasse pas le seuil, elle reste à zéro puis bacule à 10 seconde
//
if (L1 && !frontM1) { // Utilisation de && pour vérifier L1 et l'état de frontM1
frontM1 = HIGH; // mémorisation du front montant allumage d'une lumière
heureFrontM1 = heureMillis; // Mémorisation de l'heure à la transition
}
if ((heureMillis - heureFrontM1 >= dureeTM11) && L1){
tempoM1 = HIGH; // Activation de la tempo
}
if (!L1 && tempoM1 && !frontD1) {
// Dès que L1 est éteinte, la tempoM1 activée compte la deuxième durée
frontM1 = LOW;
frontD1 = HIGH;
heureFrontD1 = heureMillis ;
}
if ((heureMillis - heureFrontD1 >= dureeTM12) && !L1) { // Si on a éteint et atteint la tempo
tempoM1 = LOW;
frontD1 = LOW;
heureFrontM1 = 0;
heureFrontD1 = 0;
}
// fin calcul tempoTM1
// TM2 : Temporisation Mixte : travail de 30 secondes après allumage de la lumière,
// repos de 30 minutes après extinction de la lumière
// Tant que tempoTM2 ne dépasse pas le seuil, elle reste à zéro puis bacule à 30 seconde
//
if (L2 && !frontM2) { // Utilisation de && pour vérifier L1 et l'état de frontM1
frontM2 = HIGH; // mémorisation du front montant allumage d'une lumière
heureFrontM2 = heureMillis; // Mémorisation de l'heure à la transition
}
if ((heureMillis - heureFrontM2 >= dureeTM21) && L2){
tempoM2 = HIGH; // Activation de la tempo
}
if (!L2 && tempoM2 && !frontD2) {
// Dès que L1 est éteinte, la tempoM1 activée compte la deuxième durée
frontM2 = LOW;
frontD2 = HIGH;
heureFrontD2 = heureMillis ;
}
if ((heureMillis - heureFrontD2 >= dureeTM22) && !L2) { // Si on a éteint et atteint la tempo
tempoM2 = LOW;
frontD2 = LOW;
heureFrontM2 = 0;
heureFrontD2 = 0;
}
// fin calcul tempoTM2
Serial.print("tempoM1 : ");
Serial.print(tempoM1);
Serial.print('\t'); // affiche un tab
Serial.print('\t'); // affiche un tab
Serial.print("| tempoM2 : ");
Serial.println(tempoM2);
if (frontM1) { Serial.print("fM1=1 ");} else { Serial.print("fM1=0 ");}
if (frontD1) { Serial.print(" fD1=1 ");} else { Serial.print(" fD1=0 ");}
if (VMC_PIN){Serial.print("VMC");}
Serial.print('\t'); // affiche un tab
Serial.print('\t'); // affiche un tab
if (frontM2) { Serial.print("| fM2=1 ");} else { Serial.print("| fM2=0 ");}
if (frontD2) { Serial.print(" fD2=1 ");} else { Serial.print(" fD2=0 ");}
if (V2_PIN){Serial.println("V2");}
Serial.print("Heure fM1 : ");
Serial.print(heureFrontM1);
Serial.print('\t'); // affiche un tab
Serial.print('\t'); // affiche un tab
Serial.print("| Heure fM2 : ");
Serial.println(heureFrontM2);
Serial.print("Heure fD1 : ");
Serial.print(heureFrontD1);
Serial.print('\t'); // affiche un tab
Serial.print('\t'); // affiche un tab
Serial.print("| Heure fD2 : ");
Serial.println(heureFrontD2);
// 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 || tempoM1 || tempoM2 || humid || ((heureMillis % 3600)<debutVMC)));
// V2 : Sortie vitesse forte de la VMC uniquement si l'humidité est forte
digitalWrite(V2_PIN, !((humid)||(heureMillis<debutV2)));
unsigned int heureFin = millis();
Serial.print("Heure début :");
Serial.print(heureDebut);
Serial.print(" Heure fin :");
Serial.print(heureFin);
Serial.print(" Mod 1000 : ");
Serial.println((heureFin % 1000));
// Pause pour éviter une lecture trop rapide
delay(800);
}