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 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
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);
}
}
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() )
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);
}
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.