Bonjour la communauté,
Pourriez vous m'aider à résoudre une difficulté s'il-vous-plaît ?
J'ai besoin de brasser l'air périodiquement et de réguler l'hygrométrie en fonction d'un seuil qui pourra être atteint ponctuellement.
J'ai trouvé tout ce dont j'avais besoin sur le forum ou presque et donc voici ce que j'ai pu faire :
#include <LiquidCrystal.h> // Librairie module Ecran lcd
#include "DHT.h" // Librairie module Sonde DHT
#define DHTPIN3 3 // Définition de pin de la sonde
#define DHTTYPE DHT22 // Définition du type de la sonde
DHT dht0(DHTPIN3, DHTTYPE); // Declaration du nom de la sonde
#define VENTPIN8 8 // Définition du relai compresseur
#define COMPPIN9 9 // Définition du relai ventilateur
LiquidCrystal lcd(A0,A1,A2,A3,A4,A5); // Déclaration de l'écran lcd sur les pins analogiques
int temp_min = 8; // Température minimum
int temp_max = 13; // Température maximum
int hum_min = 70; // Humidité minimum
int hum_max = 85; // Humidité maximum
const unsigned long SECOND = 1000; // Constante : le mot SECOND vaut 1000 millisecondes
const unsigned long MINUTE = 60*SECOND; // Constante : le mot MINUTES vaut 60 * 1000 millisecondes
const unsigned long HOUR = 3600*SECOND; // Constante : le mot HOUR vaut 3600 * 1000 millisecondes
unsigned long previousMillis = 0;
const unsigned long TimePause = 1 * HOUR;
const unsigned long TimeMarche = 10 * SECOND;
enum {BrassageON, BrassageOFF} etat_brassage ; // Enumération des etats possibles pour etat_brassage
void setup() {
Serial.begin(9600); // Démarrage du moniteur série vitesse 9600
lcd.begin (16, 2); // Démarrage de l'écran lcd
dht0.begin(); // Démarrage de la sonde
pinMode(VENTPIN8, OUTPUT); // Prise en charge relai ventilation sur pin 8 en sortie)
pinMode(COMPPIN9, OUTPUT); // Prise en charge reLai compresseur sur pin 9 en sortie)
digitalWrite(VENTPIN8, LOW); // Extinction du relai ventilateur
digitalWrite(COMPPIN9, LOW); // Extinction du relai compresseur
}
void loop() {
//lecture de la sonde
int h0 = dht0.readHumidity(); // Lecture de l'humidité - float : Valeur décimale - int : Valeur entière - const int : ?
int t0 = dht0.readTemperature(); // Lecture de la température
delay(2000); // Mise à jour des données de la sonde toutes les 2 secondes
//Debug et affichage des valeurs de la sonde
if (isnan(h0) || isnan(t0)) { // Si les valeurs retournées ne sont pas des nombres :
Serial.println("Erreur Sonde"); //
Serial.println("Pas de mesure"); //
lcd.setCursor(0, 0); //
lcd.print("Erreur sonde"); //
lcd.setCursor(0, 1); //
lcd.print("Pas de mesure"); //
}
else {
Serial.println("-----------------------");
Serial.print("Température : ");
Serial.print(t0);
Serial.println("°c");
Serial.print("Humidité : ");
Serial.print(h0);
Serial.println(" %");
Serial.println("-----------------------");
lcd.setCursor(0, 0); //
lcd.print("Temperature:"); //
lcd.print(t0 ); //
lcd.print((char)223); //
lcd.print("c "); //
lcd.setCursor(0, 1); //
lcd.print("Humidite :"); //
lcd.print(h0); //
lcd.print(" %"); //
}
// Commande de la ventilation
// Brassage régulier
unsigned long currentMillis = millis(); switch (etat_brassage)
{
case BrassageOFF:
if (currentMillis - previousMillis >= TimePause) {
previousMillis = currentMillis;
digitalWrite (VENTPIN8, HIGH);
delay(10*SECOND); // Solution d'appoint
Serial.println("Brassage ON");
etat_brassage = BrassageON ;
}
break;
case BrassageON:
if (currentMillis - previousMillis >= TimeMarche) {
previousMillis = currentMillis;
digitalWrite (VENTPIN8, LOW);
Serial.println("Brassage OFF");
etat_brassage = BrassageOFF;
}
break;
}
// Régulation
if (dht0.readHumidity() >= hum_max){ // Si l'humidité est supérieure ou égale à la donnée max,
digitalWrite(VENTPIN8,HIGH); // Le relai s'active et démarre la ventilation.
Serial.println("Ventilation ON"); //
}
else if(dht0.readHumidity() <= hum_min){ // Aussi si l'humidité est inférieure ou égale à la donnée min,
digitalWrite(VENTPIN8,LOW); // Le relai se désactive et éteint la ventilation.
Serial.println("Ventilation OFF"); //
}
}
J'ai déterminé deux fonctions :
- Une de brassage (10 secondes toutes les heures) ;
- Une de régulation (dès que l'humidité dépasse le seuil maximum, la ventilation tourne jusqu'au seuil minimum).
Tout va bien quand j'utilise l'une ou l'autre. En revanche, lorsque je les mets ensemble, la fonction de régulation force le brassage à s'éteindre. Mon ventilateur se lance et se coupe directement.
Je comprends bien le problème et le pourquoi, mais je n'arrive pas à déterminer une autre solution que celle d'appoint. J'ai bricolé un truc qui fait le job mais je pense pouvoir faire mieux :
- J'ai ajouté un delay de 10 secondes car comme cela met tout en pause, la ventilation reste en marche et la régulation reprend ensuite.
Dans l'idée, je me disais que la solution était de faire un pont entre les deux, que la fonction régulation prenne en compte que la fonction brassage est en cours ou encore réécrire le code différemment ?
Merci à celles et ceux qui s'arrêteront,