Bouton poussoir : appuyer une seule fois pour lancer une boucle

Bonjour,

J'aimerais utiliser un bouton poussoir pour lancer une boucle : si le bouton est appuyé une fois, il lance la boucle d'après.

Est ce que ce code :

int Bouton = 6;


void setup {

pinMode(Bouton, INPUT_PULLUP);

}


void loop {

boolean EtatBouton = digitalRead(BoutonDemarrage);

if(EtatBouton == LOW)
{

   While(...)  {
   //code du while
   }

}

}

permettrait de lancer la boucle While sans avoir besoin de rester tout le temps appuyer sur le bouton ?

Oui, c'est OK.

Par contre, tant que tu tiens le bouton appuyé, tu relances sans arrêt la boucle while.

Même si je suis déjà dans le While ?
Je m'explique : si j'appuie une fois, le While devrait se lancer, et donc une fois que j'y suis, le code à l'extérieur du While n'est pas pris en compte. Donc si le While a commencé, et que je suis encore dans le While, si j'appuie sur le bouton, plusieurs fois, la première fois va servir lancer le While, et les fois d'après ne seront pas prises en compte non ? (parce que dans le While, je n'ai pas de digitalRead(EtatBouton) )

Tprog:
Même si je suis déjà dans le While ?

Non!
Ce qui veut dire qu’il ne faut pas de while dans la loop() (qui comme son nom l’indique est déjà une boucle)

Oui je sais, que la loop() est déjà une boucle, mais elle n'a pas de condition.
Si je veux l'utiliser comme le While, je dois faire ça avec des if et des "hysteresis".

Donc même si mon programme n'est pas optimisé, et qu'il est très moche, tant que ça fonctionne, je préfère garder le While pour ne pas galérer en essayant de créer un "semblant de While" avec d'autres fonctions.

Tprog:
Si je veux l'utiliser comme le While, je dois faire ça avec des if et des "hysteresis".

Je ne vois pas le rapport entre while/ pas while et hystérésis.
S'il y a besoin d'un hystérésis, qu'on utilise ou pas while, il faut gérer l'hystérésis.

Non, mais si je n’utilise pas le While :
je n’utilise pas While (x<10) par exemple, je vais utiliser un if (x<10). Sauf que ce qui est dans les instructions du if, ça va être “saccadé”, c’est à dire, que si je dis d’allumer un moteur, ça va l’allumer, l’éteindre, l’allumer… assez vite. Donc je dois gérer l’hysteresis.

Tandis que avec le While, je n’ai pas ce problème : si je met allumer un moteur comme instruction du While, le moteur va rester allumé constamment donc je n’ai pas ce problème. Ou bien il y a quand même le problème ?

(sachant que j’ai juste l’instruction du while à gérer, rien à côté)

Il y a exactement le même problème.
Il va bien falloir que tu arrêtes le moteur en sortant et while et il risque de redémarrer en entrant dans le while au prochain appel de loop().

ah oui ok, mais après le premier While (qui allume le moteur), il y a un second While, qui arrête le moteur.
Et après ce deuxième while, quand il remonte en haut de la loop(), il faudra appuyer sur un bouton pour relancer le premier while (cf. premier message du topic)

Encore une fois:
Si ton application fait que tu doives gérer un hystérésis, tu dois gérer un hystérésis que ce soit avec ou sans while
Si dans ton application tu n'as pas besoin de gérer un hystérésis, tu n'as pas à gérer un hystérésis que ce soit avec ou sans while.

D'accord, j'ai compris.
Je vais tester mon code pour vérifier tout ça (si j'ai besoin d'un hysteresis, si il fonctionne bien...)

Tprog:
Donc si le While a commencé, et que je suis encore dans le While, si j'appuie sur le bouton, plusieurs fois, la première fois va servir lancer le While, et les fois d'après ne seront pas prises en compte non ? (parce que dans le While, je n'ai pas de digitalRead(EtatBouton) )

Non ce n'est pas ça.
La seule chose qui compte pour sortir du while(), c'est la condition qui figure entre ses parenthèses.
comme tu ne nous l'as pas donnée (la condition), difficile de répondre.
Le boucle while tournera tant que la condition est vraie.
Si rien dans la boucle n'est fait pour rendre la condition fausse, la while() tourne éternellement.
En aucun cas l'appui sur un bouton ne fait sortir automatiquement du while.
Pour ça, il faudrait tester l'état du bouton à l'intérieur du while, et modifier une variable pour que la condition soit évaluée à faux.

Tu peux aussi sortir d'un while() "par le milieu" (sans exécuter tout le bloc d'instructions) par le mot-clé break

Bonjour,

Si le bouton ne sert que de déclencheur on peut utiliser le code suivant :

int pinButton=6;

void setup() {

pinMode(pinButton, INPUT);
Serial.begin(9600);
}

void pushButton(){
if(digitalRead(pinButton)==HIGH){

/*While(){

}*/

}else{
////
}

}
void loop() {

pushButton();

}

Avec une résistance en pull down , cela va permettre d'exécuter la fonction à l'appui du bouton.

Si tu utilise un while, normalement tant que tu ne sera pas sorti de ta boucle , l'appui sur le bouton n'aura pas d'effets.

speedblood:
Si tu utilise un while, normalement tant que tu ne sera pas sorti de ta boucle , l'appui sur le bouton n'aura pas d'effets.

bin oui ... ou non !
Si le bouton est testé à l'intérieur du while,
et que la condition du test (qu'on ne connait toujours pas ...) est modifiée selon le résultat du test,
il est possible de sortir du while() en pressant (ou relachant) le bouton.

En fait on fait ce qu'on veut.
Je sens un gros méli-mélo entre les tournures du C (while, if..) et l'organisation du programme.
Il faut commencer par organiser son programme (c-à-d écrire un organigramme, avec papier et crayon, si, si...)
Ensuite le traduire en C, en utilisant les bons outils au bon moment.