Problema con teclado 4x4

Hola a todos. les agradeceria me ayuden con este problema.

Estoy tratando de aprender a conectar un teclado de matriz 4x4 con mi arduino UNO, primero les explico lo que hice:

descargue la libreria Keypad.h revise con un multimetro todas las conexiones del teclado para identificar cuales eran las filas y cuales las columnas

utilice una guia de las tantas que hay para hacer el programa para que se impriman las teclas que se presionan en el monitor serial. (creo que todo esta bien por que se compila sin errores).

los conectores del teclado los mande a los pines 9,8,7y 6 para las filas y 5,4,3 y 2 para las columnas.

El problema es que al presionar las teclas en ocasiones se imprimen y en ocasiones no, ejemplo, si oprimo la tecla 1 se imprime de inmediato en el monitor, si oprimo de nuevo la tecla 1 no se imprime y tengo que hacer muchos intentos para que se imprima de nuevo. esto pasa aleatoriamente con cualquier tecla.

solo como dato, cuando revise con el multimetro las conecciones del teclado la respuesta de continuidad al oprimir cualquier tecla era de inmediato sin ningun problema ni retraso.

Gracias por la ayuda

Hola AVEGAM, deberías postear el código y el enlace de donde has descargado tu librería Keypad.h Hace dias, intentado solucionar el problema de un forero, tuve inconvenientes con un teclado simulado. Me funcionaba una columna en todas sus filas pero las demas no. Y sin embargo veía como todas cambiaban de estado.

No perdí mas tiempo y lo dejé pero me llama la atención lo que ahora comentas.

este es el codigo que tengo

//Incluimos librerias para la Pantalla LCD I2C y para el teclado 4x4

#include <LiquidCrystal_I2C.h>                   // Libreria para pantallas LCD con modulo I2C
#include<Wire.h>                                 // Libreria para pantallas LCD con modulo I2C
LiquidCrystal_I2C lcd(0x27,16,2);                // Configuracion del LCD 16x2
#include <Key.h>
#include <Keypad.h>                              // Incluye libreria para teclado

//Configuracion de la estructura y los pines del teclado 4x4

const byte filas = 4;                            // Se declara el numero de filas
const byte columnas = 4;                         // Se declara el numero de columnas
byte pinsFilas[filas] = {9, 8, 7, 6};            // Declara Pines 9,8,7 y 6 para renglones del keypad
byte pinsColumnas[columnas] = {5, 4, 3, 2};      // Declara Pines 5,4,3 y 2 para columnas del keypad

char teclas[filas][columnas] = {                 // Declaramos la configuracion de la matriz 4x4
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

Keypad teclado = Keypad(makeKeymap(teclas), pinsFilas, pinsColumnas, filas, columnas);    //iniciamos el Keypad

char tecla;

void setup() {
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0,0);
  

}

void loop() { 
  lcd.print("!!!!CHINGADO!!!!"); // Mensaje a desplegar
  lcd.setCursor(0,1);
  delay (1000);
  lcd.print("Por_Que_NO_Jala!"); // Mensaje a desplegar  
  delay (1000);
  lcd.clear();
  delay (1000);

  tecla = teclado.getKey();
  if(tecla != NO_KEY) {
    Serial.print(tecla);
  }
  }

tiene mezclado el de una pantalla LCD con I2C ya que estoy tratando de aprender a hacer algo mas complejo, espero que eso no sea la causa del error.

la libreria del Keypad la descargue del gestor de librerias del programa de arduino

para comenzar, tu código dice lo siguiente Cada 3 segundos luego que muestre todos los carteles bonitos, presta atención a ver si he presionado una tecla

Evidentemente no es la mejor manera de hacerlo, asi que porque no pruebas de este modo. Comenta todo lo que tenga que ver con lcd solo para hacer una prueba y luego observa si el programa recompilado donde solo le presta atención a la presion de las teclas funciona. Te vas a sorprender.

Si eso pasa, entonces modifica la parte de presentación que veo no tiene mucho sentido porque poner (ya se que estas experimentando)

lcd.print("!!!!CHINGADO!!!!"); // Mensaje a desplegar
  lcd.setCursor(0,1);
  delay (1000);
  lcd.print("Por_Que_NO_Jala!"); // Mensaje a desplegar  
  delay (1000);
  lcd.clear();
  delay (1000);

Se puede resumir a solo esto

void setup() {
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Keypad"); // Mensaje a desplegar
  lcd.setCursor(0,1);
  lcd.print("Tecla:"); // Mensaje a desplegar  
}

void loop() {
  tecla = teclado.getKey();
  if(tecla != NO_KEY) {
    Serial.print(tecla); 
    lcd.setCursor(8,1);
    lcd.print(tecla); // Mensaje a desplegar   
  }
}

Ok, entonces entiendo que el problema con el teclado es debido a los delay que utilice para que se esten desplegando los mensajes en la pantalla.

una disculpa por los carteles, olvide cambiarlos, es la desesperacion.

los mensajes que estaba probando son como una presentacion antes de iniciar el programa, esos debi ponerlos antes del "void setup" para que solo aparezcan al arranque y no se vuelvan a repetir y no afecten al programa una vez corriendo???

Entiendo que estas probando cosas pero comprende como afecta delay en tu velocidad de respuesta. Ya que estas comenzando te invito a que aprendas AHORA a olidarte de delay y lo dejas solo para cosas muy TONTAS si se quiere, cosas en las que no se va a hacer nada mas. En tu caso debes aprender a usar millis(). Ve a Documentación y busca Indice de Tutoriales como primer hilo. Dentro lo encontrarás. Estudia y practica millis() y luego vemos como reformar esto usandolo.

Eso te permitirá, atender siempre el teclado con velocidad inmediata o casi inmediata (dentro de 1 mseg) y tambien hace cosas que requieran ser presentadas a intervalos como en tu caso de seg, minutos u horas.