Comment réinitialiser un programme?

Bonjour,
j'ai un exercice à résoudre pour demain, mais j'avais un problème au niveau de la réinitialisation du programme si le bouton poussoir est appuyé une 2ème fois .
voila l'exercice:
Le but de l’exercice est de réaliser un chenillard . L’objectif est qu’en appuyant sur un bouton on déclenche un chenillard de 6 LEDs qui ne tourne pas en boucle mais qu’une fois. Et en appuyant de nouveau sur le bouton poussoir, que le chenillard soit finit ou non, Le programme doit être réinitialisé en déclenchant le chenillard dés le début.

Est ce que vous avez des suggestions?
merci :slight_smile:

Une solution serait de mettre le chenillard dans la loop suivi d'une boucle qui attend l'appui sur le bouton

Si ton bouton est déclaré en INPUT_PULLUP :
while (digitalRead(buttonpin) == HIGH);
Ceci attend l'appui sur le bouton sans rien faire d'autre

Si tu mets cette ligne à la fin du setup, le chenillard sera lancé après appui sur le bouton.

1 Like

Ça complique un peu les choses, il faut surveiller le bouton pendant l'allumage des LEDs.
Là, une solution serait de faire une machine d'états.

Choisir entre:
- C'est nous qui faisons tout
- On donne les coups de pouce qui manquent
Dans le deuxième cas il faut donner ce qui a déjà été fait. Par exemple si on a un chenillard sans bouton, on peut le rajouter.

1 Like

Déclarez les broches correctement dans la setup et exécutez cette boucle

void loop (){
while (digitalRead (bouton == LOW){}
INICIO:
for (int = 1; x <=6; x++){
  digitalWrite (x,HIGH);
  delay (500)
  if (digitalRead (bouton == HIGH){break;}
  }
for (int = 1; x <=6; x++){
  digitalWrite (x,LOW);
}
goto INICIO;
}

Salutations.

1 Like

Oups ! Il faut fermer les parenthèses...
(digitalRead (bouton) == LOW)

merci je vais essayer cette solution :slight_smile:

merci bcp, je vais essayer cette solution aussi :slight_smile:

Bonjour,

A mon avis la solution est celle esquissée par le sept au post #3: une (mini) machine d'états.

ça ne va pas rendre le bouton très réactif...

un truc du genre plutôt:

const byte pinBouton = 2;  // Pin 2 --- bouton --- GND
const byte maxLed = 10;

byte ledActive;
unsigned long chrono;
bool isRunning = false;

void setup() {
  Serial.begin(115200);
  pinMode(pinBouton, INPUT_PULLUP);
  Serial.println("\n-----\nPrêt");
}

void loop() {
  if (digitalRead(pinBouton) == LOW) { // appui
    isRunning = true;
    ledActive = 0;
    chrono = millis();
  }

  if (isRunning && (millis() - chrono > 250)) { // 4 Hz
    if (ledActive == 0)
      Serial.println(); // "on recommence"
    else
      Serial.write(' ');
    Serial.print(ledActive++);
    chrono = millis();
    isRunning = (ledActive < maxLed);
  }
}

en appuyant sur le bouton à différent moment, le moniteur série (à 115200 bauds) affichera


0 1 2 3 4 5 6 7 8 9   // ici on a laissé le cycle complet
0 1 2 3                       // ici on appuie
0 1 2 3 4 5                 // donc on recommence à compter de 0, puis on appuie après 5
0 1 2 3 4 5 6 7           // donc on recommence à compter de 0, puis on appuie après 7
0 1 2 3 4 5 6 7 8 9     // ici on a laissé le cycle complet
0 1                              // ici on a dû appuyer pour relancer le cycle, qu'on interrompt après 1
0 1 2                           // etc

1 Like