[CODE DEBUTANT] coincé dans une boucle if : help !

Bonjour,

Je cherche à réaliser une accélération/décélération de temps pour l’allumage d’une led entre 2000ms et 100ms

Mon problème est que à un moment donné mon code se bloque entre deux valeurs du fait de ma condition if.

Je sais que c’est un problème élémentaire mais je ne sais pas le traiter.

Quelqu’un peut-il me donner un coup de pouce … °°

int gDel = 150;//variable pour delay()
int prev_gDel = 2000;


void setup() {
 Serial.begin(74880);// initialize menu Tools > serial monitor
  delay(100);

}

void loop() {
  
 if (prev_gDel < gDel) 
  {
    prev_gDel = prev_gDel + 100;
    Serial.println(prev_gDel);
    delay(prev_gDel);
  }

  else prev_gDel = prev_gDel - 100;
    Serial.println(prev_gDel);
    delay(prev_gDel);
}

Ce qui sans surprise donne une valeur de ms qui décroit mais se bloque tout en bas :

1900
1800
1700
1600
1500
1400
1300
1200
1100
1000
900
800
700
600
500
400
300
200
100
200
200
100
200
200
100
200
200
100
200
200
100
200

Et donc ne remonte jamais à 2000 ms …

Le plus simple deux boucle while l’une derrière l’autre

while(valeurCourante>valeurFinale1){
   ...
   valeurCourant -= pas;
   ...
}

while(valeurCourante<valeurFinale2){
   ...
   valeurCourant += pas;
   ...
}

Okay super, merci beaucoup :slight_smile:

Alors ça semblait prometteur mais à moins que je l’utilise mal ça revient au même, les valeurs décroissent mais ne remontent pas et restent bloquées en bas.

int gDel = 150;//variable pour delay()
int prev_gDel = 2000;

void loop() { 
  while(prev_gDel>gDel){
    prev_gDel -= 100;
    Serial.println(prev_gDel);
    delay(prev_gDel);
  
  while(prev_gDel<gDel){
    prev_gDel += 100;
    Serial.println(prev_gDel);
    delay(prev_gDel);
  }
 }
}

1900
1800
1700
1600
1500
1400
1300
1200
1100
1000
900
800
700
600
500
400
300
200
100
200
100
200
100
200
100

J’oublie quelque chose …?

Tu oublies que la valeur finale n'est pas la même dans les deux boucles.
Dans un cas tu pars de 2000 pour aller jusqu'à 100.
Dans l'autre tu pars de 100 pour aller jusqu'à 2000.
Si tu regardes le pseudo-code que j'ai mis il y a valeur finale1 et valeur finale2
J'aurais du mettre valeurFinale1 et valeurFinale2 pour que ce soit plus clair. Je corrige le pseudo-code

Bonjour,

Si on veut rester sur des if:

if ((valeurCourante >= valeurHaute) || (valeurCourante <= valeurBasse))  {pas = -pas;}
valeurCourante += pas;

Oui,merci à tous les deux. ce qui a marché pour moi c’est la proposition avec if, le while me parait aussi très intéressant mais je n’arrive pas à le mettre en oeuvre.

Ci dessous une belle accélération-décélération entre 2000 ms et 100 ms

int gDel1 = 150;//valeur finale1 pour delay()
int gDel2 = 2000;//valeur finale2 pour delay()
int prev_gDel = 2000;
int pas = 100; 

void setup() {
 Serial.begin(74880);// initialize menu Tools > serial monitor
  delay(100);

}

void loop() {

if ((prev_gDel >= gDel2) || (prev_gDel <= gDel1))  
   {
      pas = -pas;
   }
    
 prev_gDel += pas;
 
 Serial.println(prev_gDel);
 delay(prev_gDel);
}

1900
1800
1700
1600
1500
1400
1300
1200
1100
1000
900
800
700
600
500
400
300
200
100
200
300
400
500
600
700
800
900
1000
1100
1200
1300
1400
1500
1600
1700
1800
1900
2000