Armoire d'affinage : Régulation d'humidité et brassage d'air

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,

Dans la partie régulation, il faudrait peut-être tester si etat_brassage == BrassageON et alors ne pas éteindre la ventilation.

Bonjour,

Dans la fonction brassage tu gères VENTPIN8 et dans le contrôle de l’humidité tu gères aussi VENTPIN8. Tu n’utilises jamais COMPPIN9.
Est ce qu’il n’y a pas une des deux fonctions qui devrait gérer COMPPIN9 et non VENTPIN8 ?

Alors, j’ai bien introduis la ligne et retiré le delay plus haut.

// Régulation 

  if(etat_brassage == BrassageON){               // Si la fonction brassage est en marche, 
    digitalWrite(VENTPIN8,HIGH);                     // Le relai s'active et démarre la ventilation.
    Serial.println("Brassage ON");                //
    }
  else 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("Régulation 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("Régulation OFF");               //
      }

Résultat : la fonction régulation ne gène plus la fonction brassage, ça c’est résolu.

Difficulté en découlant :

  • Lorsque que l’humidité est trop élevée, la fonction régulation s’enclenche. Normal. Mais la fonction brassage tournant indépendamment, à un moment, les deux mises en marche de ventilation se chevauchent. Mon relai “force” a cause de l’utilisation de digitalWrite:HIGHen doublon.
    En pratique ça fonctionne, mais je vais abimer le relai.

J’ai mal copié collé l’extrait du code général. Le même programme commande aussi un compresseur frigo.
Je vais transmettre le code entier ce sera plus simple.

//Projet Cave a Charcuterie

// Librairies

  // #include : inclure une librairie
  
  #include <SPI.h>                    // Librairie module Carte sd
  #include <SD.h>                     // Librairie module Carte sd
  #include <LiquidCrystal.h>          // Librairie module Ecran lcd 
  #include "DHT.h"                    // Librairie module Sonde DHT 

// #define                                      // Définifition, déclaration  

  #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 ventilateur
  #define COMPPIN9 9                            // Définition du relai compresseur     
  LiquidCrystal lcd(A0,A1,A2,A3,A4,A5);         // Déclaration de l'écran lcd sur les pins analogiques
                                                   // ou LiquidCrystal lcd(14,15,16,17,18,19)
// Constantes

  int temp_min = 8;               // Température minimum
  int temp_max = 13;              // Température maximum
//int temp_ideal = 12;          // Température souhaitée (pas uilisé ici) 
  int hum_min = 70;               // Humidité minimum
  int hum_max = 85;               // Humidité maximum
//int hum_ideal = 80;           // Humidité souhaitée (pas uilisé ici)
 
  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 = 10 * SECOND;
  const unsigned long TimeMarche = 10 * SECOND;

  enum {BrassageON, BrassageOFF} etat_brassage ; // Enumération des etats possibles pour etat_brassage
  enum {RegulationON, RegulationOFF} etat_regulation ; // Pour switch case comprésseur (en cours)

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
  

  
// Introduction moniteur série

  Serial.println("Initialisation");             //
  Serial.println(" ");                          //
  Serial.println("Debuggage en cours");         //
  Serial.println(" ");                          //
  //delay(2000);                                // 
  
// Introduction écran lcd 
    
  // Démarrage de l'écran
  
  Serial.println("Démarrage de l'écran");         //
  Serial.println(" ");                            //
  lcd.begin (16, 2);                              // Démarrage de l'écran lcd
  lcd.clear();                                    // Reset de l'écran lcd
  lcd.setCursor(0,0);                             // Place le curseur Case 0 , Ligne 0
  lcd.print(" ");                                 // 
  lcd.setCursor(0,1);                             // Place le curseur Case 0 , Ligne 1
  lcd.print(" ");                                 //
  lcd.setCursor(0,0);                             // 
  lcd.print("Demarrage");                         // 
  lcd.setCursor(0,1);                             // 
  lcd.print(" ");                                 //
  lcd.clear();                                    //
  delay(2*SECOND);                                //  
  Serial.println ("Ecran Ok");                    //
  Serial.println(" ");                            //

  // Animation écran                  
    
  lcd.setCursor(0,0);               // Place le curseur Case 0 , Ligne 0
  lcd.print("Bonjour Chef !");      //
  lcd.setCursor(0,1);               // Place le curseur Case 0 , Ligne 1
  lcd.print("Cave au rapport!");    //
  delay(5*SECOND);                      // Durée 5 secondes

}

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 5 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(etat_brassage == BrassageON){              // Si la fonction brassage est en marche
    digitalWrite(VENTPIN8,HIGH);                   // Le relai s'active et démarre la ventilation.
    Serial.println("Brassage ON");                 //
    }
  else 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("Régulation 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("Régulation OFF");        //
      }

// Commande du compresseur

  if (dht0.readTemperature() >= temp_max){             // Si la température est supérieure ou égale à la donnée max,
  digitalWrite(COMPPIN9,HIGH);                         // Le relai s'active et démarre le compresseur.
  Serial.println("Compresseur ON");                    //
}
  else if(dht0.readTemperature() <= temp_min){         // Si la température est inférieure ou égale à la donnée min,
  digitalWrite(COMPPIN9,LOW);                          // Le relai se désactive et arrête le compresseur.
  Serial.println("Compresseur OFF");                   //                
}
  
  //switch (etat_regulation){ // (en projet)
  //switch état compresseur en projet
  
}

hello
un test

//Projet Cave a Charcuterie

// Librairies

  // #include : inclure une librairie
  
  #include <SPI.h>                    // Librairie module Carte sd
  #include <SD.h>                     // Librairie module Carte sd
  #include <LiquidCrystal.h>          // Librairie module Ecran lcd 
  #include "DHT.h"                    // Librairie module Sonde DHT 

// #define                                      // Définifition, déclaration  

  #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 ventilateur
  #define COMPPIN9 9                            // Définition du relai compresseur     
  LiquidCrystal lcd(A0,A1,A2,A3,A4,A5);         // Déclaration de l'écran lcd sur les pins analogiques
                                                   // ou LiquidCrystal lcd(14,15,16,17,18,19)
// Constantes

  int temp_min = 8;               // Température minimum
  int temp_max = 13;              // Température maximum
//int temp_ideal = 12;          // Température souhaitée (pas uilisé ici) 
  int hum_min = 70;               // Humidité minimum
  int hum_max = 85;               // Humidité maximum
//int hum_ideal = 80;           // Humidité souhaitée (pas uilisé ici)
 
  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 = 10 * SECOND;
  const unsigned long TimeMarche = 10 * SECOND;

  enum {BrassageON, BrassageOFF} etat_brassage ; // Enumération des etats possibles pour etat_brassage
  enum {RegulationON, RegulationOFF} etat_regulation ; // Pour switch case comprésseur (en cours)

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
  

  
// Introduction moniteur série

  Serial.println("Initialisation");             //
  Serial.println(" ");                          //
  Serial.println("Debuggage en cours");         //
  Serial.println(" ");                          //
  //delay(2000);                                // 
  
// Introduction écran lcd 
    
  // Démarrage de l'écran
  
  Serial.println("Démarrage de l'écran");         //
  Serial.println(" ");                            //
  lcd.begin (16, 2);                              // Démarrage de l'écran lcd
  lcd.clear();                                    // Reset de l'écran lcd
  lcd.setCursor(0,0);                             // Place le curseur Case 0 , Ligne 0
  lcd.print(" ");                                 // 
  lcd.setCursor(0,1);                             // Place le curseur Case 0 , Ligne 1
  lcd.print(" ");                                 //
  lcd.setCursor(0,0);                             // 
  lcd.print("Demarrage");                         // 
  lcd.setCursor(0,1);                             // 
  lcd.print(" ");                                 //
  lcd.clear();                                    //
  delay(2*SECOND);                                //  
  Serial.println ("Ecran Ok");                    //
  Serial.println(" ");                            //

  // Animation écran                  
    
  lcd.setCursor(0,0);               // Place le curseur Case 0 , Ligne 0
  lcd.print("Bonjour Chef !");      //
  lcd.setCursor(0,1);               // Place le curseur Case 0 , Ligne 1
  lcd.print("Cave au rapport!");    //
  delay(5*SECOND);                      // Durée 5 secondes

}

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 5 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(etat_brassage == BrassageON){              // Si la fonction brassage est en marche
  //  digitalWrite(VENTPIN8,HIGH);                   // Le relai s'active et démarre la ventilation.
  //  Serial.println("Brassage ON");                 //
  //  }
  //else 
  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.
     etat_regulation = RegulationON;
      Serial.println("Régulation 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. 
       etat_regulation = RegulationOFF; 
          Serial.println("Régulation OFF");        //
      }
      
if((etat_brassage == BrassageON)||(etat_regul = RegulationON))
{digitalWrite(VENTPIN8,HIGH);}else{digitalWrite(VENTPIN8,LOW);}


  if (dht0.readTemperature() >= temp_max){             // Si la température est supérieure ou égale à la donnée max,
  digitalWrite(COMPPIN9,HIGH);                         // Le relai s'active et démarre le compresseur.
  Serial.println("Compresseur ON");                    //
}
  else if(dht0.readTemperature() <= temp_min){         // Si la température est inférieure ou égale à la donnée min,
  digitalWrite(COMPPIN9,LOW);                          // Le relai se désactive et arrête le compresseur.
  Serial.println("Compresseur OFF");                   //                
}
  
  //switch (etat_regulation){ // (en projet)
  //switch état compresseur en projet
  
}

Je ne vois pas en quoi cela abîmerait le relais. Si la commande est déjà active tu vas seulement la confirmer il n’y a pas de forçage ici.
Le problème c’est plutôt lorsque le brassage est OFF et que l’humidité est supérieure au seuil. Dans ce cas le relais va être allumé par l’un des tests et éteint par l’autre.

je pense qu’il faut que tu laisses le clavier de coté et que tu décrives scrupuleusement le comportement de ton système en prenant bien en compte tous les cas de figure. Tu as commencé à coder une machine à états mais je pense que ton analyse n’était pas aboutie et maintenant tu bricoles

@dfgh :
Merci pour cette proposition. J’étais ignorant de la possibilité d’écrire des “&&” et “||”. Je pensais que “if” et “else if” ne fonctionnaient qu’avec “==” ou “<=” par exemple.

Grâce à cela, maintenant j’ai plus de possibilités.

@fdufnews

Je te remercie d’avoir compris ce que j’ai très maladroitement exprimé. Grâce à ton commentaire et à celui de la personne au dessus, je vais pouvoir mieux exprimer mes attentes.
Il me manquait des informations.

Bon je replanche là-dessus.

Bon je reviens car bien que j’ai essayé différentes pistes, mais je ne m’en sors pas vraiment.
Est-ce possible de m’aiguiller sur une piste pour un programme du genre, s’il vous plaît ?

  • Tant que l’humidité est <= au seuil max, le ventilateur s’allume 10 secondes puis s’éteint 1h, etc…
  • Si l’humidité est > seuil max, arrêter le cycle.
    Le ventilateur reste allumé tant que >au seuil mini.
  • Une fois atteint, reprendre le cycle .

C’est toi qui doit faire l’exercice car c’est toi qui sait exactement ce que tu veux réaliser.
Par contre, il faut être plus précis mettre plus de détails dans le fonctionnement.
Regarde ça, cela devrait t’aider à formaliser ton besoin: Programmation Automate fini / Machine à état.
Une fois que le projet sera décrit dans le détail le codage sera beaucoup plus aisé.

hello
voici un code qui fait ce que je crois avoir compris de ce que tu veux faire
à toi de le transposer.
tu le mets dans ta platine arduino et tu ouvres le moniteur à 9600 bauds

byte seuil_max  = 50;
boolean armement = false;
unsigned long chrono_soufflage = 0;
unsigned long temps_soufflage = 5000; //10000;
unsigned long chrono_attente = 0;
unsigned long temps_attente  = 10000; //3600000;
#define ventilo 4
#define humidite A0
void setup() {
  Serial.begin(9600);
}

void loop()
{
  if ((int(analogRead(humidite))) <= (seuil_max))
  { //Serial.print("humidite = "); Serial.print((int(analogRead(humidite)))); Serial.print("  ");
    if (armement == false) {
      chrono_soufflage = millis();
      chrono_attente = (millis() + temps_soufflage);
      armement = true;
    }
    if ((millis() - chrono_soufflage) < temps_soufflage)
    {
      digitalWrite(ventilo, HIGH); Serial.print("ventilo ON, chrono"); Serial.println(millis() - chrono_soufflage);
    }
    else
    {
      digitalWrite(ventilo, LOW); Serial.print("ventilo OFF, attente: "); Serial.println(millis() - chrono_attente);

      if ((millis() - chrono_attente) > temps_attente)
      {
        armement = false;
      }
    }
  }
  else//l'humidité est au dessus du seuil max
  {
    armement = false;
    Serial.print("humidite = "); Serial.println((int(analogRead(humidite)))); 
  }
}