L'arret d'un moteur avec Accelstepper

Bonjour ,j’ai une question sur ce code ci dessous .
Quand j’appuis sur le bouton BP Reset le moteur se met bien en route , mais le fin de course devrait stopper le moteur quand il passe sur LOW et ce n’est pas le cas .
C’est pas faute d’avoir chercher ; je me dit que j’emploie mal la boucle while ?

#include <AccelStepper.h>


int switchStateRESET = 0;                        // BP reset
int FindecourseRESET = 0;                       // Fin de course 




AccelStepper stepper (1, 8, 4);

void setup()
{
  pinMode( 7, INPUT_PULLUP);
  pinMode( 9, INPUT_PULLUP);
  
  
}

void loop() {
 

  FindecourseRESET = digitalRead(7);
  switchStateRESET = digitalRead(9);

  while ((switchStateRESET == LOW ) && (FindecourseRESET == HIGH))
  {
    stepper.setMaxSpeed(4000);
    stepper.setSpeed(-3000);
    stepper.runSpeed();
  }


}

L'instruction qui vérifie l'état du bouton de stop est placée à l'extérieur de la boucle while

FindecourseRESET = digitalRead(7);

elle n'est donc pas revérifiée pendant que ça tourne.

J’essayerai selon le code que je viens de modifier bien que je comprends pas ma modif .
La boucle "void loops " je pensais comprendre quelle tourne plusieurs fois par seconde , donc elle ne peux pas passer dessus l’instruction sans la voir . Toute une journée pour pas dire plus à tout tourner sans y arriver , alors tant pis si je parais bête , mais qu’es ce que je comprends pas ?

#include <AccelStepper.h>


int switchStateRESET = 0;                        // BP reset
int FindecourseRESET = 0;                       // Fin de course




AccelStepper stepper (1, 8, 4);

void setup()
{
  pinMode( 7, INPUT_PULLUP);
  pinMode( 9, INPUT_PULLUP);
 
 
}

void loop() {
 

 
  switchStateRESET = digitalRead(9);

  while ((switchStateRESET == LOW ) && (FindecourseRESET == HIGH))
  { FindecourseRESET = digitalRead(7);
    stepper.setMaxSpeed(4000);
    stepper.setSpeed(-3000);
    stepper.runSpeed();
  }


}

La boucle principale void loop() tourne indéfiniment.

Mais si je place à l'intérieur une sous-boucle
while(1){ ..etc... }

comme cette condition est toujours vraie, on resté piégé définitivement dans l'intérieur de la sous-boucle.

Ah oui j'ai compris . Meme si je remplace while par if en gardant le code en l'état . C'est pareil ! un cercle vicieux .
Bon , ca fait pas mes affaires , mais j'avance .
Merci

Bonjour.

Donc, si je comprend bien, l'utilisation d'une sous-boucle n'est pas vraiment suggéré car le reste du programme arrête ainsi de "rouler" si la condition de la Sous-boucle n'est pas atteinte ?

Jacques3012

Dans mon cas oui . L’État de la broche n'est plus lisible de part la boucle . Pour en sortir , il faut trouver autre chose . Ecrire un code qui fait la même chose d'une façon différente . J'ai pas trouvé lol

On peut faire autant de sous-boucles qu'on veut.

Pour en sortir, il faut qu'une lecture de pin ou un résultat de calcul soit modifié dans la boucle et modifie la condition de validité du test.

Avant la boucle, on lit l'état du bouton d'arrêt (pour initialiser cette variable),
Pendant la boucle, on relit périodiquement ce même bouton d'arrêt pour détecter un changement d'état.