Professional Documents
Culture Documents
1. Introducción
Diagrama de flujo del sistema de control de acceso Diagrama de bloques del sistema de control de ac-
- Jorge Villarreal. ceso - Jorge Villarreal.
1
Diagrama de bloques del sistema de control de ac- Diagrama de bloques del sistema de control de ac-
ceso - Marlon Ipiales. ceso - Marlon Ipiales.
3. Desarrollo
3.1. Simulación - Marlon Ipiales
4. Análisis de Resultados
4.1. Análisis de Resultados - Jorge Villarreal
En necesario disponer de las librerı́as de LiquidCrystal y Keypad, para ello se las puede instalar desde
nuestro gestor de librerias. Una vez realizado, se procede a utilizarlas mediante el comando #include. Además,
se genera 4 filas y 4 columnas que permitirán realizar un arreglo matricial de 4x4. Posteriormente se especifica
los valores que ocuparán en cada una de las posiciones. Como último paso se detalla los pines que representarán
las filas y columnas.
# include < L i q u i d C r y s t a l .h >
# include < Keypad .h >
2
{ ’1 ’ , ’2 ’ , ’3 ’ , ’a ’} ,
{ ’4 ’ , ’5 ’ , ’6 ’ , ’b ’} ,
{ ’7 ’ , ’8 ’ , ’9 ’ , ’c ’} ,
{ ’* ’ , ’0 ’ , ’# ’ , ’d ’}
};
// Pines dedicados para el Keypad
byte pinfilas [ filas ]={13 ,12 ,11 ,10}; // pines para las filas
byte pincolms [ columnas ]={9 ,8 ,7 ,6}; // pines para las columnas
Se realiza la creación del keypad, para ello se trabaja con los pines y valores de cada posición, posteriormente
declarar los pines que ocupan el LCD que van de A0 a A5. Otro punto importante es declarar variables de tipo
char y string; en donde los de tipo char serán las contraseñas y String el mensaje a indicar.
// Creacion de Keypad
Keypad teclado = Keypad ( makeKeymap ( keys ) , pinfilas , pincolms , filas , columnas ) ; // Se detalla
los pines y el numero dimensional del arreglo (4 x4 )
// Pines LCD .
LiquidCrystal lcd ( A0 , A1 , A2 , A3 , A4 , A5 ) ; // pines a emplear desde A0 hasta A5
// Declaracion de variables
char tcl ;
char pass [9];
char pass1 [9]= " ad102344 " ;
String per1 = " BIENVENIDO ARIEL DAVALOS " ;
char pass2 [9]= " dc774235 " ;
String per2 = " BIENVENIDO DAMIAN CERVANTES " ;
char pass3 [9]= " ca543187 " ;
String per3 = " BIENVENIDO CARLOS BENAVIDES " ;
byte g =0;
int i =0;
int j =0;
const int btn =5; // el pulsador se define en el pin 5
En esta sección se procede a trabajar con la comunicación serial. Lo importante es definir la velocidad de
transmisión de datos y además se muestra mensajes que guiarán en el ingreso de contraseña. Por otra parte, se
inicializa el LCD al final de la sección de este código.
void setup () {
//
Serial . begin (9600) ; // indica la velocidad de transmision .
Serial . println ( " - - - - - - - - - CONTROL DE ACCESO - - - - - - - - - - " ) ; // muestra el encabezado
Serial . println ( " " ) ; // creamos un salto de linea
Serial . println ( " Ingrese su contrasena : " ) ; // definimos el texto para solicitar la
contrasena
// inicializa lcd
lcd . begin (16 , 2) ;
}
En esta sección es importante considerar que se obtiene el valor presionado en el teclado matricial, y se lo
procede a presentar en pantalla. Además se crea una función mostrar(), la cuál se encarga de presentar en el
LCD el mensaje previamente detallado, en caso de que se cumpla ciertas validaciones como lo es el ingreso por
contraseña de una persona. Cabe mencionar que aquı́ se implementa la rotación de datos y se lo hace con un
desplazamiento de derecha a izquierda.
void loop () {
tcl = teclado . getKey () ; // obtener el valor de caracter .
if ( tcl ) {
pass [ g ] = tcl ;
g ++;
Serial . print ( tcl ) ; // se muestra el valor de tecla presionada en el keypad
}
// Creacion de la funcion mostrar
mostrar () ;
if ( g == 8) { // comparamos el tamano de la contrasena
if (! strcmp ( pass1 , pass ) || ! strcmp ( pass2 , pass ) || ! strcmp ( pass3 , pass ) ) { //
comparacion de contrasenas de acceso
Serial . println ( " Contrasena correcta . " ) ; // si se cumple indicar el mensaje .
3
}
lcd . clear () ; // limpiar LCD
}
// Persona 2
if (! strcmp ( pass , pass2 ) ) {
lcd . setCursor (5 , 0) ;
lcd . print ( per2 ) ;
for ( i = 0; i < 30; i ++) { // Ciclo for para recorrer el texto
lcd . s c r o l l D i s p l a y L e f t () ; // direccion de d ezplazam iento a la izquierda
delay (250) ;
}
lcd . clear () ;
}
// Persona 3
if (! strcmp ( pass , pass3 ) ) {
lcd . setCursor (5 , 0) ;
lcd . print ( per3 ) ;
for ( i = 0; i < 30; i ++) { // Ciclo for para recorrer el texto
lcd . s c r o l l D i s p l a y L e f t () ; // direccion de d ezplazam iento a la izquierda
delay (250) ;
}
lcd . clear () ;
}
Serial . println ( " " ) ;
Serial . println ( " Ingrese contrasena : " ) ;
g = 0;
} else {
Serial . println ( " Contrasena incorrecta ! " ) ;
Serial . println ( " " ) ;
g = 0;
Serial . println ( " Vuelva a ingresar contrasena : " ) ;
}
}
}
Finalmente, se crea un método el cual permite indicar en el virtual terminal, el nombre de la persona que
previamente ha ingresado correctamente al sistema. Para ello se realiza una comparación de cadenas de caracteres
mediante strcmp y de igual forma que se accione mediante un boton desarrollado mediante configuración pull-up.
void mostrar () { // creacion del metodo
if (! strcmp ( pass , pass1 ) && digitalRead ( btn ) == LOW ) { // se compara con la contrasena de
la persona 1
delay (250) ;
Serial . println ( " " ) ;
Serial . println ( " --- Detalle De Ingreso - - - " ) ;
Serial . println ( " Ariel Davalos : Ingresado " ) ;
Serial . println ( " Damian Cervantes : No ingresado " ) ;
Serial . println ( " Carlos Benavides : No ingresado " ) ;
Serial . println ( " " ) ;
Serial . println ( " Ingrese contrasena : " ) ;
Figura 9: Ingreso correcto de perso- Figura 10: Error en contraseña de Figura 11: Verificación de acceso al
na y contraseña. acceso al sistema. sistema.
4
el valor se muestra por el puerto serie. Sin embargo en el proceso de codificación esta muestra un cambio sig-
nificativo a lo ya revisado en clase, puesto que ahora la declaracion de variables y especificaciones tanto como
pines y botones, tienen que ser arreglado de forma matricial, en donde esta se especifica más detalladamente la
posición de cada tecla a presionar. A continuación presentamos el código:
/*
* CAPITULO III : PUERTOS DIGITALES Y COMU NICACIO NES SERIAL
* CODIGO 1: Manejo de LCD , envio de mensajes con librerias < LiquidCrystal .h > y < Keypad .h >
* OBJETIVO : Usar metodos para imprimir mensajes y ciclos condicionales
* FUNCIONES : Libreria LiquidCrystal . h
* LiquidCrystal () // Inicializa la interfaz de la pantalla de LCD
* begin ( columnas , filas ) // Configura el uso de la LCD
* print ( data ) // Imprime texto en la LCD
* setCursor ( columna , fila ) // Posiciona el cursor en la LCD
* FUNCIONES : Keypad . h
# include < Keypad .h >
void setup () {
Serial . begin (9600) ; // Velocidad de inicio
}
void loop () {
char key = keypad . getKey () ; // Configuracion de teclado
if ( key ) {
Serial . println ( key ) ; // Impresion del texto dirigido por el teclado
}
}
* NOMBRE : Marlon Ipiales
* NOTA : Para que el codigo compile debe estar seleccionado con Arduino Uno WiFi caso
contrario si no funcionara seleccionar Arduino Uno
*/
# include < L i q u i d C r y s t a l .h > // Llamado de l i b r e r i a
# include < Keypad .h > // Llamado de l i b r e r i a
const byte Fila = 4; // Especif icacion de teclado
const byte Col = 4; // E specific acion de teclado
const byte filaPins [ Fila ] = { 13 , 12 , 11 , 10 }; // Pines a usar
const byte columnaPins [ Col ] = { 9 , 8 , 7 , 6 };
Keypad tecladoMatr = Keypad ( makeKeymap ( keys ) , filaPins , columnaPins , Fila , Col ) ; // Llamado de
las funciones del teclado
LiquidCrystal lcd ( A0 , A1 , A2 , A3 , A4 , A5 ) ;
const String clave1 = " ad102344 " ; // Claves de ingreso
const String clave2 = " dc774235 " ;
const String clave3 = " ca543187 " ;
5
// Funcion del teclado
void setup () {
pinMode ( btn , INPUT ) ;
Serial . begin (9600) ;
inpu t_passwo rd . reserve (32) ;
Serial . println ( " Laboratorio 1 " ) ;
Serial . println ( " Ingrese su c o n t r a s e a " ) ;
lcd . begin (16 ,2) ;
lcd . clear () ;
lcd . setCursor (2 ,0) ;
lcd . print ( " Laboratorio 1 " ) ;
}
// Configuracion en el ingreso de claves en teclado
void loop () {
lcd . autoscroll () ;
lcd . print ( " " ) ;
delay (300) ;
char tecla = tecladoMatr . getKey () ;
if ( tecla ) {
Serial . print ( tecla ) ;
if ( tecla == ’* ’) {
input_passwo rd = " " ;
} else
if ( tecla == ’# ’) {
if ( clave1 == input_p assword || clave2 == input_ passwor d || clave3 == inpu t_passwo rd ) {
if ( clave1 == input_p assword ) {
uno = clave1 ;
Serial . println ( " " ) ;
Serial . println ( " clave es correcta " ) ;
lcd . setCursor (1 ,1) ;
lcd . print ( " Bienvenido Ariel Davalos " ) ;
delay (300) ;
} else {
if ( clave2 == input_p assword ) {
dos = clave2 ;
Serial . println ( " " ) ;
Serial . println ( " La clave es correcta .! " ) ;
lcd . setCursor (1 ,1) ;
lcd . print ( " Bienvenido Damian Cervantes " ) ;
delay (300) ;
} else {
if ( clave3 == input_p assword ) {
tres = clave3 ;
Serial . println ( " " ) ;
Serial . println ( " La clave es correcta " ) ;
lcd . setCursor (1 ,1) ;
lcd . print ( " Bienvenido Carlos Benavides " ) ;
delay (300) ;
}
}
}
} else {
Serial . println ( " " ) ;
Serial . println ( " Clave incorrecta .! " ) ;
}
inpu t_passwo rd = " " ;
} else {
inpu t_passwo rd += tecla ;
}
}
if ( digitalRead ( btn ) == HIGH ) {
delay (300) ;
Serial . println ( " " ) ;
Serial . println ( " Asistencia : " ) ;
if ( uno == clave1 ) {
Serial . println ( " " ) ;
Serial . println ( " Ariel Davalos ha ingresado " ) ;
} else {
Serial . println ( " " ) ;
Serial . println ( " Ariel Davalos no ha ingresado " ) ;
}
if ( dos == clave2 ) {
Serial . println ( " " ) ;
Serial . println ( " Damian Cervantes ha ingresado " ) ;
} else {
6
Serial . println ( " " ) ;
Serial . println ( " Damian Cervantes no ha ingresado " ) ;
}
if ( tres == clave3 ) {
Serial . println ( " " ) ;
Serial . println ( " Carlos Benavides ha ingresado " ) ;
} else {
Serial . println ( " " ) ;
Serial . println ( " Carlos Benavides no ha ingresado " ) ;
}
}
}
5. Conclusiones y Recomendaciones
El método de scrollDisplayLeft() permite que se realice un desplazamiento en el flujo del texto del LCD, de
tal forma que vaya de derecha a izquierda. Aunque se puede modificar la posición desde dónde queremos
que empiece con setCursor().
Las condiciones de if, else nos permiten establecer instrucciones especı́ficas, principalmente enfocadas en
la comparación de cadenas de caracteres y la salida de texto especı́fico en la Virtual Terminal cuando se
ingresa o no correctamente una contraseña.
Para detectar la pulsación de una tecla actuaremos de forma similar a la lectura simple de un pulsador.
En resumen, ponemos a tierra un extremo del pulsador, y el otro lo conectamos a una entrada digital con
una resistencia de pull-up.
Dentro del proceso de codificación de ARDUINO, se puede tomar en cuenta que al hacer llamado de las
librerias para realizar dicho proceso requiere instalación previa para ser usado.
La correcta concatenación de los caracteres con el teclado a la pantalla del Display LCD y el terminal
virtual debe ser especificada correctamente en la función VOID LOOP para evitar ası́ errores al instante
de ingresar contraseñas.
Es indispensable disponer de las librerı́as necesarias para que funcione adecuadamente el keypad y el
LiquidCrystal, para ello es recomendable instalar o actualizar desde el mismo programa de Arduino.
Realizar una adecuada conexión, por lo general, tratar de no utilizar conexiones que se superpongan entre
sı́.
En caso de cerrar la ventana de virtual terminal, y no se vuelva a ejecutar, lo que se procede hacer es
dirigirse a la opción Debug y activar Virtual Terminal.