Botón de emergencia.

Bueno, este es un sistema para una maquina de pegado que funciona con 2 botones que se deben presionar hasta que esta se cierre, una ves sucede esto comienza un proceso que solo se puede interrumpir por un botón de emergencia que debe de abrir toda la maquina.
Mi problema es que una ves entro en este proceso no se como estar verificando en paralelo si este botón esta presionado o no. les dejo el código.

// Constantes
const int SComienzo = 4;
const int SFin = 5;
const int SArriba = 6;
const int EB = 7;
const int Bu1 = 8;
const int Bu2 = 9;
const int R1 = 10;
const int R2 = 11;

//Variables
int pv=0; //primera ves que escribe opciones y tiempo
int SComienzoState=0;
int SFinState=0;
int Bu1State = 0;         
int Bu2State = 0;
int EBState = 0;
int SArribaState = 0;
int T1=5000;
int T2=5000;

void setup() {
  Serial.begin(9600);
    // Rele Pins
  pinMode(R1, OUTPUT);    
  pinMode(R2, OUTPUT);
  // Button Pins
  pinMode(Bu1, INPUT);     
  pinMode(Bu2, INPUT); 
  pinMode(EB, INPUT);
  // Sensor Pins
  pinMode(SArriba, INPUT);
  pinMode(SComienzo, INPUT);
  pinMode(SFin,INPUT);
}


void loop() {
  // Lectura de botones
  LeoBotones();

  if (EBState == LOW){
      if ((Bu1State == HIGH) && (Bu2State == HIGH)){ //Botones Precionados
        ejecutar();
        pv=0;
      }
      else //No hay botones Precionados
      {
        if (pv==0){
            Serial.println("1-Tiempos");
            Serial.println("2-Opciones");
            pv=1;
        }
          
      }
    
  }
  else{
    Serial.println("Emergencia");
    pv=0;
  }
}//Fin Loop


void ejecutar() {
  LeoBotones();
  //Variables
  int pv1=0;
  while((Bu1State == HIGH) && (Bu2State == HIGH)&&(EBState==LOW)){
    LeoBotones();
    if (pv1==0){
      Serial.println("Comenzando Ejecucion");
      pv1=1;
    }
    LeoSensores(); //leo los sensores de contacto
    digitalWrite(R2,HIGH); //Entra hasta llegar al fin
    delay(100);
    if (SFinState==HIGH){
        Serial.println("Ejecutando");
        digitalWrite(R1,HIGH); //Si esta en el Fin Cierra y delay
        delay(T1);
        Serial.println("Abriendo y sacando");
        AbreMaquina();
        AlComienzo();
        Serial.println("Cerrando");
        digitalWrite(R1,HIGH); // Cierro y delay
        delay(T2);
        Serial.println("Abriendo");
        AbreMaquina();
        Serial.println("Termino");
        
    }//Termina Ciclo
    
  }//Botones Sueltos
  Serial.println("Se Salio, Sacando");
  AlComienzo();
}//Fin Ejecutar


void AbreMaquina(){
  while(SArribaState==LOW){ //Mientras no este Abierto se queda aca y abre
        digitalWrite(R1,LOW);
        LeoSensores();
  }
}//Fin AbreMaquina


void AlComienzo(){
  while(SComienzoState==LOW){ //Mientras no este en el comienzo se queda aca y saca
        digitalWrite(R2,LOW);
          LeoSensores();
  }
}//Fin AlComienzo

void LeoSensores(){
  SArribaState = digitalRead(SArriba);
  SFinState = digitalRead(SFin);
  SComienzoState = digitalRead(SComienzo);
}//Fin LeoSensores

void LeoBotones() {
  Bu1State = digitalRead(Bu1);
  Bu2State = digitalRead(Bu2);
  EBState = digitalRead(EB);
}//Fin LeoBotones

Mi problema es dentro de el proceso Ejecutar dentro del If que verifica si SFin esta activado que es un sensor de cerrado de la maquina.
Como hago para que dentro del proceso que esta ahí en paralelo verifique mi botón de emergencia?
Alguna idea?

Tu problema es simple. Se debe al mal uso de delay. Cuando usas delay esta función interrumpe la ejecución secuencial del programa, en procesos que requieren monitoreo como en tu caso, quedarse esperando 100, 200, mseg hace perder eventos y es inadmisible

La solución es que reemplaces cada delay por millis() usandolo del mismo que BlinkWithoutDelay del ejemplo del IDE.
Entonces tu programa se ejecuta practicamente cada mseg (supongamos) y cuando se da una condición de tiempo haces lo que debes.
Eso implica reescribir el código o pensarlo de otra manera, tal que cumplas con esos retardos pero puedas seguir y ver estados de pulsadores por ejemplo y nunca jamas demorando o deteniendo el programa.

Si no sabes como, te iremos guiando.

Bueno por lo visto encuentro un solo delay, pense cuando vi el primero que habia mas.
Asi que solo un delay de 100 mseg.

Algo que no me cierra, empiezas el loop y lees botones y luego si se cumple

  if (EBState == LOW){
      if ((Bu1State == HIGH) && (Bu2State == HIGH)){ //Botones Precionados

vuelve a leer botones? acá algo no esta bien en tu lógica. Te comprendo pero se puede optimizar.

Unica pregunta porque delay(100); y que prentendes con eso?

Ese delay despues lo quito, esta por que los botones que tengo evidentemente no son buenos y evidentemente no contactan de una entonces sin el delay me aparece como que se cierra y abre el circuito al apretarlos.
el problema esta aca.

if (SFinState==HIGH){
        Serial.println("Ejecutando");
        digitalWrite(R1,HIGH); //Si esta en el Fin Cierra y delay
        delay(T1);
        Serial.println("Abriendo y sacando");
        AbreMaquina();
        AlComienzo();
        Serial.println("Cerrando");
        digitalWrite(R1,HIGH); // Cierro y delay
        delay(T2);
        Serial.println("Abriendo");
        AbreMaquina();
        Serial.println("Termino");
        
    }//Termina Ciclo

Con respecto al Leo Botones, el que esta arriba esta demás quedo por probar algo y me lo olvide ahí.

Los delay T1 y T2 son por que la maquina debe permanecer en esa posición una determinada cantidad de tiempo y luego abrirse.
Esto es debido a que es una maquina de pegado por calor y debe cerrar la matriz y mantenerla asi un tiempo determinado para que enfrié y se pueda desmoldar y luego abrir.(este tiempo va a ser programable)

Lo mismo que surbyte esto esta mal planteado:

void loop() {
  // Lectura de botones
  LeoBotones();

  if (EBState == LOW){
      if ((Bu1State == HIGH) && (Bu2State == HIGH)){ //Botones Precionados
        ejecutar();

Alguna vez llega a ejecutar()?

pon un Serial.println("Antes de ejecutar"); y nos cuentas si es que llega a mostrarse ese mensaje

Hola...

Tu problema es muy sencillo, solo dibuja un diagrama diciendo que es lo que quieres hacer.

Necesitas Esta libreria

Y algunos Ifs en el loop principal para que dependiendo de su estado llamen a una subrutina;

If (btn1 == on && btn2 ==on) subrutina1 
//etc. 

If(paroEmergencia == ON ) sub_apagado

Basicamenta seria lo unico en tu loop... de ahi, llamas a lo que quieras hacer ccon cada boton, o con una combinación de los dos.

-Alex-