.. note::
¡Hola, bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook! Sumérgete más en Raspberry Pi, Arduino y ESP32 con otros entusiastas.
**¿Por qué unirse?**
- **Soporte experto**: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
- **Aprender y compartir**: Intercambia consejos y tutoriales para mejorar tus habilidades.
- **Preestrenos exclusivos**: Obtén acceso anticipado a nuevos anuncios de productos y adelantos exclusivos.
- **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más nuevos.
- **Promociones festivas y sorteos**: Participa en sorteos y promociones de temporada.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy mismo.
.. _3.1.8_c_pi5:
3.1.8 Cerradura con Contraseña
========================================
Introducción
-----------------
En este proyecto, utilizaremos un teclado y una pantalla LCD para hacer una
cerradura con combinación. La pantalla LCD mostrará un mensaje correspondiente
para que ingreses tu contraseña en el teclado. Si la contraseña es correcta, se mostrará "Correcto".
Sobre la base de este proyecto, podemos agregar componentes electrónicos adicionales,
como un zumbador, LED, etc., para agregar diferentes fenómenos experimentales para la
entrada de la contraseña.
Componentes necesarios
------------------------------
En este proyecto, necesitamos los siguientes componentes.
.. image:: ../img/list_Password_Lock.png
:align: center
Es definitivamente conveniente comprar un kit completo, aquí tienes el enlace:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nombre
- ARTÍCULOS EN ESTE KIT
- ENLACE
* - Raphael Kit
- 337
- |link_Raphael_kit|
También puedes comprarlos por separado en los siguientes enlaces.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUCCIÓN DEL COMPONENTE
- ENLACE DE COMPRA
* - :ref:`cpn_gpio_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_i2c_lcd`
- |link_i2clcd1602_buy|
* - :ref:`cpn_keypad`
- \-
Diagrama Esquemático
-----------------------------
============== ======== ======== ===
Nombre T-Board Físico wiringPi BCM
GPIO18 Pin 12 1 18
GPIO23 Pin 16 4 23
GPIO24 Pin 18 5 24
GPIO25 Pin 22 6 25
GPIO17 Pin 11 0 17
GPIO27 Pin 13 2 27
GPIO22 Pin 15 3 22
SPIMOSI Pin 19 12 10
SDA1 Pin 3
SCL1 Pin 5
============== ======== ======== ===
.. image:: ../img/Schematic_three_one9.png
:align: center
Procedimientos Experimentales
---------------------------------
**Paso 1:** Construir el circuito.
.. image:: ../img/image262.png
**Paso 2**: Cambiar directorio.
.. raw:: html
.. code-block::
cd ~/raphael-kit/c/3.1.8/
**Paso 3**: Compilar.
.. raw:: html
.. code-block::
gcc 3.1.8_PasswordLock.cpp -lwiringPi
**Paso 4:** Ejecutar.
.. raw:: html
.. code-block::
sudo ./a.out
Después de ejecutar el código, usa el teclado para ingresar la contraseña correcta: 1984.
Si aparece “CORRECT” en el LCD1602, la contraseña es correcta; de lo contrario, aparecerá “WRONG KEY”.
.. note::
* Si aparece el mensaje de error ``wiringPi.h: No such file or directory``, consulta :ref:`install_wiringpi_pi5`.
* Si aparece el error ``Unable to open I2C device: No such file or directory``, consulta :ref:`i2c_config` para habilitar I2C y verificar si el cableado es correcto.
* Si el código y el cableado están bien, pero el LCD aún no muestra contenido, puedes ajustar el potenciómetro en la parte posterior para aumentar el contraste.
**Explicación del Código**
.. code-block:: c
#define ROWS 4
#define COLS 4
#define BUTTON_NUM (ROWS * COLS)
#define LENS 4
unsigned char KEYS[BUTTON_NUM] {
'1','2','3','A',
'4','5','6','B',
'7','8','9','C',
'*','0','#','D'};
char password[LENS]={'1','9','8','4'};
Aquí, definimos la longitud de la contraseña LENS, la matriz de almacenamiento de valores
de teclas del teclado KEYS y la matriz que almacena la contraseña correcta.
.. code-block:: c
void keyRead(unsigned char* result);
bool keyCompare(unsigned char* a, unsigned char* b);
void keyCopy(unsigned char* a, unsigned char* b);
void keyPrint(unsigned char* a);
void keyClear(unsigned char* a);
int keyIndexOf(const char value);
Se declara la subfunción del código del teclado matricial, consulta :ref:`2.1.8_c_pi5` de este
documento para más detalles.
.. code-block:: c
void write_word(int data);
void send_command(int comm);
void send_data(int data);
void lcdInit();
void clear();
void write(int x, int y, char const data[]);
Se declara la subfunción del código de LCD1062, consulta :ref:`1.1.7_c_pi5` de este documento
para más detalles.
.. code-block:: c
while(1){
keyRead(pressed_keys);
bool comp = keyCompare(pressed_keys, last_key_pressed);
...
testword[keyIndex]=pressed_keys[0];
keyIndex++;
if(keyIndex==LENS){
if(check()==0){
clear();
write(3, 0, "WRONG KEY!");
write(0, 1, "please try again");
}
...
Lee el valor de la tecla y guárdalo en la matriz de prueba testword. Si el número de valores
de teclas almacenados es mayor a 4, se verifica automáticamente la corrección de la contraseña
y los resultados de la verificación se muestran en la interfaz LCD.
.. code-block:: c
int check(){
for(int i=0;i