Interrumpir codigo y ejecutar una secuencia

Buenos dias, estoy armando una maquina saca peluches.
el programa arranca cuando se inserta una moneda la cual acciona un limit switch (final de carrera) que al detectar el estado HIGH habilita movilizar el carro con el joystick. (esto lo inclui en el primer IF)

necesito que este primer IF sea interrumpido al presionar un boton, el cual ejecuta un segundo IF con una funcion "finalizar" (la funcion es una secuencia hace que el carro baje automaticamente la garra, la cierre, la suba, y vuelva a la posicion de inicio)

el problema es que el primer IF no se estaria ejecutando, sospecho que debe ser porque no estoy almacenando el valor HIGH del limit switch? entonces cuando la moneda pasa por el limit switch este cambia de LOW a HIGH y de nuevo a LOW? no se como se resuelve eso....

y por otro lado la secuencia de la funcion finalizar solo se ejecuta si mantengo presionado el boton, estoy con el mismo problema?

el segundo IF deberia estar anidado dentro del primer IF?

muchas gracias


//limit switch
int LS = 12;
int estadols;

//switch 
int SW = 11; 
int estadosw;

//pantalla
#include <Wire.h>     
#include <LCD.h>      
#include <LiquidCrystal_I2C.h>   
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7); 

//servomotor
#include <Servo.h>
Servo srv;
int SRV = 5; 
int PULSOMIN = 1000; 
int PULSOMAX = 2000; 

//motor carro eje X
int IN1X = 6; 
int IN2X = 7;
int ENAX = 5;  

//motor carro eje Y
int IN1Y = 8; 
int IN2Y = 9;
int ENAY = 10; 

//motor de la garra
int IN3G = 2; 
int IN4G = 3;
int ENBG = 3; 


void setup(){

    pinMode(LS,INPUT);
    
    pinMode(SW,INPUT);

    pinMode(SRV, OUTPUT);
    srv.attach(SRV, PULSOMIN, PULSOMAX); 
    srv.write(90); 
  
    pinMode(IN1X, OUTPUT);
    pinMode(IN2X, OUTPUT);
    pinMode(ENAX, OUTPUT);
    
    pinMode(IN1Y, OUTPUT);
    pinMode(IN2Y, OUTPUT);
    pinMode(ENAY, OUTPUT);
    
    pinMode(IN3G, OUTPUT);
    pinMode(IN4G, OUTPUT);
    pinMode(ENBG, OUTPUT);
    
}

void loop(){

   
  estadols = digitalRead(LS);
  estadosw = digitalRead(SW);
    
  lcd.begin(16, 2); 
  lcd.clear();
  lcd.setCursor(0, 0); 
  lcd.print("++INSERT COIN++");
  
  if (estadols == HIGH)
      {
      lcd.clear(); 
      lcd.setCursor(0, 0); 
      lcd.print("Iniciando");
      delay(1000);
      lcd.setCursor(0, 1); 
      lcd.print("A JUGAR!!!");
      
      int motorPWMSpeed0 = 0;
      int joystickValue0 = analogRead(A0);   

              if (joystickValue0 >= 530)             
                    {
                      avancemotorxA();
                    }
              else if (joystickValue0 <= 490)      
                    {
                      retrocesomotorxA();
                    }  
              else                                
                    {
                      stopmotorx();
                    }
              
        int motorPWMSpeed1 = 0;
        int joystickValue1 = analogRead(A1);   

              if (joystickValue1 >= 530)             
                    {
                      avancemotoryA();
                    }
              else if (joystickValue1 <= 490)          
                    {
                      retrocesomotoryA();
                    }  
              else                                
                    {
                      stopmotory();
                    }
      }

      
  if (estadosw == HIGH) 
    {
      finalizar();
    }
  }


void finalizar() {
    
      lcd.clear();
      lcd.print("LA GARRA!!!");   
      delay(2000);
      avancemotorg(); //baja la garra
      delay(3000);
      srv.write(0); //cierra la garra
      delay(2000);
      retrocesomotorg(); //sube la garra
      delay(2000);
      avancemotorxD(); //vuelve a inicio el carro
      avancemotoryD();  // vuelve a inicio la guia
      delay(3000);
      srv.write(180);   //abre la garra
      delay(2000);
      lcd.clear();
      lcd.print("GAME OVER!!!");   
      delay(3000); 

}

void avancemotorxA() {
  int motorPWMSpeed0 = 0;
  int joystickValue0 = analogRead(A0);
  motorPWMSpeed0 = map(joystickValue0, 530, 1023, 0, 255);
  digitalWrite(IN1X, HIGH);
  digitalWrite(IN2X, LOW);    
  analogWrite(ENAX, motorPWMSpeed0);
}

void avancemotorxD() {
  digitalWrite(IN1X, HIGH);
  digitalWrite(IN2X, LOW);    
  analogWrite(ENAX, HIGH);
}

void retrocesomotorxA() {
  int motorPWMSpeed0 = 0;
  int joystickValue0 = analogRead(A0);
  motorPWMSpeed0 = map(joystickValue0, 490, 0, 0, 255);
  digitalWrite(IN1X, LOW);
  digitalWrite(IN2X, HIGH);    
  analogWrite(ENAX, motorPWMSpeed0);
}

void retrocesomotorxD() {
  digitalWrite(IN1X, LOW);
  digitalWrite(IN2X, HIGH);    
  analogWrite(ENAX, HIGH);
}

void stopmotorx(){ 
  digitalWrite(IN1X, LOW);
  digitalWrite(IN2X, LOW);    
}

void avancemotoryA() {
  int motorPWMSpeed1 = 0;
  int joystickValue1 = analogRead(A1);
  motorPWMSpeed1 = map(joystickValue1, 530, 1023, 0, 255);
  digitalWrite(IN1Y, HIGH);
  digitalWrite(IN2Y, LOW);    
  analogWrite(ENAY, motorPWMSpeed1);
}

void avancemotoryD() {
  digitalWrite(IN1Y, HIGH);
  digitalWrite(IN2Y, LOW);    
  analogWrite(ENAY, HIGH);
}

void retrocesomotoryA() {
  int motorPWMSpeed1 = 0;
  int joystickValue1 = analogRead(A1);
  motorPWMSpeed1 = map(joystickValue1, 490, 0, 0, 255);
  digitalWrite(IN1Y, LOW);
  digitalWrite(IN2Y, HIGH);    
  analogWrite(ENAY, motorPWMSpeed1);
}

void retrocesomotoryD() {
  digitalWrite(IN1Y, LOW);
  digitalWrite(IN2Y, HIGH);    
  analogWrite(ENAY, HIGH);
}

void stopmotory(){ 
  digitalWrite(IN1Y, LOW);
  digitalWrite(IN2Y, LOW);    
}

void avancemotorg(){
  digitalWrite(ENBG, HIGH); 
  digitalWrite(IN3G, LOW);
  digitalWrite(IN4G, HIGH);
}

void retrocesomotorg(){
  digitalWrite(ENBG, HIGH); 
  digitalWrite(IN3G, HIGH);
  digitalWrite(IN4G, LOW);
}

 

He cambiado la estructura del programa conservando la lógica original. No he revisado ni modificado la lógica de control de los motores. Considéralo como una versión de prueba. Puedes agregar lógica para poner un tiempo límite al juego y por si el jugador abandona, regresar al inicio.

//limit switch
int LS = 12;
//int estadols; // ya no usamos esta variable

//switch
int SW = 11;
//int estadosw;// ya no usamos esta variable

//pantalla
#include <Wire.h>
//#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 2, 1);//, 0, 4, 5, 6, 7);

// declaramos estos valores para facilitar la lectura y modificación del código
const int joystickBajo = 490;
const int joystickAlto = 530;

//servomotor
#include <Servo.h>
Servo srv;
int SRV = 5;
int PULSOMIN = 1000;
int PULSOMAX = 2000;

//motor carro eje X
int IN1X = 6;
int IN2X = 7;
int ENAX = 5;

//motor carro eje Y
int IN1Y = 8;
int IN2Y = 9;
int ENAY = 10;

//motor de la garra
int IN3G = 2;
int IN4G = 3;
int ENBG = 3;


void setup() {

  pinMode(LS, INPUT);

  pinMode(SW, INPUT);

  pinMode(SRV, OUTPUT);
  srv.attach(SRV, PULSOMIN, PULSOMAX);
  srv.write(90);

  pinMode(IN1X, OUTPUT);
  pinMode(IN2X, OUTPUT);
  pinMode(ENAX, OUTPUT);

  pinMode(IN1Y, OUTPUT);
  pinMode(IN2Y, OUTPUT);
  pinMode(ENAY, OUTPUT);

  pinMode(IN3G, OUTPUT);
  pinMode(IN4G, OUTPUT);
  pinMode(ENBG, OUTPUT);

}

// algoritmo general
// -----------------
// invita a insertar una moneda
// espera a que se inserte una moneda
// a jugar!

void loop() {

  //  estadols = digitalRead(LS);
  //  estadosw = digitalRead(SW);

  // invita a insertar una moneda

  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("++INSERT COIN++");

  // espera a que se inserte una moneda

  while (digitalRead(LS) == LOW) {
     // el programa se bloquea hasta que se detecte una moneda. Poner tal vez un tiempo limite?
    delay(10);
  }

  // a jugar!
  jugar();
}

void jugar()  {

  // actualizar display
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Iniciando");
  delay(1000);
  lcd.setCursor(0, 1);
  lcd.print("A JUGAR!!!");

  // permitir el movimiento mientras no se oprima el boton
  while (digitalRead(SW) == LOW) {
    mover();
  }

  finalizar();
}

void mover() {
  //  int motorPWMSpeed0 = 0; // esta variable no se usa aquí
  int joystickValue0 = analogRead(A0);

  if (joystickValue0 >= joystickAlto)
  {
    avancemotorxA();
  }
  else if (joystickValue0 <= joystickBajo)
  {
    retrocesomotorxA();
  }
  else
  {
    stopmotorx();
  }

  //  int motorPWMSpeed1 = 0; esta variable no se usa aquí
  int joystickValue1 = analogRead(A1);

  if (joystickValue1 >= joystickAlto)
  {
    avancemotoryA();
  }
  else if (joystickValue1 <= joystickBajo)
  {
    retrocesomotoryA();
  }
  else
  {
    stopmotory();
  }
}

void finalizar() {

  lcd.clear();
  lcd.print("LA GARRA!!!");
  delay(2000);
  avancemotorg(); //baja la garra
  delay(3000);
  srv.write(0); //cierra la garra
  delay(2000);
  retrocesomotorg(); //sube la garra
  delay(2000);
  avancemotorxD(); //vuelve a inicio el carro
  avancemotoryD();  // vuelve a inicio la guia
  delay(3000);
  srv.write(180);   //abre la garra
  delay(2000);
  lcd.clear();
  lcd.print("GAME OVER!!!");
  delay(3000);

}

void avancemotorxA() {
  int motorPWMSpeed0 = 0;
  int joystickValue0 = analogRead(A0);
  motorPWMSpeed0 = map(joystickValue0, joystickAlto, 1023, 0, 255);
  digitalWrite(IN1X, HIGH);
  digitalWrite(IN2X, LOW);
  analogWrite(ENAX, motorPWMSpeed0);
}

void avancemotorxD() {
  digitalWrite(IN1X, HIGH);
  digitalWrite(IN2X, LOW);
  analogWrite(ENAX, HIGH);
}

void retrocesomotorxA() {
  int motorPWMSpeed0 = 0;
  int joystickValue0 = analogRead(A0);
  motorPWMSpeed0 = map(joystickValue0, joystickBajo, 0, 0, 255);
  digitalWrite(IN1X, LOW);
  digitalWrite(IN2X, HIGH);
  analogWrite(ENAX, motorPWMSpeed0);
}

void retrocesomotorxD() {
  digitalWrite(IN1X, LOW);
  digitalWrite(IN2X, HIGH);
  analogWrite(ENAX, HIGH);
}

void stopmotorx() {
  digitalWrite(IN1X, LOW);
  digitalWrite(IN2X, LOW);
}

void avancemotoryA() {
  int motorPWMSpeed1 = 0;
  int joystickValue1 = analogRead(A1);
  motorPWMSpeed1 = map(joystickValue1, joystickAlto, 1023, 0, 255);
  digitalWrite(IN1Y, HIGH);
  digitalWrite(IN2Y, LOW);
  analogWrite(ENAY, motorPWMSpeed1);
}

void avancemotoryD() {
  digitalWrite(IN1Y, HIGH);
  digitalWrite(IN2Y, LOW);
  analogWrite(ENAY, HIGH);
}

void retrocesomotoryA() {
  int motorPWMSpeed1 = 0;
  int joystickValue1 = analogRead(A1);
  motorPWMSpeed1 = map(joystickValue1, joystickBajo, 0, 0, 255);
  digitalWrite(IN1Y, LOW);
  digitalWrite(IN2Y, HIGH);
  analogWrite(ENAY, motorPWMSpeed1);
}

void retrocesomotoryD() {
  digitalWrite(IN1Y, LOW);
  digitalWrite(IN2Y, HIGH);
  analogWrite(ENAY, HIGH);
}

void stopmotory() {
  digitalWrite(IN1Y, LOW);
  digitalWrite(IN2Y, LOW);
}

void avancemotorg() {
  digitalWrite(ENBG, HIGH);
  digitalWrite(IN3G, LOW);
  digitalWrite(IN4G, HIGH);
}

void retrocesomotorg() {
  digitalWrite(ENBG, HIGH);
  digitalWrite(IN3G, HIGH);
  digitalWrite(IN4G, LOW);
}

Yo recomendaría al autor del hilo que lea como funcionan las máquinas de estado y que también lea como se usa millis().
Lograrás una mejora sustancial.
Ve a Documentación y ahi verás los temas que te menciono.

muchas gracias por tu respuesta! creo que por lo que pude probar me funciona para lo que necesito.
ahora el problema que tengo me parece que ya es una cuestion de consumo electrico....
son 2 modulos L298n que controlan 3 dc motors + 1 pantalla l2c + 1 servo + joystick + switch button.
con 1 bateria de 9v para los modulos y una de 9 volt para el arudino uno

gracias lo tendre en cuenta

La batería de 9V no sirve para estos proyectos
usa dos 18650 en serie que alcanzan 7.4V nominales a 2200mAh aprox
Eso lo conectas a Vmotor de los L298.

ok voy a hacer la prueba, y con fuente de alimentacion cual me recomendas?

Ya te lo había escrito!