[RESOLU]La boucle WHILE ne fonctionne pas avec ce programme...

Bonsoir a tous ! Afin de réviser un peu le C++ sous Arduino, que j'ai vu en cours de SI pendant l'année, j'ai décidé de refaire les tous premiers TP tout simple que nous avions fait.

Le but de ce TP est de faire clignoter une DEL via un bouton poussoir. Lorsque l'on maintient appuyer, la DEL reste allumée ou clignote ( en fonction du programme ) et dès que l'on relache, elle s'arrete.

En cours, nous avions utilisé la boucle " if " .... " else "... Le TP fonctionne parfaitement comme cela, mais j'ai voulu essayer avec la boucle " while ". J'ai téléversé mon programme, la DEL est éteinte, comme avec l'autre boucle, j'appuie sur le bouton poussoir, la DEL s'allume, je relache le bouton boussoir, elle reste allumée ! Je ne comprends pas pourquoi elle ne s'éteint pas... Est-ce tout simplement, parce que l'usage de cette boucle n'est pas appropriée pour ce TP, ou mon code qui est mauvais ?

Le voici :

int DEL=2;
int BP=8;
boolean EtatBP=0;
void setup()
{
  pinMode(DEL,OUTPUT);
  pinMode(BP,INPUT);
}

void loop()
{
EtatBP=digitalRead(BP);

while (EtatBP==HIGH)

{
 digitalWrite(DEL,HIGH);
 delay(100); 
 digitalWrite(DEL,LOW);
 delay(100);

}

digitalWrite(DEL,LOW);

}

Je vous remercie pour votre aide, et j'espère avoir respecté correctement, les règles de ce forum, étant nouveau, pardonnez moi si jamais j'ai commis une erreur.

Bonne soirée

EDIT : Code modifié

bonjour, il est ou le while dans le code? en plus pourquoi utiliser des boolean avec ce code? t'as du rater pas mal de cours :) utilises les exemples de l'ide pour comprendre ;)

Bonjour, En complément à la réponse d'Infobarquee.

EtatBP==digitalRead(BP);

Cela correspond à une opération de comparaison et non d'affectation. ;)

EtatBP=digitalRead(BP);

cette version devrait fonctionner, du moins pour la lecture du BP @+

Rooohh quel boulet alors... :cold_sweat: Effectivement, je me suis trompé de code, et en plus c'est un code bourré d'erreurs...

Voici le bon code :

int DEL=2;
int BP=8;
boolean EtatBP=0;
void setup()
{
  pinMode(DEL,OUTPUT);
  pinMode(BP,INPUT);
}

void loop()
{
EtatBP=digitalRead(BP);

while (EtatBP==HIGH)

{
 digitalWrite(DEL,HIGH);
 delay(100); 
 digitalWrite(DEL,LOW);
 delay(100);

}

digitalWrite(DEL,LOW);

}

Du coup, une fois que j'ai appuyé sur le bouton poussoir la DEL clignote tout le temps, alors que je relache le boutpn poussoir, elle est devrait s'arreter...

Salut,

En fait c'est parce qu'une fois que tu rentres dans ta boucle tu relis jamais la valeur du bouton poussoir il vaut donc toujours "HIGH" peu importe ce que tu fais hardware...

Rajoute ça dans ta boucle ou tu veux ça change rien :

EtatBP=digitalRead(BP);

edit : mais, "if .. else" est mieux dans cette situation : le loop faisant office de boucle :)

Exact, j'avais d'ailleurs fait un test, mais ca ne marche pas mieux...

int DEL=2;
int BP=8;
boolean EtatBP=0;
void setup()
{
  pinMode(DEL,OUTPUT);
  pinMode(BP,INPUT);
}

void loop()
{
EtatBP=digitalRead(BP);

while (EtatBP==HIGH)

{
 digitalWrite(DEL,HIGH);
 delay(100); 
 digitalWrite(DEL,LOW);
 delay(100);

}
EtatBP=digitalRead(BP);
digitalWrite(DEL,LOW);

}

Oui c’est parce qu’il faut le mettre dans le while :stuck_out_tongue:

int DEL=2;
int BP=8;
boolean EtatBP=0;
void setup()
{
  pinMode(DEL,OUTPUT);
  pinMode(BP,INPUT);
}

void loop()
{
EtatBP=digitalRead(BP);

while (EtatBP==HIGH)

{
 digitalWrite(DEL,HIGH);
 delay(100); 
 digitalWrite(DEL,LOW);
 delay(100);
EtatBP=digitalRead(BP);  // <------ ICI :D

}

digitalWrite(DEL,LOW);

}

edit : si ta variable EtatBP vaut HIGH tu vas rentrer dans la boucle, et la valeur de EtatBP ne change jamais dans ton while. Il faut donc la relire dans le while pour vérifier que tu appuies toujours dessus

Et oui, effectivement, je reste tout le temps dans ma boucle, je n'en sort jamais et je ne vérifie pas l'état de BP en fin de boucle.. Merci beaucoup, cela fonctionne très bien.

Je vais faire de meme avec un répéter tant que.

Cela m'entraine a utiliser d'autres boucles :)

Un grand merci en tout cas pour cette réponse rapide et efficace XD

Bonne journée

Aucun problème, avec un faire... tant que ça bougera pas de trop ça va :p

Bonne journée

Dans la mesure ou l'état du bouton n'est pas utilisé ailleurs, une autre solution serait de placer la lecture dans la condition de maintient du while

while (digitalRead(BP)==HIGH){
 digitalWrite(DEL,HIGH);
 delay(100); 
 digitalWrite(DEL,LOW);
 delay(100);
}