Ottimizzazione codice - 4 motori passopasso lentissimi

Buongiorno ragazzi, buon lunedì a tutti.
Dopo qualche notte passata al PC o a rigirarmi nel letto, sono riuscito a gestire in modo appropriato (a parere mio) i 4 passo-passo usando la lib AccelStepper.
I motori non sono rallentati quando in funzione contemporaneamente, e si fermano dopo tot giri.

Sono però bloccato su come ottenere lo stop sul relativo finecorsa.
Il motore S1 va in un senso, diciamo CW, per una durata stabilita da me, e va in CCW finché il suo finecorsa non mette LOW il relativo pin, che a sua volta usa la libreria per disattivare il pin Enable sul driver (quindi sgancia l'alimentazione al motore quando fermo, che è essenziale per evitare surriscaldamento).

Il punto è che non riesco a dirgli: "ok, se stai andando in CCW continua finché pinSXSTOP==HIGH, altrimenti fermati". Devo differenziale le variabili delle velocità per ogni motore? Al momento ce n'è una unica, velocita, che varia a seconda del carattere ricevuto.

#include <Bounce2.h>
#include <AccelStepper.h>

const int pinS1Dir = 2;
const int pinS1Step = 3;
const int pinS1Enable = 4;
const int pinS2Dir = 5;
const int pinS2Step = 6;
const int pinS2Enable = 7;
const int pinS3Dir = 8;
const int pinS3Step = 9;
const int pinS3Enable = 10;
const int pinS4Dir = A0;
const int pinS4Step = A1;
const int pinS4Enable = A2;
const int pinS1STOP = 11;
const int pinS2STOP = 12;
const int pinS3STOP = A4;
const int pinS4STOP = A5;

const int debounceMs = 10;

const float velocita = 1000;
const float accelerazione = 300;
const float escursione = 1000;

boolean S1_abilitato, S1_direzione;
boolean S2_abilitato, S2_direzione;
boolean S3_abilitato, S3_direzione;
boolean S4_abilitato, S4_direzione;

AccelStepper S1(AccelStepper::DRIVER, pinS1Step, pinS1Dir);
AccelStepper S2(AccelStepper::DRIVER, pinS2Step, pinS2Dir);
AccelStepper S3(AccelStepper::DRIVER, pinS3Step, pinS3Dir);
AccelStepper S4(AccelStepper::DRIVER, pinS4Step, pinS4Dir);

Bounce S1STOP = Bounce();
Bounce S2STOP = Bounce();
Bounce S3STOP = Bounce();
Bounce S4STOP = Bounce();

void setup() {
 Serial.begin(57600);

 S1_abilitato = S2_abilitato = S3_abilitato = S4_abilitato = false;
 Serial.println("Motori fermi");
 delay(500);
 
 const int S1_posizione = 0;
 const int S2_posizione = 0;
 const int S3_posizione = 0;
 const int S4_posizione = 0;
 Serial.println("Posizioni azzerate");
 delay(500);

 pinMode(pinS1STOP, INPUT);
 pinMode(pinS2STOP, INPUT);
 pinMode(pinS3STOP, INPUT);
 pinMode(pinS4STOP, INPUT);
 Serial.println("Pin settati");
 delay(500);

 digitalWrite(pinS1STOP, HIGH);
 digitalWrite(pinS2STOP, HIGH);
 digitalWrite(pinS3STOP, HIGH);
 digitalWrite(pinS4STOP, HIGH);
 Serial.println("Pullup settati");
 delay(500);

 S1.setEnablePin(pinS1Enable);
 S1.setPinsInverted(false, false, true);
 S2.setEnablePin(pinS2Enable);
 S2.setPinsInverted(false, false, true);
 S3.setEnablePin(pinS3Enable);
 S3.setPinsInverted(false, false, true);
 S4.setEnablePin(pinS4Enable);
 S4.setPinsInverted(false, false, true);

 S1.setMaxSpeed(velocita);
 S1.setAcceleration(accelerazione);
 S2.setMaxSpeed(velocita);
 S2.setAcceleration(accelerazione);
 S3.setMaxSpeed(velocita);
 S3.setAcceleration(accelerazione);
 S4.setMaxSpeed(velocita);
 S4.setAcceleration(accelerazione);
 Serial.println("Velocità e accelerazioni settate");
 delay(500);  

 S1STOP.attach(pinS1STOP);
 S1STOP.interval(debounceMs);
 S2STOP.attach(pinS2STOP);
 S2STOP.interval(debounceMs);
 S3STOP.attach(pinS3STOP);
 S3STOP.interval(debounceMs);
 S4STOP.attach(pinS4STOP);
 S4STOP.interval(debounceMs);
 Serial.println("Finecorsa inizializzati");
 delay(500);

 //ResetPosizioneFUNCT();

 Serial.println("");
 Serial.println("* * * * P R O N T O * * * *");
}

void loop() {
 //refresh stato finecorsa
 S1STOP.update();
 S2STOP.update();
 S3STOP.update();
 S4STOP.update();
 
 //leggi valore dei pulsanti
 int valS1STOP = S1STOP.read();
 int valS2STOP = S2STOP.read();
 int valS3STOP = S3STOP.read();
 int valS4STOP = S4STOP.read();

 //Nel caso arrivi un comando da seriale:
 while (Serial.available() > 0){
   char comando = Serial.read();
   switch (comando){
     case 'a':        
       S1.enableOutputs();
       S1.move(escursione);
       S1.setSpeed(velocita);
       Serial.println("A");
     break;
     case 'b':
       S1.enableOutputs();
       S1.setSpeed(-velocita);
       Serial.println("B");
     break;
     case 'c':
       S1.stop();
       S1.disableOutputs();
       Serial.println("C");     
     break;
     case 'd':
       S2.enableOutputs();
       S2.move(escursione);
       S2.setSpeed(velocita);
       Serial.println("D");
     break;
     case 'e':
       S2.enableOutputs();
       S2.setSpeed(-velocita);
       Serial.println("E");
     break;
     case 'f':
       S2.stop();
       S2.disableOutputs();
       Serial.println("F");
     break;
     case 'g':
       S3.enableOutputs();
       S3.move(escursione);
       S3.setSpeed(velocita);
       Serial.println("G");
     break;
     case 'h':
       S3.enableOutputs();
       S3.setSpeed(-velocita);
       Serial.println("H");
     break;
     case 'i':
       S3.stop();
       S3.disableOutputs();
       Serial.println("I");
     break;
     case 'l':
       S4.enableOutputs();
       S4.move(escursione);
       S4.setSpeed(velocita);
       Serial.println("L");
     break;
     case 'm':
       S4.enableOutputs();
       S4.setSpeed(-velocita);
       Serial.println("M");
     break;
     case 'n':
       S4.stop();
       S4.disableOutputs();
       Serial.println("N");
     break;
     //case 't':
       //ResetPosizioneFUNCT();
     //break;
   }
 }
 S1.runSpeed();
 S2.runSpeed();
 S3.runSpeed();
 S4.runSpeed();
 if(S1.distanceToGo() == 0){
   S1.disableOutputs();
 }
}