Botón de paro. Duda

Buenos tardes gente del foro, les escribo ya que tengo una duda, estoy programando un arduino mega para una puerta que active y desactive una cerradura magnetica por medio de una contraseña (con teclado matricial) o un botón de emergencia. Todo me funciona bien, excepto por la parte del botón, no se como meterlo en el código para que pueda desbloquear la cerradura en todo momento.
Tengo un pequeño programa de prueba funcionando, o me detecta el botón o me detecta el teclado y funciona bien, lo anexo.

/* @file CustomKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact alexanderbrevig@gmail.com
||
|| @description
|| | Demonstrates changing the keypad size and key values.
|| #
*/
#include <Keypad.h>
int led = 49;
boolean estadoactual = 7;
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {22, 23, 24, 25}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {26, 27, 28, 29}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

void setup(){
  Serial.begin(9600);
  pinMode(7, INPUT);
  pinMode(49, OUTPUT);
  estadoactual = digitalRead(6);
  digitalWrite(led, LOW);
}
  
void loop(){
  char customKey = customKeypad.getKey();
  estadoactual = digitalRead(6);
  if (estadoactual == true)
  {
    digitalWrite(led, HIGH);
    Serial.print("El estado del boton es: ");
    Serial.println(estadoactual);
    estadoactual = digitalRead(6);
    //delay(250);
  }

    Serial.print("El estado del boton es: ");
    digitalWrite(led, LOW);
    Serial.println(estadoactual);
    estadoactual = digitalRead(6);
    //delay(250);

  if (customKey){
    Serial.println(customKey);
  }
}

Usé la misma lógica para el código que estoy haciendo pero no me funciono, intente con switch y me pasa lo mismo, se queda esperando a que teclee en el keypad.

Básicamente lo que hace el programa que estoy haciendo (el que se encuentra a continuación) lee un txt de una memoria SD y su contenido lo copia en un arreglo y después en el loop, captura 6 dígitos obtenidos del keypad, compara y si encuentra coincidencia con las que existen en el txt permite el acceso, sino lo niega. Toda esta parte funciona bien, mi problema esta en el botón, no se como programarlo para que pueda reaccionar siempre que se presione sin importar en donde se encuentre el programa.

#include <LiquidCrystal.h>
#include <Keypad.h>
#include <SPI.h>
#include <SD.h>
char txt[500];
const int chipSelect = 4;
int i;
int puerta = 49;
int buz = 3;
boolean estadoactual = 6;
int v = ',';
const byte rows=4;
const byte cols=4;
int ledv= A2;
int ledr= A3;
char customKey;

char keys[rows][cols]=  //crear el teclado como en fisico
{
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowpins[rows]={22, 23, 24, 25};  //pines para las filas 1234
byte colpins[cols]={26, 27, 28, 29};  //pines para las columnas ABCD

//crea y nombra el teclado
Keypad customKeypad = Keypad(makeKeymap(keys),rowpins,colpins,rows,cols);
Keypad kpd = Keypad(makeKeymap(keys),rowpins,colpins,rows,cols);
LiquidCrystal lcd(8, 9, 10, 11, 12, 13); //inicializo lcd
//                rs,e,D4,D5,D6,D7
char pss1[6],pss2[6];
void setup()
{
  Serial.begin(9600);
  pinMode(3, OUTPUT);
  pinMode(6, INPUT);
  pinMode(5, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);
  lcd.begin(16,2);
  analogWrite(ledv,LOW);
  analogWrite(ledr,LOW);
  digitalWrite(puerta, HIGH);

  //LCD: Saludo inicial
  lcd.begin(16, 2);
  lcd.setCursor(6,0);
  lcd.print("Anmo");
  lcd.setCursor(2,1);
  lcd.print("Technologies");
  delay(3000);
  lcd.clear();
  delay(500);
  lcd.setCursor(1,0);  
  lcd.print("Buenas tardes");
  lcd.setCursor(0,0);
  delay(1500);
  lcd.clear(); 


//Lectura del SD
while(!Serial){
  ;
 }
 Serial.print("Initializing SD card...");
 if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    return;
 }
 Serial.println("card initialized.");
 File dataFile = SD.open("pass2.txt");

  // Si el archivo esta disponible, lo guarda en el arreglo txt
  if (dataFile) {
    for (i = 0; i <= 500; i++)
      {
        txt[i] = dataFile.read();
        Serial.print(txt[i]);
        analogWrite(ledv,255);
      }
    }
  
  // if the file isn't open, pop up an error:
  else
  {
    Serial.println("error opening pass2");
  }

  delay(250);
  analogWrite(ledv,0);
  analogWrite(ledr,0);
}



void loop()
{
  int i;
  digitalWrite(puerta, HIGH);
  estadoactual = digitalRead(6);
   
    analogWrite(ledr,0);
    lcd.setCursor(0,0);
    lcd.print("PUERTA BLOQUEADA");
    lcd.setCursor(4,1);

 
    //Inicio de codigo para botón
    if (estadoactual == true)
        {
          Serial.print("Puerta abierta 1. Estado actual:   ");
          Serial.println(estadoactual);
          estadoactual = digitalRead(6);
          lcd.clear();
          delay(50);
          lcd.setCursor(4,0);
          lcd.print("Puerta");
          lcd.setCursor(5,1);
          lcd.print("Abierta");
          digitalWrite(puerta, LOW);
          delay(5000);
          lcd.clear();
          delay(50);
          digitalWrite(puerta, HIGH);
          lcd.setCursor(0,0);
          lcd.print("PUERTA BLOQUEADA");
          lcd.setCursor(4,1);
        }//Fin de boton



      if (customKey)
      {
        for(i=1;i<=6;i++)
        {
          pss1[i]=kpd.waitForKey();
          tone(buz, 3500);
          lcd.print("*");
          delay(150);        
          noTone(buz);
        }
      }

      
    lcd.clear();
    delay(100);
    lcd.setCursor(4,0);
    lcd.print("Buscando...");
    estadoactual = digitalRead(6);
    delay(1000);
    //Lee el arreglo (txt)
    for (ii = 1; ii <= 500; ii++)
    {

      //Si encuentra una contraseña (coma) en el txt
      if (txt[ii] == v)
      {
        
        //Guarda los siguientes 6 valores del txt en el arreglo pass2[] (Datos de la contraseña del txt).
        for(iii = 1; iii < 7; iii++)
        {
          pss2[iii] = txt[ii+iii];
        }
        
        //Ciclo for para comparar las contraseñas, del txt con la introducida
        for(k=0;k<=5;k++)
        {
          //Compara las contraseñas, las del txt con la introducida, si coinciden los 4 caracteres suma 1 a w de lo contrario resetea w a 0.
          if(pss1[k]==pss2[k])
          {
            w++;
          }
          
          else
          {
            w = 0;
          }
        }

        //Si encuentra una contraseña que coincida con el txt permite el acceso
        if(w==6)
        {
          delay(1000);
          lcd.clear();
          delay(50);
          analogWrite(ledv,255);
          tone(buz,2000);
          lcd.setCursor(2,0);
          lcd.print("PASS CORRECTO");
          lcd.setCursor(0,1);
          lcd.print("ACCESO PERMITIDO");
          digitalWrite(puerta, LOW);
          delay(700);
          noTone(buz);
          delay(4300);
          digitalWrite(puerta, HIGH);
          analogWrite(ledv,0);         
          w = 0;
          break;
          break;
        }
      
      else
        {
          delay(1000);
          analogWrite(ledr,255);
          lcd.clear(); 
          tone(buz,800);
          lcd.setCursor(1,0);
          lcd.print("ERROR DE CODIGO");
          lcd.setCursor(0,1);
          lcd.print("INTENTE DE NUEVO");
          delay(700);
          noTone(buz);
          delay(2300);
          break;
        }
      }
    }  
}

Prueba asi, tenías varias variables sin definir

#include <Wire.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
#include <SPI.h>
#include <SD.h>
char txt[500];
const int chipSelect  = 4;
int i;
int w;
int puerta            = 49;
int buz               = 3;
boolean estadoactual  = 6;
int v                 = ',';
const byte rows       = 4;
const byte cols       = 4;
int ledv              = A2;
int ledr              = A3;
char customKey;

char keys[rows][cols]=  //crear el teclado como en fisico
{
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowpins[rows]={22, 23, 24, 25};  //pines para las filas 1234
byte colpins[cols]={26, 27, 28, 29};  //pines para las columnas ABCD

//crea y nombra el teclado
Keypad customKeypad = Keypad(makeKeymap(keys),rowpins,colpins,rows,cols);
Keypad kpd = Keypad(makeKeymap(keys),rowpins,colpins,rows,cols);
LiquidCrystal lcd(8, 9, 10, 11, 12, 13); //inicializo lcd
//                rs,e,D4,D5,D6,D7
char pss1[6],pss2[6];
void setup()
{
  Serial.begin(9600);
  pinMode(3, OUTPUT);
  pinMode(6, INPUT);
  pinMode(5, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);
  lcd.begin(16,2);
  analogWrite(ledv,LOW);
  analogWrite(ledr,LOW);
  digitalWrite(puerta, HIGH);

  //LCD: Saludo inicial
  lcd.begin(16, 2);
  lcd.setCursor(6,0);
  lcd.print("Anmo");
  lcd.setCursor(2,1);
  lcd.print("Technologies");
  delay(3000);
  lcd.clear();
  delay(500);
  lcd.setCursor(1,0);  
  lcd.print("Buenas tardes");
  lcd.setCursor(0,0);
  delay(1500);
  lcd.clear(); 


//Lectura del SD
while(!Serial){
  ;
 }
 Serial.print("Initializing SD card...");
 if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    return;
 }
 Serial.println("card initialized.");
 File dataFile = SD.open("pass2.txt");

  // Si el archivo esta disponible, lo guarda en el arreglo txt
  if (dataFile) {
    for (i = 0; i <= 500; i++)
      {
        txt[i] = dataFile.read();
        Serial.print(txt[i]);
        analogWrite(ledv,255);
      }
    }
  
  // if the file isn't open, pop up an error:
  else
  {
    Serial.println("error opening pass2");
  }

  delay(250);
  analogWrite(ledv,0);
  analogWrite(ledr,0);
}



void loop()
{
  int i;
  digitalWrite(puerta, HIGH);
  estadoactual = digitalRead(6);
   
  analogWrite(ledr,0);
  lcd.setCursor(0,0);
  lcd.print("PUERTA BLOQUEADA");
  lcd.setCursor(4,1);


  //Inicio de codigo para botón
  if (estadoactual == true)   {
      Serial.print("Puerta abierta 1. Estado actual:   ");
      Serial.println(estadoactual);
      estadoactual = digitalRead(6);
      lcd.clear();
      delay(50);
      lcd.setCursor(4,0);
      lcd.print("Puerta");
      lcd.setCursor(5,1);
      lcd.print("Abierta");
      digitalWrite(puerta, LOW);
      delay(5000);
      lcd.clear();
      delay(50);
      digitalWrite(puerta, HIGH);
      lcd.setCursor(0,0);
      lcd.print("PUERTA BLOQUEADA");
      lcd.setCursor(4,1);
  }//Fin de boton

  if (customKey) {
      for(i=1;i<=6;i++) {
        pss1[i]=kpd.waitForKey();
        tone(buz, 3500);
        lcd.print("*");
        delay(150);        
        noTone(buz);
      }
  }

      
  lcd.clear();
  delay(100);
  lcd.setCursor(4,0);
  lcd.print("Buscando...");
  estadoactual = digitalRead(6);
  delay(1000);
  //Lee el arreglo (txt)
  for (int ii = 1; ii <= 500; ii++) {
    //Si encuentra una contraseña (coma) en el txt
    if (txt[ii] == v)   {
        //Guarda los siguientes 6 valores del txt en el arreglo pass2[] (Datos de la contraseña del txt).
        for(byte iii = 1; iii < 7; iii++)   {
          pss2[iii] = txt[ii+iii];
        }
        
        //Ciclo for para comparar las contraseñas, del txt con la introducida
        for(byte k=0;k<=5;k++)    {
          //Compara las contraseñas, las del txt con la introducida, si coinciden los 4 caracteres suma 1 a w de lo contrario resetea w a 0.
          if(pss1[k]==pss2[k])  {
            w++;
          }
          else  {
            w = 0;
          }
        }

        //Si encuentra una contraseña que coincida con el txt permite el acceso
        if (w == 6)  {
            delay(1000);
            lcd.clear();
            delay(50);
            analogWrite(ledv,255);
            tone(buz,2000);
            lcd.setCursor(2,0);
            lcd.print("PASS CORRECTO");
            lcd.setCursor(0,1);
            lcd.print("ACCESO PERMITIDO");
            digitalWrite(puerta, LOW);
            delay(700);
            noTone(buz);
            delay(4300);
            digitalWrite(puerta, HIGH);
            analogWrite(ledv,0);         
            w = 0;
        }
        else {
            delay(1000);
            analogWrite(ledr,255);
            lcd.clear(); 
            tone(buz,800);
            lcd.setCursor(1,0);
            lcd.print("ERROR DE CODIGO");
            lcd.setCursor(0,1);
            lcd.print("INTENTE DE NUEVO");
            delay(700);
            noTone(buz);
            delay(2300);
        }
      }
  }  
}

Para comenzar tu código no compilaba.
Segundo no tiene comentarios y no se comprende que haces porque esta todo mezclado, botón y keypad.

No veo como lee el keypad pq customkey cuando se activa?

Gracias por el aporte, estuve intentando de muchas maneras pero siempre se me quedaba el programa esperando por el teclado, no encontré como resolverlo y mejor el botón (es un push) opte por conectarlo en serie a la cerradura magnética, así me evito la programación y desactiva en cualquier momento. Gracias por su tiempo de todos modos, se agradece.
Por cierto, vi que agrego la librería wire.h puedo preguntarle para que sirve? o en que ayuda?

A ver como va esto:

#include <Wire.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
#include <SPI.h>
#include <SD.h>


char txt[500];
const byte chipSelect = 4;
const byte botonPin   = 6;
int i;
int w;
int puerta            = 49;
int buz               = 3;
boolean estadoactual  = 6;
int v                 = ',';
const byte rows       = 4;
const byte cols       = 4;
int ledv              = A2;
int ledr              = A3;
char customKey;

char keys[rows][cols]=  //crear el teclado como en fisico
{
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowpins[rows]={22, 23, 24, 25};  //pines para las filas 1234
byte colpins[cols]={26, 27, 28, 29};  //pines para las columnas ABCD

//crea y nombra el teclado
Keypad customKeypad = Keypad(makeKeymap(keys),rowpins,colpins,rows,cols);
Keypad kpd = Keypad(makeKeymap(keys),rowpins,colpins,rows,cols);
LiquidCrystal lcd(8, 9, 10, 11, 12, 13); //inicializo lcd
//                rs,e,D4,D5,D6,D7
char pss1[6],pss2[6];


void setup() {
  
  Serial.begin(9600);
  pinMode(3, OUTPUT);
  pinMode(botonPin, INPUT);
  pinMode(5, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);
  lcd.begin(16,2);
  analogWrite(ledv,LOW);
  analogWrite(ledr,LOW);
  digitalWrite(puerta, HIGH);

  //LCD: Saludo inicial
  lcd.begin(16, 2);
  lcd.setCursor(6,0);
  lcd.print("Anmo");
  lcd.setCursor(2,1);
  lcd.print("Technologies");
  delay(3000);
  lcd.clear();
  delay(500);
  lcd.setCursor(1,0);  
  lcd.print("Buenas tardes");
  lcd.setCursor(0,0);
  delay(1500);
  lcd.clear(); 


  //Lectura del SD
  while(!Serial);

  Serial.print("Initializing SD card...");
  
  if (!SD.begin(chipSelect)) {
      Serial.println("Card failed, or not present");
      return;
  }
  Serial.println("card initialized.");
  File dataFile = SD.open("pass2.txt");

  // Si el archivo esta disponible, lo guarda en el arreglo txt
  if (dataFile) {
      for (i = 0; i <= 500; i++) {
           txt[i] = dataFile.read();
           Serial.print(txt[i]);
           analogWrite(ledv,255);
      }
  }
  // if the file isn't open, pop up an error:
  else {      
    Serial.println("error opening pass2");
  }

  delay(250);
  analogWrite(ledv,0);
  analogWrite(ledr,0);
}



void loop() {
  int i;

  digitalWrite(puerta, HIGH);
  estadoactual = digitalRead(botonPin);
   
  analogWrite(ledr,0);
  
  lcd.setCursor(0,0);
  lcd.print("PUERTA BLOQUEADA");
  lcd.setCursor(4,1);

  //Inicio de codigo para botón
  if (estadoactual)   {
      Serial.print("Puerta abierta 1. Estado actual:   ");
      lcd.clear();
      delay(50);
      lcd.setCursor(4,0);
      lcd.print("Puerta");
      lcd.setCursor(5,1);
      lcd.print("Abierta");
      digitalWrite(puerta, LOW);
      delay(5000);
      lcd.clear();
      delay(50);
      digitalWrite(puerta, HIGH);
      lcd.setCursor(0,0);
      lcd.print("PUERTA BLOQUEADA");
      lcd.setCursor(4,1);
  }//Fin de boton

  char key = keypad.getKey();

  if (key != NO_KEY){ // verifica si no se pierde la primer tecla
    
      for (i=1;i<=6;i++) {
          pss1[i] = kpd.waitForKey();
          tone(buz, 3500);
          lcd.print("*");
          delay(150);        
          noTone(buz);
      }
      leo_SD_y_comparo();
  }
}

void leo_SD_y_comparo() {
  lcd.clear();
  delay(100);
  lcd.setCursor(4,0);
  lcd.print("Buscando...");
  estadoactual = digitalRead(botonPin);
  delay(1000);

  //Lee el arreglo (txt)
  for (int ii = 1; ii <= 500; ii++) {
    //Si encuentra una contraseña (coma) en el txt
    if (txt[ii] == v)   {
        //Guarda los siguientes 6 valores del txt en el arreglo pass2[] (Datos de la contraseña del txt).
        for(byte iii = 1; iii < 7; iii++)   {
          pss2[iii] = txt[ii+iii];
        }
        
        //Ciclo for para comparar las contraseñas, del txt con la introducida
        for(byte k=0;k<=5;k++)    {
          //Compara las contraseñas, las del txt con la introducida, si coinciden los 4 caracteres suma 1 a w de lo contrario resetea w a 0.
          if(pss1[k]==pss2[k])  {
            w++;
          }
          else  {
            w = 0;
          }
        }

        //Si encuentra una contraseña que coincida con el txt permite el acceso
        if (w == 6)  {
            delay(1000);
            lcd.clear();
            delay(50);
            analogWrite(ledv,255);
            tone(buz,2000);
            lcd.setCursor(2,0);
            lcd.print("PASS CORRECTO");
            lcd.setCursor(0,1);
            lcd.print("ACCESO PERMITIDO");
            digitalWrite(puerta, LOW);
            delay(700);
            noTone(buz);
            delay(4300);
            digitalWrite(puerta, HIGH);
            analogWrite(ledv,0);         
            w = 0;
        }
        else {
            delay(1000);
            analogWrite(ledr,255);
            lcd.clear(); 
            tone(buz,800);
            lcd.setCursor(1,0);
            lcd.print("ERROR DE CODIGO");
            lcd.setCursor(0,1);
            lcd.print("INTENTE DE NUEVO");
            delay(700);
            noTone(buz);
            delay(2300);
        }
      }
  }  
}