Fallas con el keypad durante la ejecución del loop

Hola

Me complace saludarles y con la molestia de solicitarles ayuda, resumo breve mente que estoy realizando mi primer proyecto en ARDUINO MEGA, consiste en una camara de cuidados neonatales.

El programa inicia con 4 preguntas con los cuales introduciremos datos y/o parametros por medio de un teclado matricial, esto últimos los utilizamos para trabajar en el loop, el problema que tengo es durante la ejecución del loop , quiero utilizar el keypad para encender y/o apagar un rele.
Hice una prueba queriendo solo imprimir el caracter del teclado en el monitor pero presento problemas como :

Problemas con el tiempos del delay
No entra a tiempo la tecla
No entra ninguna letra
Aveces dejo presionada la tecla mucho tiempo y funciona

De antemano muchas gracias por su atención y esperando se encuentren bien de salud durante esta epidemia , manténganse seguros.

adjunto mi sketch

#include <Key.h> ////libreria del teclado 
#include <Keypad.h>
#include <LiquidCrystal_I2C.h> // Libreria LCD_I2C

LiquidCrystal_I2C lcd(0x27,20,4); // si no te sale con esta direccion  puedes usar (0x3f,16,2) || (0x27,16,2)  ||(0x20,16,2) 
const byte FILAS = 4;      // define numero de filas
const byte COLUMNAS = 4;    // define numero de columnas

char keys[FILAS][COLUMNAS] = {    // define la distribucion de teclas
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte pinesFilas[FILAS] = {24, 26, 28, 30};    // pines correspondientes a las filas
byte pinesColumnas[COLUMNAS] = {32, 34, 36, 38}; // pines correspondientes a las columnas
Keypad teclado = Keypad(makeKeymap(keys), pinesFilas, pinesColumnas, FILAS, COLUMNAS);  // crea objeto
#include "DHT.h"
#define DHTPIN 10      // define sensor en pin 10
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

const int rele = 4;   /// pines de los rele NO LOS USO POR EL MOMENTO HASTA RESOLVER EL ENCENDIDO CON EL TECLADO 
const int rele2 = 3;




char TECLA = ' ';       // almacena la tecla presionada
char CLAVE[2];        // almacena en un array 2 digitos ingresados
int INDICE = 0;      // indice del array

char TECLA2 = ' ';       // almacena la tecla presionada
char CLAVE2[2];        // almacena en un array 2 digitos ingresados
int INDICE2 = 0;      // indice del array


char TECLA3 = ' ';       // almacena la tecla presionada
char CLAVE3[2];        // almacena en un array 2 digitos ingresados
int INDICE3 = 0;      // indice del array

char TECLA4 = ' ';
char CLAVE4[2];        // almacena en un array 2 digitos ingresados
int INDICE4 = 0;      // indice del array

char TECLA5 = ' ';    /////  ALMACEN PARA LA TECLA PRESIONADA

int tempmax = 0;
int humeminima = 0;
int humedadmax = 0;
int tempmin = 0;
 





/////////////////////////////////// SET UP///////////////////////////////////////////////////////////
 void setup() {  //// mi setuo de inicio 

  Serial.begin(9600);
  lcd.init();
  lcd.begin(20, 4);
  lcd.backlight();
  Bienvenida();
  
  Pregunta1();
  Pregunta3();
  Pregunta2();
  Pregunta4();
 
  
 }




void Bienvenida()
{
   lcd.clear();
  lcd.setCursor(1, 0);
  lcd.print("*** Bienvenido *** ");
  lcd.setCursor(1,1);
  lcd.print("  ** NeoCan **  ");
  lcd.setCursor(2,2);
  lcd.print("by: Brandon Loo");
  delay(6000);
  
}

void Pregunta1()
 {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Ingrese Temp Max:");
  
  while(TECLA != '#'){
    TECLA = teclado.getKey();
    if(TECLA){
      CLAVE[INDICE] = TECLA;    // almacena en array la tecla presionada
    INDICE++;       // incrementa indice en uno
    lcd.setCursor(INDICE,1);
    lcd.print(TECLA);  
      
    }
    
  }
  tempmax = (String(CLAVE[0]).toInt()*10) + String(CLAVE[1]).toInt();
   
 }

 void Pregunta2()
 {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Ingrese Humedad Min:");
  while(TECLA2 != '#'){
    TECLA2 = teclado.getKey();
    if(TECLA2){
      CLAVE2[INDICE2] = TECLA2;    // almacena en array la tecla presionada
    INDICE2++;       // incrementa indice en uno
    lcd.setCursor(INDICE2,1);
    lcd.print(TECLA2);  
        
    }
  }
  humeminima = (String(CLAVE2[0]).toInt()*10) + String(CLAVE2[1]).toInt();
   
 }

void Pregunta3()
 {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Ingrese Temp Min:");
  while(TECLA3 != '#'){
    TECLA3 = teclado.getKey();
    if(TECLA3){
      CLAVE3[INDICE3] = TECLA3;    // almacena en array la tecla presionada
    INDICE3++;       // incrementa indice en uno
    lcd.setCursor(INDICE3,1);
    lcd.print(TECLA3);  
        
    }
  }
  tempmin = (String(CLAVE3[0]).toInt()*10) + String(CLAVE3[1]).toInt();
   
 }

void Pregunta4()
 {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Ingrese Hume Max:");
  
  while(TECLA4 != '#'){
    TECLA4 = teclado.getKey();
    if(TECLA4){
      CLAVE4[INDICE4] = TECLA4;    // almacena en array la tecla presionada
    INDICE4++;       // incrementa indice en uno
    lcd.setCursor(INDICE4,1);
    lcd.print(TECLA4);  
      
    }
    
  }
  humedadmax = (String(CLAVE4[0]).toInt()*10) + String(CLAVE4[1]).toInt();
   
 }



 /////////////////////////////////////////////////////////////////////// LOOP ///////////////////////////////////////////////////////
void loop() {
 
  
   
  int h = dht.readHumidity();
  int c = dht.readTemperature();

  lcd.clear();
  dht.begin(); 
  lcd.setCursor(0,0);
  lcd.print("Temp:");
  lcd.print(c);
  lcd.setCursor(9,0);
  lcd.print("Humedad:");
  lcd.print(h);
  lcd.print("%");
  lcd.setCursor(0,1);
  lcd.print("MIN-MAX");
  lcd.setCursor(0,2);
  lcd.print(tempmin);
  lcd.setCursor(3,2);
  lcd.print("<>");
  lcd.setCursor(6,2);
  lcd.print(tempmax);
  lcd.setCursor(10,1);
  lcd.print("MIN-MAX");
  lcd.setCursor(10,2);
  lcd.print(humeminima);
  lcd.setCursor(13,2);
  lcd.print("<>");
  lcd.setCursor(16,2);
  lcd.print(humedadmax);
  lcd.setCursor(0,3);
  lcd.print("LAMP(A)  UV(B)");
  
/////delay(5000); TENGO DUDAS EN DELAYS 

  if(c>= tempmax){
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Ventilador ON");
  delay(1000); 
  digitalWrite(rele,HIGH);
  
  
  }else{
  digitalWrite(rele,LOW);
  }
   if(h<=humeminima){
    lcd.clear();
    lcd.setCursor(0,2);
    lcd.print("Humedad ON");
  delay(1000); 
  digitalWrite(rele2,HIGH);
  
  
  }else{
  digitalWrite(rele2,LOW);
  
  }
   if(c<=tempmin){  
    lcd.clear();
    lcd.setCursor(0,2);
    lcd.print("Foco ON");
  delay(1000); 
  /////digitalWrite(rele2,HIGH); definir rele ::: DESACTIVADOS LOS RELES MIENTRAS CORRIGO MIS FALLAS

  
  
  }else{
  //// digitalWrite(rele2,LOW); definir rele


  }
  ///////////////////// PRUEBAS PARA VER SI ENTRA EL TECLADO Y POR ENDE PODER ENCEDER UN RELE //////////////
  TECLA5 = teclado.getKey();
    Serial.print("Valor de Tecla5 = ");
    Serial.println(TECLA5);
    if (TECLA5 =='A')
      {
      Serial.println("entro a la a ");
      }
      
    else if (TECLA5 =='B')
      {
      Serial.println("entro a la b ");
      }
delay(500);


 }

Basicamente tienes el problema del uso de delay() todo lo que incluye delay siempre termina mal.

delay() detiene la ejecucion del programa y si tienes demoras muy largas no esperes que una tecla reaccione cuando lo esperes.

Te diré como puedes resolverlo.
Empieza leyendo esto

Ve a Documentación => Indice de temas tutoriales => millis() y máquina de estados

y luego hablamos si lo has entendido o no, pero el reemplazo de delay() por millis() y máquina de estados es tu solución.

Hola , perdona la tardanza .

voy viendo tu respuesta me parece que si tienes razón y la agradezco bastante , déjame me doy un vuelta sobre el tema en el foro donde me recomendaste y si llego a tener dudas tenme paciencia si te vuelvo a consultar, muy amable compañero .