Arrêter incrément à l'appui d'un bouton

Bonsoir,

Je débute sur Arduino et je m'entraine avec les boucles et un afficheur 7 segments à 1 digit.

Je me triture trop l'esprit car je n'arrive pas à faire ce que je veux :

Mon afficheur affiche les nombres de 0 à 9 en boucle et je voudrai que lorsque j'appui sur mon bouton poussoir , l'afficheur s'arrête sur le nombre affiché.

void loop() 
{
for (int i = 0; i < 10; i++) {
    lightNumber(i); // ma fonction qui affiche le nombre
    lecture_bouton=digitalRead(bouton); // Lecture de l'état de bouton   
    if(lecture_bouton==0) //si bouton pressé
{break;lightNumber(i);} 
    delay(800);
  }             
}

J'utilise ce code, mais quand j'appui sur le bouton , l'afficheur affiche 0.

Je suppose qu'il ne faut pas utiliser break mais comment arreter l'incrément dans ce cas ?

Merci de votre aide

Bonsoir warnix

A la place de:

if(lecture_bouton==0) //si bouton pressé
{break;lightNumber(i);}

Utilise while

  while(digitalRead(bouton) == 0)
  {}

On reste dans cette boucle, qui ne fait rien, tant que bouton est pressé, ce qui "fige" ta boucle de comptage.

Cordialement
jpbbricole

Bonsoir jpbbricole

Merci pour l'astuce effectivement il y a du mieux car lorsque je maintiens le bouton appuyé la boucle s'arrete bien et le nombre reste affiché sur l'afficheur 7 segment

Mais quand je relache la boucle repart. Mon idée de base c'était que le nombre affiché reste bloqué même quand je relache le bouton , il faut donc casser la boucle

Une piste pour réaliser cela ?

Oui, il te faut une variable de type booléenne qui dit que le compte est bon.
Le compte est bon quand tu presses le bouton.
Tu conditionnes le fonctionnement de ta boucle de comptage au fait que le compte n'est pas bon.

J'ai bien créé mon booléen dans mes variables avec bool lecture_bouton=1;

Mais je ne comprends pas ou dans ma boucle for placer la condition ?

void loop() 
{
   lecture_bouton=digitalRead(bouton); // Lecture de l'état de bouton 

for (int i = 0; i < 10; i++) {
    lightNumber(i); // ma fonction qui affiche le nombre 
     while(digitalRead(bouton) == 0) // quand j'appui sur le bouton
{lightNumber(i);  // j'affiche le nombre
lecture_bouton=0; // je bascule mon booléen à 0
     } 
    delay(100);
  }             
}

Ne sert plus.

Tu exécutes ta boucle for (int i = 0; i < 10; i++) pour autant que lecture_bouton == 1.

Je pense comprendre : j'ai ajouté une condition dans le for (je savais pas que c'était possible) mais cela ne fonctionne pas

void loop() 
{
   
for (int i = 0; (i < 10 ) && (lecture_bouton==1); i++)  { // boucle avec double condition
    lightNumber(i); // ma fonction qui affiche le nombre 
     while(digitalRead(bouton) == 0) quand j'appui sur le bouton
{lightNumber(i); j'affiche le nombre 
     lecture_bouton==0; // je bascule mon booléen à 0
     } 
    delay(100);
  }             
}

En fait ton système est une machine à états.
1er état = ça incrémente
2nd état = ça n'incrémente plus.
Tu passes d'un état à l'autre en appuyant sur le bouton.
Tu stockes l'état dans une variable etat (qui vaut par ex. 0 ou 1 )
A l'appui bouton tu fais etat = 1 - etat (changement d'état)
Et ton code ensuite tient compte de cette variable pour savoir ce qu'il doit faire (incrémenter, ou pas)

Donc en résumé, pour avoir un code mieux organisé:
1 - déterminer l'état
2 - agir selon l'état
3 - boucler (c-à-d, ici, sortir de loop() )

Bonjour warnix

Comme ça, moi non plus :wink:

Voulait dire que la condition de fonctionnement de ta boucle doit "englober" ta boucle:

	if (leCompteEstBon == false)     // Si l'on a pas encore trouvé le chiffre
	{
		for (int i = 0; i < 10; i ++)
		{
			...
		}
	}

Attention, un grand classique dans les erreurs de programmation en Arduino, == fait une comparaison:
if (leCompteEstBon == false)
= attribue une valeur:
leCompteEstBon = false;

Voici le programme tel qu'expliqué:

const int bouton = 3;     // Pin du bouton
boolean leCompteEstBon = false;
void setup()
{
	Serial.begin(115200);

	pinMode(bouton, INPUT_PULLUP);     // Bouton câblé d'un côté à GND   https://www.locoduino.org/spip.php?article122
}

void loop()
{	
	if (leCompteEstBon == false)     // Si l'on a pas encore trouvé le chiffre
	{
		for (int i = 0; i < 10; i ++)
		{
			lightNumber(i);      // ma fonction qui affiche le nombre
			
			while(digitalRead(bouton) == 0)      // quand j'appui sur le bouton
			{
				leCompteEstBon = true; // Le compte est bon, je bascule mon booléen à vrai
			}
			if (leCompteEstBon == true)     // Si le compte est bon
			{
				break;     // On quitte la boucle
			}
			delay(100);
		}
	}

	// Si on presse le bouton et que le compte était bon, on relance le comptage
	if (digitalRead(bouton) == 0 && leCompteEstBon == true)     
	{
		leCompteEstBon = false;
		while(digitalRead(bouton) == 0){}     // On attend le relâchement du bouton
	}
}

void lightNumber(int nombre)
{
	Serial.println(nombre);
}

Tu ajustera la pin du bouton, 3 dans cet exemple.

lightNumber est simplifié:

void lightNumber(int nombre)
{
	Serial.println(nombre);
}

Si tu utilises souvent des boutons, pour faciliter leur usage, il y a des bibliothèques pour ça, comme, une toute simple, button et il y en a beaucoup d'autres.

A+
Cordialement
jpbbricole

Merci jpbbricole j'ai tout compris et cela fonctionne désormais :slight_smile:

Bon week end

Bonsoir warnix

Super et bonne continuation!

Cordialement
jpbbricole

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.