.. note::
¡Hola! Bienvenidos a la comunidad de entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook. Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto con otros apasionados.
**¿Por qué unirse?**
- **Soporte de Expertos**: Soluciona problemas post-venta y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
- **Aprende y Comparte**: Intercambia consejos y tutoriales para mejorar tus habilidades.
- **Avances Exclusivos**: Accede anticipadamente a anuncios de nuevos productos y adelantos.
- **Descuentos Especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes.
- **Promociones y Sorteos Festivos**: Participa en sorteos y promociones especiales en días festivos.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy.
3.1.9 Cerradura con Contraseña
==================================
Introducción
---------------
En este proyecto, usaremos un teclado y una pantalla LCD para crear
una cerradura de combinación. La pantalla LCD mostrará un mensaje
correspondiente para que ingreses tu contraseña en el teclado. Si
la contraseña es correcta, aparecerá "CORRECTO" en la pantalla.
A partir de este proyecto, podemos añadir componentes electrónicos
adicionales, como un zumbador o un LED, para generar distintas
respuestas al ingresar la contraseña.
Componentes
--------------
.. image:: img/list_Password_Lock.png
:align: center
Diagrama de Circuito
-------------------------
============ ======== ======== ===
T-Board Name physical 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:** Construye el circuito.
.. image:: img/image262.png
:alt: 3.1.3_PasswordLock_bb_看图王
:width: 800
**Paso 2**: Cambia al directorio.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/3.1.9/
**Paso 3**: Compila.
.. raw:: html
.. code-block::
gcc 3.1.9_PasswordLock.cpp -lwiringPi
**Paso 4:** Ejecuta.
.. raw:: html
.. code-block::
sudo ./a.out
Al ejecutar el código, el teclado se usará para ingresar la contraseña.
Si aparece "CORRECTO" en la pantalla LCD1602, la contraseña es correcta;
de lo contrario, aparecerá "CLAVE INCORRECTA".
.. note::
Si no funciona después de ejecutar el código, o aparece el mensaje de error: \"wiringPi.h: No such file or directory", consulta :ref:`faq_c_nowork`.
**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), el arreglo KEYS para
almacenar los valores del teclado y el arreglo que guarda 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);
Declaración de las subfunciones del código para el teclado matricial;
consulta :ref:`2.1.5_keypad` 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[]);
Declaración de las subfunciones del código para la LCD1602; consulta
:ref:`1.1.7_i2c_lcd_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 lo almacena en el arreglo de prueba testword.
Si el número de valores ingresados es mayor o igual a 4, la contraseña se
verifica automáticamente y el resultado se muestra en la pantalla LCD.
.. code-block:: c
int check(){
for(int i=0;i