pb pour contrôler un relais dans une machine a état pour piloter un moteur

Bonjour, a tous

Me revoilà , avec un nouveau projet , contenant une machine à état, que je maitrise pas trop mal maintenant grace à vous.

J'ai un souci dans mon programme.

Je veux allumer un moteur de circulation épisodiquement pour contrôler si la temperature a changer ,dans un phase du programme ou normalement il est a l'arrêt pour que l'eau se réchauffe

du genre 5min d'arrêt puis 1mm de fonctionnement , et la si la temperature a changer soit je passe dans l'état suivant soit , je suis toujours dans le meme état et il faut donc refaire la meme action

je sais , ou plutôt je pense que vous allez me dire utilise la fonction millis, c'est ce que j'ai essayé de bidouiller dans tous les sens , mais je me perd.

voici mon programme.

#include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>

 
    #include <OneWire.h>
    #include <DallasTemperature.h>
 
    #define ONE_WIRE_BUS 2
 
    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);
 
    #if (SSD1306_LCDHEIGHT != 32)
    #error("Height incorrect, please fix Adafruit_SSD1306.h!");
    #endif
 
    OneWire oneWire(ONE_WIRE_BUS);             // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
    DallasTemperature sensors(&oneWire);       // Pass our oneWire reference to Dallas Temperature.

    const byte relay = 7 ;                     // déclaration de la broche relay = 7

    const byte rouge = 4 ;                     // déclaration de la broche led  ROUGE 
    const byte vert = 5  ;                     // déclaration de la broche led  VERTE
    const byte bleu  = 6 ;                     // déclaration de la broche led  BLEU

    float temp;                                // creation de la variable decimal "temp"


 

  
    unsigned long previousaMillis = 0 ;                       //   variable pour stocker la mise a jour de millis()
    
    unsigned long intervalA = 20000UL;                       //   variable pour pour creer un interval de temps A
    
   
    float temps_mise_en_attente_pompe = 0;                   //   variable pour stocker le temps de mise en attente de la pompe
                                                          
     
     const unsigned long rougeinterval = 200UL ;             //   contantes pour stocker la durée d'un clignotement
     const unsigned long bleuinterval  = 200UL ;             //

     unsigned long rougetimer  = 0 ;                         //   variables pour stocker la valeur timer
     unsigned long bleutimer   = 0 ;                         //
                                                             
     int rougeState = LOW ;                                  //   variables pour stocker l'etat courant du State de leds
     int bleuState  = LOW ;                                  //
                                                         
                                               
  
  


  ////////////////////////////////////  enumeration des differents etats  ////////////////////////////////////////////////////////


  
   enum 
   
    {
        commuication_temperature,           //     case 0   demande de temperature au capteur
        controle_temperature_basse,         //     case 1   si la temperature est inferieur a 30 
        controle_temperature_mediane,       //     case 2   si la temperature est comprise entre 30 et 50
        controle_temperature_haute,         //     case 3   si la temperature est superieur a 50
        fin
       
        
    }  etat = commuication_temperature;     //  mise a l'etat initialisation pour le départ

    
 

/////////////////////////////////   Partie du programme qui ne sera éxécuté qu'une seule fois   ////////////////////////////////////////

 
    void setup() {
  
 
     // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)  
    display.clearDisplay();                               // Clear the buffer.
   
    sensors.begin();                                      // Start up the library
   
     Serial.begin(9600);                                  // demare le moniteur serie

    pinMode(relay, OUTPUT);                               // declaration de la broche 7 en SORTIE
     digitalWrite(relay,HIGH);                            // mise a l'etat HAUT de la broche 7  " POMPE branché sur NO et donc non active"

    pinMode(rouge, OUTPUT);                               // declaration de la broche 4 en SORTIE
     pinMode(vert, OUTPUT);                               // declaration de la broche 5 en SORTIE
      pinMode(bleu, OUTPUT);                              // declaration de la broche 6 en SORTIE
   
    digitalWrite(rouge,HIGH);                             // mise a l'etat HAUT de la broche '  " Led rouge eteinte"
     digitalWrite(vert,HIGH);                             // mise a l'etat HAUT de la broche '  " Led verte eteinte"
      digitalWrite(bleu,HIGH);                            // mise a l'etat HAUT de la broche '  " Led bleu eteinte"




    
    rougetimer = millis() ;   //
    bleutimer  = millis() ;   //
                              //           initialisation des millis des timers led
    
    rougetimer = millis() ;   //
    bleutimer  = millis() ;   //               








    ///////////////////////////////////// en tete de l'ecran OLED ////////////////////////////////////////////////////////


      display.clearDisplay();                       // clear previous buffered data
       display.setTextColor(WHITE);                 // ecris en blanc
  

      display.setCursor(0,0);                           // commence a ecrire a cet endroit sur OLED
       display.setTextSize(1);                           // ecris de cette taille la sur OLED
        display.println("Controle Temperature");                       // ecris a la ligne " Moteur" sur OLED

      display.setCursor(20,9);                           // commence a ecrire a cet endroit sur OLED
       display.setTextSize(1);                           // ecris de cette taille la sur OLED
        display.println("Rechauffeur By");                  // ecris a la ligne " Temperature" sur OLED

      display.setCursor(45,18);                           // commence a ecrire a cet endroit sur OLED
       display.setTextSize(2);                           // ecris de cette taille la sur OLED
        display.println("SEB");                  // ecris a la ligne " Temperature" sur OLED

      display.display();                            // Mets l'afffichage a jour sur OLED     

      delay(1000);
       display.clearDisplay();                       // clear previous buffered data
  
    }





 ///////////////////////////////////////////////     BOUCLE PRINCIPALE     ////////////////////////////////////////////////////////////

je sais que j'ai utilisé un delay de 5000 , le programme fonctionne a peu près bien comme cela , mais ca ne plait pas , c'est bloquant et j'utilise une machine a état justement pour avoir un programme , qui vérifie tout en permanence.

si une bonne âme peux me venir en aide.

merci d'avance.

suite du prog

      void loop() {                                   // partie du programme contenant la boucle qui sera joué a l'infinie

  


      switch(etat) {                 //             machine a etat pour le controle de la pompe en fonction de la
                                     //             temperature de l'eau qui circule dans le rechaufeur et gestion des
                                     //             temps de mise en pause de la pompe en fonction de la temperature



                  case commuication_temperature:                         // action pour l'étape 0
              
                               demande_temperature();                 // fonction de communication de la temperature du capteur DS18B20
                         
                          break;


                   
                    
                  case controle_temperature_basse:                         // action pour l'étape 1
              
                               temperature_inf_30();                 // fonction de controle d'une temperature inferieur a 30°C
                               
                         
                          break;

                          


                  case controle_temperature_mediane:                             // action pour l'étape 2
                    
                                temperature_entre_3050();        // fonction de controle d'une temperature comprise entre 30°C et 50°C
                                       
                          break;
                          
              
                          
              
                  case controle_temperature_haute:                        // action pour l'étape 3
              
                                temperature_superieur_50();                 // fonction detection de la presence ou pas d'un flacon sur sa base
                            
                          break;
                          
              

                                 
     }



 

                          
     }

 ///////////////////////////////////////     Partie du programme contenant les differentes fonction     /////////////////////////////////////////                 



 /////////////////////////////////////// fonction de communication de la temperature du capteur DS18B20  ////////////////////////////////////////




    
         void demande_temperature(){                


                  
                  sensors.requestTemperatures();                // Send the command to get temperatures. request to all devices on the bus
                   temp = sensors.getTempCByIndex(0);           // creation de la variable "temp" demande de temperature 

                  display.clearDisplay();                       // clear previous buffered data
                   display.setTextColor(WHITE);                 // ecris en blanc

                  display.setCursor(30,18);                          // commence a ecrire a cet endroit sur OLED
                   display.setTextSize(2);                           // ecris de cette taille la sur OLED
                    display.print(temp);                             // affache la variable "temp" sur OLED
                     Serial.println (temp);                          // affiche dans le moniteur serie la variable "temp"
                      display.print(" C");                           // affiche " C " sur OLED a la suite de (temp)
                       delay(500);                                   // interval pour metre a jour la variable (temp)

                       etat = controle_temperature_basse;                       // activation étape suivante

                       
                           }




 ///////////////////////////////////// fonction de controle d'une temperature inferieur a 30°C  ///////////////////////////////////////////





     void temperature_inf_30(){  




                   if (temp < 30 )
      {



         
         
         digitalWrite(rouge,HIGH);                         // extinction de la led rouge 
         digitalWrite(vert,HIGH);                          // extinction de la led verte 
         
         digitalWrite(relay,HIGH);                         // extinction de la pompe 
         
           Serial.println (" Temperature de circulation trop basse   POMPE OFF ");            // ecris dans le moniteur serie " POMPE OFF "

         clignotement_bleu();                              // fonction clignotement de la bleu
    


         display.display();                                // Mets l'afffichage a jour sur OLED 
         display.setTextColor(WHITE);                      // ecris en blanc
  

        display.setCursor(20,0);                           // commence a ecrire a cet endroit sur OLED
         display.setTextSize(1);                           // ecris de cette taille la sur OLED
          display.println("TEMP CIRCULATION");                       // ecris a la ligne " Moteur" sur OLED

        display.setCursor(15,9);                           // commence a ecrire a cet endroit sur OLED
         display.setTextSize(1);                           // ecris de cette taille la sur OLED
          display.println("BASSE => POMPE OFF");                  // ecris a la ligne " Temperature" sur OLED

        
          display.display();                               // Mets l'afffichage a jour sur OLED     
 

        temps_mise_en_attente_pompe = (millis() - previousaMillis);                        // calcule du temps de pause de la pompe
        temps_mise_en_attente_pompe = temps_mise_en_attente_pompe / 1000 ;                // calcule du temps en secondes
                            
 

                            if( millis() - previousaMillis >= intervalA) {

                                    previousaMillis = millis();


                                 Serial.println  ( " Pompe en fonctionement pour voir si elle est plus chaude ");        // ecris dans le moniteur serie
                                 Serial.println  ( temp);
                                 Serial.println  ( temps_mise_en_attente_pompe );                                        // ecris dans le moniteur serie 

                                        digitalWrite(relay,LOW);                    // alumage de la pompe

                                        

                                
                             }

              


      }

      
          etat = controle_temperature_mediane;                       // activation étape suivante

      

      }


///////////////////////////////////////// fonction de controle d'une temperature compise entre 30°C et 50°C  ////////////////////////////////

et la fin

    void temperature_entre_3050(){  



       if ( (temp >= 30)  && (temp < 50) )
      {

         digitalWrite(rouge,HIGH);                    // extinction de la led rouge 
         digitalWrite(bleu,HIGH);                     // extinction de la led bleu 
         
         digitalWrite(relay,LOW);                    // alumage de la pompe
          digitalWrite(vert,LOW);                    // allumage de la led bleu 
           Serial.println (" Temperature de circulation ideal   POMPE ON ");             // ecris dans le moniteur serie " POMPE ON "


         display.setTextColor(WHITE);                 // ecris en blanc
  

        display.setCursor(20,0);                           // commence a ecrire a cet endroit sur OLED
         display.setTextSize(1);                           // ecris de cette taille la sur OLED
          display.println("TEMP CIRCULATION");                       // ecris a la ligne " Moteur" sur OLED

        display.setCursor(15,9);                           // commence a ecrire a cet endroit sur OLED
         display.setTextSize(1);                           // ecris de cette taille la sur OLED
          display.println("IDEALE => POMPE ON");                  // ecris a la ligne " Temperature" sur OLED 

        
          display.display();                            // Mets l'afffichage a jour sur OLED   



      }
      
         etat = controle_temperature_haute;                       // activation étape suivante



      
      }



      

////////////////////////////////////////  fonction de controle d'une temperature superieur a 50°C /////////////////////////////////////////






      void temperature_superieur_50(){         

         if (temp >= 50 )
      {

         digitalWrite(vert,HIGH);                    // extinction de la led rouge 
         digitalWrite(bleu,HIGH);                     // extinction de la led bleu 
         
         digitalWrite(relay,LOW);                    // alumage de la pompe
          
           Serial.println (" Temperature de circulation trop elevée   POMPE ON ");             // ecris dans le moniteur serie " POMPE ON "

          clignotement_rouge();                                                   // fonction clignotement de la bleu

          
         display.display();                            // Mets l'afffichage a jour sur OLED 
         display.setTextColor(WHITE);                 // ecris en blanc
  
        display.setCursor(20,0);                           // commence a ecrire a cet endroit sur OLED
         display.setTextSize(1);                           // ecris de cette taille la sur OLED
          display.println("TEMP CIRCULATION");                       // ecris a la ligne " Moteur" sur OLED

        display.setCursor(15,9);                           // commence a ecrire a cet endroit sur OLED
         display.setTextSize(1);                           // ecris de cette taille la sur OLED
          display.println("HAUTE => ATTENTION");                  // ecris a la ligne " Temperature" sur OLED 
        
          display.display();                            // Mets l'afffichage a jour sur OLED   

      }

      
         etat = commuication_temperature;                                               // retour a la communication de la temperature 

      

      }






  ////////////////////////////////////////////// fonction de clignotement led du montage ///////////////////////////////////////////////





                      void clignotement_bleu() {                         // fonction clignotement de la led bleu          


                        if ( (millis() - bleutimer) >= bleuinterval ) {
                              if(bleuState == LOW )
                                 bleuState = HIGH;
                                 else{
                                 bleuState = LOW;
                                 }
                                 digitalWrite(bleu , bleuState);
                                 bleutimer = millis();
                                 
    
                        }
   
                      }





                      void clignotement_rouge() {                         // fonction clignotement de la led rouge          


                        if ( (millis() - rougetimer) >= rougeinterval ) {
                              if(rougeState == LOW )
                                 rougeState = HIGH;
                                 else{
                                 rougeState = LOW;
                                 }
                                 digitalWrite(rouge , rougeState);
                                 rougetimer = millis();
                                 
    
                        }
   
                      }


  
  //////////////////////////////////////////////////////////////// fin du programme //////////////////////////////////////////////////////

la parti du code qui pose problème se trouve dans la :

////////// fonction de controle d'une temperature inferieur a 30°C ////////////

voila HELP....