Arduino Nano - Cerradura de puerta con teclado numérico

Este tutorial te enseña cómo construir un sistema de cerradura de puerta con contraseña utilizando Arduino Nano, un teclado numérico, una cerradura de solenoide o una cerradura electromagnética y una pantalla LCD. A continuación se muestra cómo funcionará el sistema de cerradura de la puerta:

Para facilitarlo, el tutorial está dividido en varios pasos, de fácil a difícil:

Acerca del teclado numérico, la cerradura de solenoide, la cerradura electromagnética y la pantalla LCD.

Tanto la cerradura de solenoide como la cerradura electromagnética se utilizan para bloquear y desbloquear la puerta. Principalmente difieren entre sí en términos de diseño mecánico. El cableado para Arduino Nano es similar. El código del Arduino Nano para controlarlos es el mismo.

Si no estás familiarizado con el teclado numérico, la cerradura de solenoide, la cerradura electromagnética y la pantalla LCD (diagrama de pines, cómo funciona, cómo programar...), los siguientes tutoriales pueden ayudarte a aprender:

Diagrama de Cableado

  • Diagrama de cableado con Arduino Nano, teclado numérico y cerradura de solenoide
Arduino Nano, teclado numérico, diagrama de cableado de la cerradura de solenoide

This image is created using Fritzing. Click to enlarge image

  • Diagrama de cableado con Arduino Nano, teclado numérico y cerradura electromagnética
Arduino Nano, teclado numérico, diagrama de cableado de cerradura electromagnética

This image is created using Fritzing. Click to enlarge image

Código de Arduino Nano - Cerradura de Puerta con Teclado Numérico

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-keypad-door-lock */ #include <Keypad.h> const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 3; //four columns const int RELAY_PIN = 2; // The Arduino Nano pin connected to the IN pin of relay module const byte pin_rows[ROW_NUM] = {10, 9, 8, 7}; // The Arduino Nano pin connected to the row pins of the keypad const byte pin_column[COLUMN_NUM] = {6, 5, 4}; // The Arduino Nano pin connected to the column pins of the keypad char key_layout[ROW_NUM][COLUMN_NUM] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; Keypad keypad = Keypad( makeKeymap(key_layout), 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 32, change if needed pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door } void loop() { char key = keypad.getKey(); if (key) { Serial.println(key); if (key == '*') { input_password = ""; // reset the input password } else if (key == '#') { if (input_password == password) { Serial.println("The correct password! Unlocking the door in 20 seconds"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 20 seconds delay(20000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.println("The incorrect password! try again"); } input_password = ""; // reset the input password } else { input_password += key; // append new character to input password string } } }

※ Nota:

La dirección del LCD puede variar según el fabricante. En nuestro código, usamos 0x27 tal como lo especifica DIYables.

Pasos R\u00e1pidos

  • Conecta un cable USB al Arduino Nano y a la PC.
  • Abre el IDE de Arduino y selecciona la placa y el puerto adecuados.
  • Haz clic en el icono de Bibliotecas en la barra izquierda del IDE de Arduino.
  • Busca “keypad”, y localiza la biblioteca keypad creada por Mark Stanley y Alexander Brevig.
  • Presiona el botón Instalar para instalar la biblioteca keypad.
Biblioteca de teclado numérico para Arduino Nano.
  • Copie el código anterior y ábralo con el IDE de Arduino.
  • Haga clic en el botón Subir para cargar el código al Arduino Nano.
  • Abra el Monitor Serial.
  • Presione las teclas 12345 seguidas del símbolo #.
  • Luego presione las teclas 1234 seguidas del símbolo #.
  • Verifique el estado de la lengüeta de la cerradura durante 20 segundos.
  • Verifique el resultado en el Monitor Serial.
COM6
Send
The incorrect password! try again The correct password! Unlocking the door in 20 seconds
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Explicación del código

Las contraseñas válidas están predefinidas en el código de Arduino Nano. Se utiliza una cadena para almacenar la contraseña ingresada por los usuarios, a la que se refiere como cadena de entrada. En el teclado, dos teclas (* y #) se utilizan para fines especiales: borrar la contraseña y terminarla. El sistema funciona de la siguiente manera:

  • A excepción de las dos teclas especiales, si se pulsa cualquier otra tecla, se añade a la cadena de entrada.
  • Si se pulsa *, se borra la cadena de entrada. Esto puede usarse para comenzar o reiniciar la introducción de la contraseña.
  • Si se pulsa #:
    • Arduino Nano compara la cadena de entrada con las contraseñas predefinidas. Si coincide con alguna de las contraseñas predefinidas, Arduino Nano controla el relé para desbloquear la puerta.
    • Independientemente de si la contraseña es correcta o no, Arduino Nano borra la cadena de entrada para la siguiente entrada.

Código de Arduino Nano - Múltiples teclas

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-keypad-door-lock */ #include <Keypad.h> const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 3; //four columns const int RELAY_PIN = 2; // The Arduino Nano pin connected to the IN pin of relay module const byte pin_rows[ROW_NUM] = {10, 9, 8, 7}; // The Arduino Nano pin connected to the row pins of the keypad const byte pin_column[COLUMN_NUM] = {6, 5, 4}; // The Arduino Nano pin connected to the column pins of the keypad char key_layout[ROW_NUM][COLUMN_NUM] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; Keypad keypad = Keypad( makeKeymap(key_layout), pin_rows, pin_column, ROW_NUM, COLUMN_NUM); const String password_1 = "1234"; // change your password here const String password_2 = "5642"; // change your password here const String password_3 = "12345"; // change your password here String input_password; void setup() { Serial.begin(9600); input_password.reserve(32); // maximum input characters is 33, change if needed pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, LOW); // lock the door } void loop() { char key = keypad.getKey(); if (key) { Serial.println(key); if (key == '*') { input_password = ""; // reset the input password } else if (key == '#') { if (input_password == password_1 || input_password == password_2 || input_password == password_3) { Serial.println("The correct password! Unlocking the door in 20 seconds"); digitalWrite(RELAY_PIN, HIGH); // unlock the door for 20 seconds delay(20000); digitalWrite(RELAY_PIN, LOW); // lock the door } else { Serial.println("The incorrect password! try again"); } input_password = ""; // reset the input password } else { input_password += key; // append new character to input password string } } }

Añadir pantalla LCD a la cerradura RFID

Podemos añadir opcionalmente una pantalla LCD para mostrar el estado a los usuarios (p. ej. CONCEDIDO/DENEGADO).

Diagrama de cableado - Sistema de cierre de puertas con teclado, cerradura de solenoide o cerradura electromagnética y pantalla LCD

Diagrama de cableado de la pantalla LCD para el sistema de cerradura con Arduino Nano

This image is created using Fritzing. Click to enlarge image

Tenga en cuenta que, en el diagrama de cableado anterior, tanto el relé como la pantalla LCD pueden no funcionar o funcionar de forma inestable debido a una alimentación insuficiente. Recomendamos encarecidamente utilizar una fuente de alimentación externa tanto para el relé como para la pantalla LCD. Consulte el siguiente diagrama de cableado para obtener orientación:

Diagrama de cableado de la fuente de alimentación externa para la pantalla LCD del sistema de cerradura con Arduino Nano.

This image is created using Fritzing. Click to enlarge image

Ver La mejor forma de alimentar Arduino Nano y otros componentes.

Código de Arduino Nano - Cerradura de Puerta con Teclado

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-keypad-door-lock */ #include <Keypad.h> #include <LiquidCrystal_I2C.h> const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 3; //four columns const int RELAY_PIN = 2; // The Arduino Nano pin connected to the IN pin of relay module const byte pin_rows[ROW_NUM] = {10, 9, 8, 7}; // The Arduino Nano pin connected to the row pins of the keypad const byte pin_column[COLUMN_NUM] = {6, 5, 4}; // The Arduino Nano pin connected to the column pins of the keypad char key_layout[ROW_NUM][COLUMN_NUM] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; Keypad keypad = Keypad( makeKeymap(key_layout), pin_rows, pin_column, ROW_NUM, COLUMN_NUM); LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27 (from DIYables LCD), 16 column and 2 rows const String password_1 = "1234"; // change your password here const String password_2 = "5642"; // change your password here const String password_3 = "12345"; // change your password here String input_password; void setup() { Serial.begin(9600); input_password.reserve(32); // maximum input characters is 33, change if needed pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door lcd.init(); // Initialize the LCD I2C display lcd.backlight(); } void loop() { char key = keypad.getKey(); if (key) { Serial.println(key); if (key == '*') { input_password = ""; // reset the input password lcd.clear(); } else if (key == '#') { lcd.clear(); if (input_password == password_1 || input_password == password_2 || input_password == password_3) { Serial.println("password is correct"); lcd.setCursor(0, 0); lcd.print("CORRECT!"); lcd.setCursor(0, 1); lcd.print("DOOR UNLOCKED!"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 20 seconds delay(20000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.println("password is incorrect, try again"); lcd.setCursor(0, 0); lcd.print("INCORRECT!"); lcd.setCursor(0, 1); lcd.print("ACCESS DENIED!"); } input_password = ""; // reset the input password } else { if (input_password.length() == 0) { lcd.clear(); } input_password += key; // append new character to input password string lcd.setCursor(input_password.length(), 0); // move cursor to new position lcd.print('*'); // print * key as hiden character } } }

※ Nota:

La dirección del LCD puede variar según el fabricante. Utilizamos 0x27 en nuestro código, según lo indicado por DIYables.

Agregar el sonido de pitido cuando se presiona el teclado numérico.

Podemos hacer que la cerradura de la puerta parezca más receptiva añadiendo un zumbador piezoeléctrico para generar un pitido corto cada vez que se pulsa una tecla del teclado numérico.

Es bastante sencillo añadirlo. Así que dejamos esta parte a tu creatividad. Puedes consultar el tutorial Arduino Nano - Keypad Beep para obtener más orientación.

Agregar un sensor de puerta a la cerradura con teclado numérico

En el código mencionado anteriormente, el Arduino Nano bloquea la puerta después de un período de tiempo desde el desbloqueo. Sin embargo, en aplicaciones prácticas, normalmente se añade un sensor de puerta al sistema. Si el Arduino Nano detecta que la puerta está cerrada, la bloquea de inmediato en lugar de esperar al tiempo de espera.

Para no agobiarte, no incluimos el sensor de la puerta en el diagrama de cableado y en el código. En su lugar, dejamos esta parte a tu creatividad. Puedes consultar los tutoriales Arduino Nano - Sensor de Puerta y Arduino Nano - Control del Relé del Sensor de Puerta para obtener más orientación.

Gestión y almacenamiento de las contraseñas válidas en EEPROM

El código anterior tiene contraseñas válidas (UID) que están codificadas en el código del Arduino Nano. Esto significa que si quieres añadir o eliminar contraseñas, tienes que hacer cambios en el código y volver a subirlo al Arduino Nano, lo cual es inconveniente.

En aplicaciones reales, es necesario gestionar las contraseñas sin tener que modificar y subir el código cada vez. Para lograrlo, las contraseñas pueden almacenarse en la EEPROM en lugar de estar codificadas en el código. En consecuencia, se necesita un método para gestionar fácilmente las contraseñas desde la EEPROM.

Existen dos métodos disponibles para gestionar contraseñas en la EEPROM:

  • Usar contraseñas maestras
    • Al utilizar una contraseña como contraseña maestra ADD, se pueden agregar nuevas contraseñas al sistema.
    • Una vez que el Arduino Nano detecta la contraseña maestra ADD, éste cambia entre el modo ADD y el modo OPERACIÓN.
    • Durante el modo ADD, el Arduino Nano añade cualquier nueva contraseña que detecta a la EEPROM.
    • Se utiliza un enfoque similar para la contraseña maestra DELETE y el modo DELETE.
  • Usar comandos ADD/DELETE a través de Serial/Bluetooth/IR
    • Los comandos se transmiten a través de Serial/Bluetooth/IR, utilizando herramientas como el Monitor Serial, la aplicación Bluetooth o el controlador IR.
    • Los comandos consisten en una directiva (ADD/DELETE) y la contraseña.

    Para poder utilizar cualquiera de los dos métodos anteriores, se debe añadir una cantidad considerable de código de Arduino Nano. Para las personas que son nuevas en la programación, esto puede ser una tarea desafiante. Como resultado, este tutorial tiene como objetivo proporcionar una comprensión básica del sistema de cerraduras para puertas sin abrumar a los principiantes con código complejo. Si desea implementar este sistema con fines prácticos, póngase en contacto con nosotros a través de nuestro servicio de programación pagado.

Almacenando el historial de accesos en la tarjeta SD

Para hacer un seguimiento del historial de accesos, podría ser necesario guardar el estado de acceso (GRANTED/DENIED) y la fecha y la hora. Dado que la EEPROM tiene una capacidad insuficiente para almacenar todo el historial, se puede utilizar una tarjeta SD en su lugar. Puede encontrar orientación sobre esto en el tutorial Arduino Nano - Registrar datos con marca de tiempo en la tarjeta SD.

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.

※ 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!