Multi cycles permettant le clignotement de la même led avec la fonction millis

Bonjour,

Je suis bloqué j'aimerai faire clignoter la led de l'arduino plusieurs fois (10 cycles a peu près) avec la fonction millis. J'y arrive très bien avec un seul cycle (allumé 5s et éteindre 10s) mais quand je rajoute un deuxième cycle cela ne fonctionne pas.

Je vous remercie par avance,

Je joins le code ci dessous :

int LED = 13;

unsigned long interval,interval2;
unsigned int t1=5000, t2=10000, t3=20000, t4=50000;
unsigned long CurrentTime=0;
unsigned long CurrentTime2=0;

unsigned long PreviousTime = 0;
unsigned long PreviousTime2 = 0;

bool led1Etat;

void setup() 
{
 	pinMode(LED,OUTPUT);
  Serial.begin(9600);
}

void loop() 
{  

  unsigned long CurrentTime = millis();

  if((CurrentTime-PreviousTime) >= interval)
  {

  PreviousTime=CurrentTime;

  if(led1Etat == LOW)
  {
    led1Etat=HIGH;
    interval=t1;
  }
  else if (led1Etat == HIGH)
  {
   led1Etat=LOW;
   interval=t2;
  }
  digitalWrite(13,led1Etat);
  Serial.println(CurrentTime);
  }
  
  CurrentTime2 = millis();

  if((CurrentTime2-PreviousTime2) >= interval2)
  {
     PreviousTime2=CurrentTime2;

  if(led1Etat == LOW)
  {
    led1Etat=HIGH;
    interval2=t3;
  }
  else if (led1Etat == HIGH)
  {
   led1Etat=LOW;
   interval2=t4;
  }
  digitalWrite(13,led1Etat);
  Serial.println(CurrentTime2);

pouvez vous préciser ce que sont ces t1, t2, t3.... ?

vous devriez utiliser un tableau et pas besoin de 10 currentTime ou PreviousTime différents sans doute.

t1 serait le temps allumé de la led, t2 éteint, t3 allumé et ainsi de suite

la durée où la valeur de millis au changement d'état ?

Post mis dans la mauvaise section, on parle anglais dans les forums généraux, je viens de déplacer le post dans la section francophone.

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone".

C'est la durée pendant laquelle la led est allumée, en tout cas quand je test avec un seul cycle j'ai bien 5s la led allumée - 10s éteinte ainsi de suite
Donc quand millis = 5000 (allumée) 15000 (éteinte) 20000(allumée) .....

essayez un truc comme cela (tapé ici donc pas sûr que ça compile, mais le principe devrait être clair)

struct Tempo {
  unsigned long dureeOn;
  unsigned long dureeOff;
};

Tempo animation[] = {
  {500, 1000},
  {1000, 1000},
  {2000, 1000},
  {3000, 1000},
  {4000, 1000},
};

const size_t nombreAnimations = sizeof animation / sizeof * animation;
size_t animationEnCours = 0;
unsigned long chrono;

const byte brocheLed = 13;

void setup() {
  pinMode(brocheLed, OUTPUT);
  chrono = millis();
  digitalWrite(brocheLed, HIGH); // on démarre l'animation
}

void loop() {
  if (digitalRead(brocheLed) == HIGH) {
    // on est allumé, on regarde s'il faut éteindre
    if (millis() - chrono >= animation[animationEnCours].dureeOn) {
      // il faut éteindre
      digitalWrite(brocheLed, LOW);
      chrono = millis();
    }
  } else {
    // on est eteint, on regarde s'il faut allumer et passer à l'animation suivante
    if (millis() - chrono >= animation[animationEnCours].dureeOff) {
      // il faut allumer
      digitalWrite(brocheLed, HIGH);
      chrono = millis();
      if (++animationEnCours >= nombreAnimations) animationEnCours = 0; // on boucle si on est arrivé à la fin des animations
    }
  }
}

on met les durée dans une structure pour que ce soit facilement lisible
on crée un tableau de cette structure pour définir l'ensemble des étapes de l'animation
la boucle regarde l'état de la LED (ce qui permet de savoir si on doit allumer ou éteindre) et si le temps attendu est passé. Si oui, on fait l'action qu'il faut.

Je vous remercie, ça a l'air de fonctionner et je trouve cette méthode beaucoup plus simple.

Bonne journée