Iniciar procesos en loop despues de haber validado contraseña con teclado 4x4

:o Hola buenas tardes, tengo un pequeño problemita! estoy haciendo un proyecto de una maquina bobinadora de cobre,... veran, me pidieron que le colocara un sistema de seguridad! y encontre un codigo el cual lo quiero implementar, se usa con las librerias Keypad (no la keypad que trae el IDE de arduino si no otra) y la librería password, entonces quisiera saber como hacer, que despues que ingrese la contraseña inicien los procesos y se queden en loop, ya que lo he intentado varias veces y pues después de validar se ejecuta una sola vez y lo que quiero es que después que valide la contraseña inicie el proceso en loop... hasta que yo reinicie la placa y se bloquee nuevamente o implementar la funcion de bloqueo...

no se si me di a entender, espero sus prontas respuestas jeje me queda poco tiempo para presentarlo y perdi mucha practica con arduino (un año para ser exacto)

aqui el codigo...:

#include <LiquidCrystal.h>

#include <Keypad.h> //Libreria Keypad para el teclado Matricial.
#include <Password.h> //Libreria Password para definir cual es la clave de acceso.

Password password = Password( "1234" ); //Definimos nuestro Password


int ledRojo = 22;
int ledVerde = 23;

const byte ROWS = 4; // Cuatro Filas
const byte COLS = 4; // Cuatro Columnas

// Definimos el Keymap
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[ROWS] = { 31,30,29,28 };// Conectar los keypads ROW1, ROW2, ROW3 y ROW4 a esos Pines de Arduino.
byte colPins[COLS] = { 27,26,25,24, };// Conectar los keypads COL1, COL2, COL3 y COL4 a esos Pines de Arduino.


// Creamos el Keypad
Keypad key = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

///////////////////////////////////////////////////////////////////////////////


               /* RS, E,  D4, D5,  D6,  D7 */
LiquidCrystal lcd(7,  8,  9, 10,  11,  12);
 
int variable = 0;  // usadas para el sistema anti-rebote
int variable2 = 0;
 
unsigned long contadorVueltas = 0; // las que lleva hechas
unsigned long vueltas_a_hacer = 1; // las vueltas que hará, definidas por el usuario
unsigned long numeroMaximoVueltas = 4294967295;  // 2 ^32 , el tamaño máximo de un unsigned long ( del 0 al 4294967295)
int sensibilidad = 20;    // sensibilidad para el contador de vueltas. A menor número, más sensible
int sensibilidad2 = 80; // sensibilidad para el marcha/paro. A menor número, más sensible
 
int marcha = 0; // el estado del botón marcha/paro
int delay_anti_rebote = 80;
 
int vueltasHechas = 0;
int luzFinalizado = 5;
int motor = 6;
int sensorContador = 2;
int marchaParo = 3;
int botonSubirVueltas = A0;
int botonBajarVueltas = A1;

int bobinador = 4;
int estado = 0;

void setup()
{ 
  attachInterrupt(0, contar, FALLING); // IRQ 0 = pin 2 , saltará a la función " contar "  , cuando la señal " caiga "  ( pase de 1 a 0 ). Lo he puesto así para que hubiese un poco más de variedad :P
  attachInterrupt(1, encender_apagar, RISING); // IRQ 1 = pin3, saltará a la función " encender_apagar" cuando la señal " suba " ( pase de 0 a 1 )
  pinMode( sensorContador,INPUT); // IRQ 0 
  pinMode( marchaParo,INPUT); // IRQ 1
  pinMode(motor,OUTPUT);
  pinMode(luzFinalizado,OUTPUT); // cuando llegue a las vueltas indicadas, se pondrá a parpadear
  lcd.begin(16,2);
  Serial.begin(9600);

  pinMode(bobinador, OUTPUT);
  
  key.addEventListener(keypadEvent); //Adicionamos un Evento listener para este keypad
  
  pinMode(ledRojo, OUTPUT);  
  pinMode(ledVerde, OUTPUT);
  
  digitalWrite(ledRojo, LOW);
  digitalWrite(ledVerde, LOW); 

  lcd.print("   Bienvenid@   ");lcd.setCursor(0,0);
  delay(2000);
  lcd.clear();
  delay(500);
  lcd.print("Iniciando. ");lcd.setCursor(0,0);
  delay(500);
  lcd.print("Iniciando.. ");lcd.setCursor(0,0);
  delay(500);
  lcd.print("Iniciando... ");lcd.setCursor(0,0);
  delay(500);
  lcd.print("Iniciando.... ");lcd.setCursor(0,0);
  Serial.print("Ingresar Contraseña");
  delay(2000);
  lcd.clear(); 
}
 
 
void loop(){
    key.getKey();
  
    lcd.setCursor(0,0);
    lcd.print("A hacer: ");
    lcd.setCursor(0,1);
    lcd.print(" Hechas: ");
 
    lcd.setCursor(10,0);
    lcd.print(vueltas_a_hacer);
 
    lcd.setCursor(10,1);
    lcd.print(contadorVueltas);
     
     
    int sensor_subir_vueltas = digitalRead(botonSubirVueltas);
    int sensor_bajar_vueltas = digitalRead(botonBajarVueltas);
     
   if(sensor_subir_vueltas == 1)      // incrementamos vueltas
    {
      delay(delay_anti_rebote); // anti-rebote
      int sensor_subir_vueltas = digitalRead(botonSubirVueltas);
        
       if(sensor_subir_vueltas == 1)   
       {
         vueltas_a_hacer++;
       }
    }
     
    if(sensor_bajar_vueltas == 1 && (vueltas_a_hacer  > contadorVueltas)) // decrementamos vueltas 
    {
      delay(delay_anti_rebote);
      int sensor_bajar_vueltas = digitalRead(botonBajarVueltas);
       
        if(sensor_bajar_vueltas == 1 && (vueltas_a_hacer  > contadorVueltas ) && (vueltas_a_hacer > 1))
        {
          vueltas_a_hacer--;
          lcd.setCursor(10,0);
          lcd.print("     ");
        }  
    }
 
    if(vueltas_a_hacer == contadorVueltas && marcha == 1) // hacemos el efecto de aviso
    {
      vueltasHechas= 1;  // ya se han hecho todas las vueltas
      digitalWrite(motor,LOW); // paramos el motor
      digitalWrite(bobinador, LOW);
      digitalWrite(luzFinalizado,HIGH);
      delay(400);
      digitalWrite(luzFinalizado,LOW);
      delay(400); 
    }
     
    else if(vueltas_a_hacer != contadorVueltas) // limpiamos la variable que avisa que se han hecho las vueltas en caso de que no se hagan, así podremos incrementar el sistema y seguir usándola
    {
     vueltasHechas = 0;
    }
  
  
  
    if(contadorVueltas >= numeroMaximoVueltas)
    {
      Serial.println("Desbordamiento");
    }
     
   if(variable < sensibilidad) // sistema anti-rebote para interrupción del contador de vueltas ( así no hace falta tiempo )
    { 
      variable++; 
    }  
     
    if(variable2 < sensibilidad2) // sisema anti-rebote para la interrupción de marcha/paro
     { 
      variable2++; 
     } 
}
//************************************************************************* ISR ***************************************************************************************************************************
 
 
 
void contar()  // esta es la función a la que saltará nuestro Arduino cuando se active la interrupción en el pin 2 de nuestro Arduino
{
  if((variable >= sensibilidad) && (contadorVueltas < numeroMaximoVueltas) && marcha == 1 && vueltasHechas == 0)  
  {
    contadorVueltas++;
    variable = 0;
  }
}
 
 
void encender_apagar()  // esta es la función a la que saltará nuestro Arduino cuando se active la interrupción en el pin 3 de nuestro Arduino
{
  if(variable2 >= sensibilidad2)
  {
    if(marcha == 1)
      {
        marcha = 0;
        digitalWrite(motor,LOW);
        digitalWrite(bobinador, LOW);
      } 
    else if(marcha == 0)
      {
        marcha = 1;
        digitalWrite(motor,HIGH);
        digitalWrite(bobinador, HIGH);
      }
       
       variable2 = 0;
  }
}

aqui el codigo del keypad (este esta en otra pestaña para acortar un poco el codigo)

//Tenemos cuidado de algunos eventos especiales
void keypadEvent(KeypadEvent eKey){
  switch (key.getState()){
    case PRESSED:
  Serial.print("Pressed: ");
  Serial.println(eKey);
  switch (eKey){
    case '*': checkPassword(); break;
    case '#': password.reset(); break;
    default: password.append(eKey);
     }
  }
}

void checkPassword(){
  if (password.evaluate()){
    Serial.println("Validado!"); //Adicionamos nuestro Codigo a ejecutar si esto SI trabaja
    digitalWrite(ledRojo, LOW);
    digitalWrite(ledVerde, HIGH);
    delay(1500);
    digitalWrite(ledRojo, LOW);
    digitalWrite(ledVerde, LOW);
  }else{
    Serial.println("Error!"); //Adicionamos nuestro Codigo a ejecutar si esto NO trabaja
    digitalWrite(ledRojo, HIGH);
    digitalWrite(ledVerde, LOW);
  }
}

Ya que tienes esta función password.evaluate() que te devuelve TRUE cuando la clave esta bien, porque no la usas en las funciones que quieres proteger y listo?

O como alternativa, deja todo como esta, agrega una variable global del tipo bool como ser

bool passOk = false;

y en tu código cada vez que deba hacer alguna función crítica te aseguras que pasOk sea True y solucionado de nuevo.

Ambas son soluciones similares.