Problema con teclado matricial y sensores infrarrojos

¡Qué tal amigos buen día!
Tengo una consulta para todos ustedes, actualmente me encuentro haciendo un proyecto que une un teclado matricial, un lcd, sensores infrarrojos, limites de carrera y relevadores, el problema esta en los sensores infrarrojos, los cuales estuve checando un sketch, funcionan bien solitos, pero cuando quiero anexar ese mismo código a la función de una tecla con el teclado matricial, simplemente no funciona, y eh ahí mi duda, porque no funcionara, a continuación anexo el código con el que cheque los infrarrojos y también el código de todo mi proyecto:

(Cuando se presiona la tecla “#” en el “Código Proyecto“ del teclado matricial debería de hacer lo que el “Código Infrarrojos” hace, pero a ciencia cierta no hace nada, espero me puedan ayudar, saludos!!!).

---------Código Infrarrojos-------

int Inf1=A6;
int MSube=12;

void setup() {
pinMode(Inf1,INPUT);
pinMode(MSube,OUTPUT);
}

void loop() {

int EInf1=digitalRead(Inf1);
if(EInf1==LOW){
digitalWrite(MSube,HIGH);
}
if(EInf1==HIGH){
digitalWrite(MSube,LOW);
}
}

---------Código Proyecto----------

#include <LiquidCrystal.h>
#include <Keypad.h>

LiquidCrystal lcd(A0, A1, A2, A3, A4, A5);

const byte COLUMNAS = 4;
const byte FILAS = 4;

const byte filasPines[FILAS] = {9, 8, 7, 6}; //Define lineas
const byte columnasPines[COLUMNAS] = {5, 4, 3, 2}; //Define columnas

char teclas [FILAS] [COLUMNAS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};

int t=5;
int T=0;
int Contador=0;
int Contador1=0;
int Contador2=0;
int movimiento;
String numero1;
char operacion;
boolean valorActual = false;
boolean final = false;

//int LimS=10;
//int LimI=11;
int MSube=12;
int MBaja=13;

int Inf1=A6;
int Inf2=A7;
int Inf3=A8;
int Inf4=A9;
int Inf5=A10;

Keypad miTeclado = Keypad( makeKeymap(teclas), filasPines, columnasPines, FILAS, COLUMNAS );

void setup(){

lcd.begin(16,2);
lcd.setCursor(4,0);
lcd.print("INGRESE");
lcd.setCursor(3,1);
lcd.print("VALORES...");
delay(2500);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(">");
         
pinMode(MSube, OUTPUT);
pinMode(MBaja, OUTPUT);
//pinMode(LimS, INPUT);
//pinMode(LimI, INPUT);

pinMode(Inf1, INPUT);
pinMode(Inf2, INPUT);
pinMode(Inf3, INPUT);
pinMode(Inf4, INPUT);
pinMode(Inf5, INPUT);

attachInterrupt(digitalPinToInterrupt(21),Superior,FALLING);
attachInterrupt(digitalPinToInterrupt(20),Inferior,FALLING);

}

void loop(){

char tecla = miTeclado.getKey();
int longitudDelNumero;

if(tecla != NO_KEY && (tecla=='0'||tecla=='1'||tecla=='2'||tecla=='3'||tecla=='4'||
tecla=='5'||tecla=='6'||tecla=='7'||tecla=='8'||tecla=='9')){

numero1 = numero1 + tecla;
longitudDelNumero = numero1.length();
movimiento = longitudDelNumero;
lcd.setCursor(1, 0);
lcd.print(numero1);

}else if(tecla != NO_KEY &&(tecla=='A'||tecla=='B'||tecla=='C'||tecla=='D'||tecla=='*'||tecla=='#')){
 
 operacion=tecla;
 
 switch(operacion){
  case 'A':
    T=numero1.toInt();
    T=T/t;
    digitalWrite(MSube, LOW);
    lcd.clear();
    lcd.print("Subiendo ");
    delay(T*1000);
    lcd.clear();
    digitalWrite(MSube, HIGH);
    lcd.print("En posicion!!");
  break;
 
  case 'B':
    T=numero1.toInt();
    T=T/t;
    digitalWrite(MBaja, LOW);
    lcd.clear();
    lcd.print("Bajando ");
    delay(T*1000);
    lcd.clear();
    digitalWrite(MBaja, HIGH);
    lcd.print("En posicion!!");
  break;
  
  case 'C':
    digitalWrite(MSube, LOW);
    digitalWrite(MBaja, HIGH);
    Contador++;
    if(Contador==2){
      digitalWrite(MSube, HIGH);
      Contador=0;
    }
  break;
  
  case 'D':
    digitalWrite(MBaja, LOW);
    digitalWrite(MSube, HIGH);
    Contador1++;
    if(Contador1==2){
      digitalWrite(MBaja, HIGH);
      Contador1=0;
    }
  break;
  case '*':
    lcd.clear();
    valorActual = false;
    final = false;
    numero1 = "";
    operacion = ' ';
    lcd.setCursor(0,0);
    lcd.print(">");
  break;
  case '#':
       int EInf1=digitalRead(Inf1);
       if(EInf1==LOW){
          digitalWrite(MSube,HIGH);
       }
       if(EInf1==HIGH){
           digitalWrite(MSube,LOW);
       }
  break;
  
  default:
  break;
 }
}
}
void Superior(){
lcd.clear();
digitalWrite(MSube, HIGH);
lcd.setCursor(1, 0);
lcd.print("No Puede Subir");
lcd.setCursor(6, 1);
lcd.print("Mas");
}
void Inferior(){
lcd.clear();
digitalWrite(MBaja, HIGH);
lcd.setCursor(1, 0);
lcd.print("No Puede Bajar");
lcd.setCursor(6, 1);
lcd.print("Mas");
}

Lee el privado por favor!!

Como diria PeterKanTropus, tu problema son los delay dentro del switch.

surbyte: Como diria PeterKanTropus, tu problema son los delay dentro del switch.

Entiendo esa parte, pero el problema solo lo tengo en el case "#", todo lo demás funciona muy bien.

Ahh claro y tu crees que un código que no tiene nada que lo interrumpa como lo es el primero puesto en otro código donde hay cosas como delay(T*1000) o sea demoras de segundos, eso no tendra un efecto negativo en la rutina que esperas funcione como lo hacía antes? Imposible.

SamyNat, lee el post Procesos en paralelo, multihilo, simultaneos y otras yerbas y una vez leído entenderás qué es lo que tratan de decirte. Y también entenderás lo que te de digo en el siguiente párrafo.

Tú has hecho una "receta de principiante" que hace "un huevo duro" perfecto, como a ti te gusta. Pero ahora necesitas poder hacer otras cosas más, mientras esperas los diez minutos que tarda en hacerse "un huevo duro". Es entonces cuando se necesita la "receta de masterchef para preparar un huevo duro. Porque si estás diez minutos unicamente esperando a que pase el tiempo para tener "un huevo duro", durante esos diez minutos no vas a poder hacer ninguna otra cosa, ni tan siquiera cancelar la preparación del "huevo duro". Y quien dice diez minutos, dice un segundo o 100 milisegundos. Un delay() no es más que un cruzarse de brazos sin hacer nada. Un millis() es mirar por un instante el reloj a ver si ha pasado el tiempo necesario para hacer una cosa determinada. Si ha llegado ese momento entonces se hace esa cosa y se continúa con el resto de cosas sin detenerse. Y si no ha llegado ese momento se continúa con el resto de cosas. Siempre se está haciendo algo o mirando si ha llegado el momento de hacer algo, pero nunca se queda uno parado de brazos cruzado esperando a que pase el tiempo sin hacer nada. Has de estar continuamente verificando si han pasado los diez minutos o si se te han pasado las ganas de comer. Si han pasado los diez minutos, ya tienes la comida lista. Si se te han pasado las ganas de comer, cancelas la preparación del "huevo duro". Ese es el concepto que has de interiorizar. Esa es la filosofía de los millis() y las máquinas de estado. En este mismo foro, en Índice de tutoriales puedes encontrar un par de enlaces que te hablan del uso de los millis() y de las máquinas de estado.

Esta es tu rutina loop infrarrojos, para la proxima por favor, usa identación, para que se pueda leer adecuadamente!

void loop() {

   int EInf1=digitalRead(Inf1);
   if (EInf1==LOW){
       digitalWrite(MSube,HIGH);
   }
   if (EInf1==HIGH){
       digitalWrite(MSube,LOW);
   }
}

Supongamos que alguien presiona 'A' Obseva que esta rutina se ejecuta libremente.. nada la interrumpe tal como te explica Ignorante o ya te he dicho yo con el tema de delay.

Ahora mira una parte de tu otro código

switch(operacion){
  case 'A':
    T=numero1.toInt();
    T=T/t;
    digitalWrite(MSube, LOW);
    lcd.clear();
    lcd.print("Subiendo ");
    delay(T*1000);
    lcd.clear();
    digitalWrite(MSube, HIGH);
    lcd.print("En posicion!!");
  break;

en el teclado pero antes escribieron solo '5' de modo que la variable numero1 vale 5 y T valdrá 1 en entero. Ya que T/t es 5/5, ese cociente valdra 1 y solo para simplificar.

Entonces tenemos un delay de 1000 mseg o sea 1 seg PARADO detenido. Que le puede ocurrir a tu rutina infrarrojo que antes corria libre y ahora tiene DETENCIONES de 1 segundo. Pues no funciona.

IgnoranteAbsoluto:
SamyNat, lee el post Procesos en paralelo, multihilo, simultaneos y otras yerbas y una vez leído entenderás qué es lo que tratan de decirte. Y también entenderás lo que te de digo en el siguiente párrafo.

Tú has hecho una “receta de principiante” que hace “un huevo duro” perfecto, como a ti te gusta. Pero ahora necesitas poder hacer otras cosas más, mientras esperas los diez minutos que tarda en hacerse “un huevo duro”. Es entonces cuando se necesita la "receta de masterchef para preparar un huevo duro. Porque si estás diez minutos unicamente esperando a que pase el tiempo para tener “un huevo duro”, durante esos diez minutos no vas a poder hacer ninguna otra cosa, ni tan siquiera cancelar la preparación del “huevo duro”. Y quien dice diez minutos, dice un segundo o 100 milisegundos. Un delay() no es más que un cruzarse de brazos sin hacer nada. Un millis() es mirar por un instante el reloj a ver si ha pasado el tiempo necesario para hacer una cosa determinada. Si ha llegado ese momento entonces se hace esa cosa y se continúa con el resto de cosas sin detenerse. Y si no ha llegado ese momento se continúa con el resto de cosas. Siempre se está haciendo algo o mirando si ha llegado el momento de hacer algo, pero nunca se queda uno parado de brazos cruzado esperando a que pase el tiempo sin hacer nada. Has de estar continuamente verificando si han pasado los diez minutos o si se te han pasado las ganas de comer. Si han pasado los diez minutos, ya tienes la comida lista. Si se te han pasado las ganas de comer, cancelas la preparación del “huevo duro”. Ese es el concepto que has de interiorizar. Esa es la filosofía de los millis() y las máquinas de estado. En este mismo foro, en Índice de tutoriales puedes encontrar un par de enlaces que te hablan del uso de los millis() y de las máquinas de estado.

Ya entiendo, entonces refieren a que cambie los delay() por milis() para evitar el retraso de el proceso.

Gracias ahora lo corrijo, saludos!