how to insert an emergency button in a cycle switch case

hi, i made this program that starts everything with a button star doing my cycle of cases

I tried in every way to insert an if to activate the P_Stop button that stops everything in case of emergency, but I didn’t succeed, someone can help me? thank you :confused:

#include <Servo.h>
// definizione servo
#define posMin 0
#define posMax 90
#define tempo_moto 10
#define pos_iniziale 0
Servo servo1;
Servo servo2;
Servo servo3;
//Pin dei led
#define pin_led1 8
#define pin_led2 9
#define pin_led3 10
// definizione pulsanti
int P_Start = 7;
int Stato_PStart = LOW;
int P_Stop = 6;
int Stato_PStop = LOW;
// definizione tempo
long Tempo_Partenza = 0;
/*
   variabile dell'intervallo di tempo tra un azione
   e la successiva, tempo che può essere fisso o
   variabile come nei nostri casi 5,2 o 3 secondi
*/
unsigned long Tempo_Trascorso = 0;
/*
   variabile che memorizza il valore attuale di millis()
   sarebbe il punto in cui decidiamo di far partire il
   cronometro per conteggiare il tempo
*/
int ciclo = 0;
//int var = 0;
/*
   Ciclo delle cose che si devono fare dopo
   ogni tempo trascorso con millis
*/
void setup()
{
  // config servo
  servo1.attach(3);
  servo2.attach(4);
  servo3.attach(5);
  servo1.write(0);
  servo2.write(0);
  servo3.write(0);
  // config led
  pinMode(pin_led1, OUTPUT);
  pinMode(pin_led2, OUTPUT);
  pinMode(pin_led3, OUTPUT);
  //config pulsante
  pinMode( P_Start , INPUT );
  pinMode( P_Stop , INPUT );
  // Monitor
  Serial.begin(9600);
}
/*
   CICLO SISTEMA TEMPORIZZATO
*/
void ciclo_sistema() {
  for (int i = 0; i < 18; i++) {
    ciclo = ciclo + 1;
    switch (ciclo) {
      //AZIONI DEL T1
      case 1:
        servo1.write(90);
        digitalWrite(pin_led1, HIGH);
        delay(5000);
        break;
      //AZIONI DEL T2
      case 2:
        servo1.write(0);
        digitalWrite(pin_led1, LOW);
        servo2.write(90);
        digitalWrite(pin_led2, HIGH);
        delay(5000);
        break;
      //AZIONI DEL T3
      case 3:
        servo2.write(0);
        digitalWrite(pin_led2, LOW);
        servo3.write(90);
        digitalWrite(pin_led3, HIGH);
        delay(5000);
        break;
      //AZIONI DEL T4
      case 4:
        servo3.write(0);
        digitalWrite(pin_led3, LOW);
        delay(3000);
        break;
      //AZIONI DEL T5
      case 5:
        servo3.write(90);
        digitalWrite(pin_led3, HIGH);
        delay(5000);
        break;
      //AZIONI DEL T6
      case 6:
        servo3.write(0);
        digitalWrite(pin_led3, LOW);
        servo2.write(90);
        digitalWrite(pin_led2, HIGH);
        delay(5000);
        break;
      //AZIONI DEL T7
      case 7:
        servo2.write(0);
        digitalWrite(pin_led2, LOW);
        servo1.write(90);
        digitalWrite(pin_led1, HIGH);
        delay(5000);
        break;
      //AZIONI DEL T8
      case 8:
        servo1.write(0);
        digitalWrite(pin_led1, LOW);
        delay(2000);
        break;
      //AZIONI DEL T9-1
      case 9:
        servo1.write(90);
        servo2.write(90);
        servo3.write(90);
        digitalWrite(pin_led1 , HIGH);
        digitalWrite(pin_led2, HIGH);
        digitalWrite(pin_led3, HIGH);
        delay(3000);
        break;
      //AZIONI DEL T10-1
      case 10:
        servo1.write(0);
        servo2.write(0);
        servo3.write(0);
        digitalWrite(pin_led1, LOW);
        digitalWrite(pin_led2, LOW);
        digitalWrite(pin_led3, LOW);
        delay(2000);
        break;
      //AZIONI DEL T9-2
      case 11:
        servo1.write(90);
        servo2.write(90);
        servo3.write(90);
        digitalWrite(pin_led1, HIGH);
        digitalWrite(pin_led2, HIGH);
        digitalWrite(pin_led3, HIGH);
        delay(3000);
        break;
      //AZIONI DEL T10-2
      case 12:
        servo1.write(0);
        servo2.write(0);
        servo3.write(0);
        digitalWrite(pin_led1, LOW);
        digitalWrite(pin_led2, LOW);
        digitalWrite(pin_led3, LOW);
        delay(2000);
        break;
      //AZIONI DEL T9-3
      case 13:
        servo1.write(90);
        servo2.write(90);
        servo3.write(90);
        digitalWrite(pin_led1, HIGH);
        digitalWrite(pin_led2, HIGH);
        digitalWrite(pin_led3, HIGH);
        delay(3000);
        break;
      //AZIONI DEL T10-3
      case 14:
        servo1.write(0);
        servo2.write(0);
        servo3.write(0);
        digitalWrite(pin_led1, LOW);
        digitalWrite(pin_led2, LOW);
        digitalWrite(pin_led3, LOW);
        delay(2000);
        break;
      //AZIONI DEL T9-4
      case 15:
        servo1.write(90);
        servo2.write(90);
        servo3.write(90);
        digitalWrite(pin_led1, HIGH);
        digitalWrite(pin_led2, HIGH);
        digitalWrite(pin_led3, HIGH);
        delay(3000);
        break;
      //AZIONI DEL T10-4
      case 16:
        servo1.write(0);
        servo2.write(0);
        servo3.write(0);
        digitalWrite(pin_led1, LOW);
        digitalWrite(pin_led2, LOW);
        digitalWrite(pin_led3, LOW);
        delay(2000);
        break;
      //AZIONI DEL T9-5
      case 17:
        servo1.write(90);
        servo2.write(90);
        servo3.write(90);
        digitalWrite(pin_led1, HIGH);
        digitalWrite(pin_led2, HIGH);
        digitalWrite(pin_led3, HIGH);
        delay(3000);
        break;
      //AZIONI DEL T10-5
      case 18:
        servo1.write(0);
        servo2.write(0);
        servo3.write(0);
        digitalWrite(pin_led1, LOW);
        digitalWrite(pin_led2, LOW);
        digitalWrite(pin_led3, LOW);
        delay(2000);
        break;
    }

  }
}
void loop()


{
  // leggo e assegno lo start
  Stato_PStart = digitalRead(P_Start);
  if (Stato_PStart == HIGH) // P_Start condizione se si preme il pulsante
  {
    //inserisco prima del ciclo la condizione do while
    //che fa e ripete per 20 volte l'intera sequenza
    int var = 0;
    do {
      if (millis() - Tempo_Partenza > Tempo_Trascorso)
        //parte il tempo quindi
        //esegue quanto riportato nella funzione ciclo di sistema
      {
        {
          ciclo_sistema();
          //ciclo del sistema con switch case
        }
        Tempo_Partenza = millis();
        //riassegna il tempo di partenza al momento
        //attuale dopo il tempotrascorso
      }
    }
    while (var < 20);
    //ripeti il ciclo per massimo 20 volte condizione del do while
    var++;
  }

}

Sorry can't follow your Italian notes but you could always wire the button to reset. As long as it takes a button to restart the case switches, then this will at least work.

I hope it's not safety critical!

If you want to be able to interrupt the flow of a program then you must not use delay() or WHILE or FOR loops that last longer than a few millisecs.

The functions delay() and delayMicroseconds() block the Arduino until they complete. Have a look at how millis() is used to manage timing without blocking in Several Things at a Time.

And see Using millis() for timing. A beginners guide if you need more explanation.

Note how each function in my code runs very briefly and returns to loop() so the next one can be called. None of the functions tries to complete a task in one call. And there may be dozens of calls to a function before it is actually time for it to do anything.

...R

PS ... There is an Italian language section of the Forum if you would prefer to use your own language.

If “emergency” means that there’s a risk of bodily injury or extensive equipment damage, then DON’T implement this in software. You need a control that safely de-energizes the entire system.