Problèmes de tempo

Salut à tous,

J’ai un petit soucis avec mes temporisations.

Voici ce qu’il en est, j’aimerais que lorsque j’appuie sur un bp il y ai deux actions qui s’effectuent en parallèle:

  • un premier relais doit s’activer 4 secondes après
  • le deuxième quant à lui doit s’activer au même moment que l’on active le bouton mais
    retourner dans son état initial 5 secondes après avoir appuyé une seconde fois sur le bouton

J’ai donc essayé plusieurs choses; en premier temps j’ai essayé de le faire en utilisant qu’une seule loop, ensuite j’ai essayé avec deux loop mais je n’y arrive toujours pas.

Une âme charitable pour m’aider ?

Voici mon code:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

int bouton1 = 30;
int etatAllumage1;
int etatAllumage2;
int relais1 = 52;
int relais2 = 50;
//int loop1();
//int loop2(); 
int bouton1v;

LiquidCrystal_I2C lcd(0x27,16,2);

void setup()
{
lcd.init(); 
lcd.backlight();
pinMode(bouton1,INPUT_PULLUP); 
pinMode(relais1,OUTPUT);   
pinMode(relais2,OUTPUT);
bouton1v = digitalRead(bouton1);

loop1();
loop2();
}
 
 
void loop(void) 
{
 bouton1v = digitalRead(bouton1);
loop1();
loop2();
 if(etatAllumage1)
      {
       digitalWrite(relais1, LOW);
      }
   else
      {
      digitalWrite(relais1, HIGH);
      }

  if(etatAllumage2)
            {
              digitalWrite(relais2, LOW);
             }
          else
            {
              digitalWrite(relais2, HIGH);
             }     
 }


  void loop1(void){
    
      if(etatAllumage1)
      {
       digitalWrite(relais1, LOW);
      }
   else
      {
      digitalWrite(relais1, HIGH);
      }
      
         if (bouton1v == HIGH )
             {   
               etatAllumage1;
               //etatAllumage2 ;
             }
               if(etatAllumage1)
                 {
                  etatAllumage1=0;
                  delay(450);
                  lcd.clear();
                 }
               else
                 {
                  delay(4000);
                  etatAllumage1=1 ;
                  lcd.print("1"); 
                  }
                }

     

void loop2 (void){
          if(etatAllumage2)
            {
              digitalWrite(relais2, LOW);
             }
          else
            {
              digitalWrite(relais2, HIGH);
             }

             
              if (bouton1v == HIGH )
                 {   
                 // etatAllumage1;
                  etatAllumage2 ;
                 }     
       
                 if(etatAllumage2)
                     {
                      delay(450);
                      etatAllumage2=0;
                      lcd.clear(); 
                     }
                  else
                    {
                      delay(5000);
                      etatAllumage2=1 ;
                      lcd.print("2"); 
                    } 
                 if(bouton1v==LOW)
                 {
                  
                 }
                 }

Il faudrait, avant de mélanger deux programmes, retirer tous les délais et les remplacer par des attentes non bloquantes (sinon, c'est abominable). Une idée peut être trouvée dans l'exemple de demonstration blinkWithoutDelay livré avec l'IDE arduino -ca 30 lignes à comprendre, puis à adapter-

Tu peux maintenant détruire ton message dans la section "bar" afin de ne pas la polluer...

J'ai déjà regardé mais d'après ce que je comprends dans l'exemple de blinkwithoutdelay la fonction millis sert seulement à faire clignoter une lumière alors que je souhaite que seulement le bouton poussoir puisse changer l'état de mes relais.

millis ne sert pas particulièrement à faire clignoter une lumière, il sert à gérer (sans blocage) l'écoulement du temps
Dans le fonctionnement que tu décris, Arthur125, il est question à deux reprises de mesurer l'écoulement du temps pour gérer des actions

Plus de détails sur les codes non bloquants ici

L'exemple fourni avec l'IDE arduino sert à comprendre comment faire un code non bloquant en gérant des delais: comme le code est minimaliste, il est facile à comprendre et à le faire évoluer et Programmation Automate fini / Machine à état - Tutoriels et cours - Arduino Forum se réfère à cet exemple, permettant d'apprendre progressivement (et de gérer finement un bouton poussoir, ce qui ne gâche rien, au prix d'une bibliothèque supplémentaire, ce qui ne prend pas trop de temps à comprendre).
Cette solution est très économe en ressources; le lien donné par lesept en post 5 donne d'excellents liens vers cette solution, et aussi vers une autre solution, freeRTOS, qui est intéressant en lui même, mais, si vous avez un ARduino UNO, va consommer davantage de ressources, compliquant une éventuelle évolution (supposons que votre gestion de relais doive dépendre de calculs compliqués et mangeant de la RAM?)
C'est pour ça que je pense qu'il faut partir de l'exemple blinkWithoutDelay, et le faire évoluer progressivement....

Merci à tous pour vos réponses, je vais regarder avec la fonction millis :slight_smile: