Arduino - Teclado numérico

El teclado numérico se utiliza ampliamente en muchos dispositivos, como cerraduras de puertas, cajeros automáticos y calculadoras.

En este tutorial, aprenderemos:

Acerca del teclado numérico

teclado numérico

El teclado numérico es un conjunto de botones dispuestos en filas y columnas (llamada matriz). Cada botón se llama tecla.

El teclado numérico tiene varios tipos. Dos tipos populares para proyectos de bricolaje son el teclado numérico 3x4 (12 teclas) y el teclado numérico 4x4 (16 teclas).

Distribución de pines

Los pines del teclado numérico se dividen en dos grupos: filas y columnas.

El teclado numérico 3x4 tiene 7 pines: 4 pines de fila (R1, R2, R3, R4) y 3 pines de columna (C1, C2, C3).

El teclado matricial 4x4 tiene 8 pines: 4 pines de fila (R1, R2, R3, R4) y 4 pines de columna (C1, C2, C3, C4).

Pinout del teclado numérico

Cómo funciona

Esta sección se dedica al conocimiento profundo. NO se preocupe si no lo entiende. Omita esta sección si lo abruma y vuelva otro día. Continúe leyendo con las siguientes secciones.

El proceso de detectar las pulsaciones de teclas se llama escaneo del teclado.

Se llama 'escaneo' porque verifica una tecla a la vez.

Los pines de fila están conectados a los pines de salida del Arduino.

Los pines de la columna están conectados a los pines de entrada de Arduino (INPUT_PULLUP, en este estado, el valor del pin de entrada es HIGH si la tecla no está presionada).

Para cada fila:

  • Coloca todos los pines de la fila en ALTO.
  • Coloca solo el pin de la fila actual en BAJO.
  • Lee el estado de cada columna.
    • Si un pin de columna está ALTO ⇒ la tecla en (fila, columna) NO está pulsada.
    • Si un pin de columna está BAJO ⇒ la tecla en (fila, columna) está pulsada.
  • Se repite el proceso anterior para los pines de la siguiente fila.

※ Nota:

Lo anterior es uno de los métodos para escanear un teclado. Podemos invertir todas las señales altas a bajas y todas las señales bajas a altas para escanear el teclado.

¿Por qué el teclado está organizado y conectado como una matriz? Esto hace que el proceso de escaneo sea más complicado. ¿Por qué no usar cada tecla como un botón independiente, de modo que el estado de la tecla se determine simplemente leyendo el estado de un botón?

⇒ Como sabemos, un botón independiente requiere un pin de Arduino y GND. Tomemos como ejemplo un teclado 4x4. Si tratamos cada tecla como un botón independiente, se necesitan 16 pines de Arduino para 16 teclas, además del pin GND. Si organizamos las teclas en forma de matriz, solo necesitamos usar 8 pines de Arduino, así que podemos ahorrar pines de Arduino. En resumen, la respuesta es: ahorrar los pines de Arduino.

Diagrama de Cableado

Diagrama de cableado del teclado de Arduino

This image is created using Fritzing. Click to enlarge image

Cómo programar para el teclado numérico

Gracias a Keypad library, usar un teclado numérico con Arduino es pan comido, sin importar si entiendes cómo funciona el teclado numérico o no.

Código de Arduino

Teclado numérico 3x4

#include <Keypad.h> const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 3; //three columns char keys[ROW_NUM][COLUMN_NUM] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad byte pin_column[COLUMN_NUM] = {5, 4, 3}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM ); void setup(){ Serial.begin(9600); } void loop(){ char key = keypad.getKey(); if (key){ Serial.println(key); } }

Teclado numérico 4x4

#include <Keypad.h> const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 4; //four columns char keys[ROW_NUM][COLUMN_NUM] = { {'1','2','3', 'A'}, {'4','5','6', 'B'}, {'7','8','9', 'C'}, {'*','0','#', 'D'} }; byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM ); void setup(){ Serial.begin(9600); } void loop(){ char key = keypad.getKey(); if (key){ Serial.println(key); } }

Pasos R\u00e1pidos

  • Ve al icono Bibliotecas en la barra izquierda del IDE de Arduino.
  • Busca “keypad”, luego encuentra la biblioteca keypad de Mark Stanley y Alexander Brevig
  • Haz clic en el botón Instalar para instalar la biblioteca keypad.
Biblioteca de teclado numérico para Arduino
  • Copia el código anterior y ábrelo con el IDE de Arduino
  • Haz clic en el botón Subir en el IDE de Arduino para subir el código al Arduino
  • Abre el Monitor Serial
  • Presiona algunas teclas en el teclado numérico
  • Mira el resultado en el Monitor Serial
COM6
Send
3 6 9 4 * #
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Teclado numérico y contraseña

Una aplicación popular del teclado numérico es la entrada de contraseñas. En esta aplicación, especificamos dos teclas especiales:

  • Una tecla para iniciar/reiniciar la introducción de la contraseña. Por ejemplo, la tecla "*"
  • Una tecla para terminar la introducción de la contraseña. Por ejemplo, la tecla "#"

La contraseña será una cadena que contiene las teclas restantes, excepto dos teclas especiales seleccionadas.

Cuando se pulsa una tecla.

  • Si la tecla no es ni '*' ni '#', añade la tecla a la cadena de la contraseña introducida por el usuario.
  • Si la tecla es '#', compara la cadena de la contraseña introducida por el usuario con la contraseña para determinar si la contraseña introducida es correcta o no, y luego borra la cadena de la contraseña introducida por el usuario.
  • Si la tecla es '*', borra la cadena de la contraseña introducida por el usuario.

Teclado numérico - Código de acceso

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-keypad */ #include <Keypad.h> const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 3; //three columns char keys[ROW_NUM][COLUMN_NUM] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad byte pin_column[COLUMN_NUM] = {5, 4, 3}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM ); const String password = "1234"; // change your password here String input_password; void setup(){ Serial.begin(9600); input_password.reserve(32); // maximum input characters is 33, change if needed } void loop(){ char key = keypad.getKey(); if (key){ Serial.println(key); if(key == '*') { input_password = ""; // clear input password } else if(key == '#') { if(password == input_password) { Serial.println("password is correct"); // DO YOUR WORK HERE } else { Serial.println("password is incorrect, try again"); } input_password = ""; // clear input password } else { input_password += key; // append new character to input password string } } }
  • Ejecuta el código anterior
  • Abre el Monitor Serial
  • Presiona las teclas "123456" y presiona "#"
  • Presiona las teclas "1234" y presiona "#"
  • Consulta el resultado en el Monitor Serial
COM6
Send
password is incorrect, try again password is correct
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Video Tutorial

Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

Desafíate a ti mismo

  • Muestra la tecla pulsada del teclado numérico en la pantalla LCD. Pista: Consulta Arduino - LCD
  • Crea una cerradura con protección por contraseña usando el teclado numérico.

※ NUESTROS MENSAJES

  • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!