Un sistema de fichaje y control horario con Raspberry Pi

Publicado por Loli Diéguez en

En este proyecto te mostramos cómo configurar y programar tu propio sistema de asistencia o de control horario utilizando un lector RFID RC522 y una Raspberry Pi

 
  
 

A lo largo de este proyecto, te mostramos como a montar un circuito que utiliza tanto el lector RFID RC522 como una pantalla LCD de 16 × 2.

Comenzamos mostrándote todos los pasos necesarios para conectar estos circuitos a los pines GPIO de la Raspberry Pi. También te mostraremos cómo probar cada circuito para que funcione como debería. Esto ayuda a garantizar que todo esté listo para ser utilizado en nuestro sistema de asistencia RFID.

En la segunda parte del tutorial, indicaremos todos los pasos para configurar una base de datos. También escribiremos scripts de Python que se comunicarán con la base de datos para marcar la asistencia de las tarjetas RFID individuales.

 

Este tutorial es un poco largo pero el resultado final te gustará.

Material necesario

Necesitarás los siguientes equipos para poder completar este proyecto:

  1. Raspberry Pi
  2. Tarjeta Micro SD(si estás usando una Raspberry Pi 2, 3 o B +)
  3. Fuente de alimentación
  4. Cable de Ethernet
  5. Lector RFID RC522
  6. LCD de 16 x 2 con pines de encabezado
  7. Potenciómetro de 10k ohmios
  8. Placa de pruebas (se requiere una grande si estás usando un kit de ruptura)
  9. Alambre de tablero
  10. Estuche Raspberry Pi (Opcional) 
  11. Teclado USB (Opcional)
  12. Ratón USB (Opcional) 

 

Preparación de Raspbian para tu sistema de asistencia RFID

1.Para comenzar, lo primero es actualizar Raspbian para que tenga los ultimos paquetes, para ello ejecuta estos comandos en el terminal.

sudo apt-get update
sudo apt-get upgrade

2. Ahora instalamos todos los paquetes que necesitaremos para las próximas secciones.

 

sudo apt-get install build-essential git python3-dev python3-pip python3-smbus

Construcción del circuito de pantalla LCD 16 × 2

1.Para comenzar nuestro tutorial, primero vamos a configurar la pantalla LCD de 16 × 2. Realizaremos rápidamente el proceso de configuración de todo esto. 

Para esta sección del tutorial, asegúrate de tener lo siguiente listo para comenzar:

  • 8 piezas de cable macho a macho para placa de pruebas
  • 8 piezas de cable macho a hembra para placa de pruebas
  • Pantalla LCD 16 × 2
  • Potenciómetro de 10k ohmios
  • Tablero de circuitos

2. Una vez que tengas todas las piezas, puedes comenzar a ensamblar el circuito observando los diagramas y pasos a continuación.

Conectar la pantalla LCD a tu Raspberry Pi es un proceso bastante simple si sigues nuestra guía. Hemos incluido el número de pin físico para cada conexión que necesitas realizar.

Para empezar, conectamos nuestros diversos componentes con la placa de pruebas:

  • 5V (Pin físico 2) al riel positivo de la placa de pruebas
  • Conexión a tierra (pin físico 6) al riel de tierra de la placa de pruebas
  • Coloca la pantalla LCD de 16 × 2 en el lado derecho de la placa de pruebas
  • Coloca el potenciómetro en el lado izquierdo de la placa junto a la pantalla LCD .
  • Conecta el pin izquierdo del potenciómetro al riel de tierra
  • Conecta el pin derecho del potenciómetro al riel positivo

3. Ahora comienza a conectar la pantalla LCD a tu Raspberry Pi.

  • Pin 1 de la pantalla LCD (tierra) al riel de tierra de la placa de pruebas
  • Pin 2 de LCD (VCC / 5V) al riel positivo de la placa de pruebas
  • Pin 3 de LCD (V0) al cable medio del potenciómetro
  • Pin 4 de LCD (RS) a GPIO4 (Pin físico 7)
  • Pin 5 de la pantalla LCD (RW) al riel de tierra de la placa de pruebas
  • Pin 6 de LCD (EN) a GPIO24 (Pin físico 18)
  • Pin 11 de LCD (D4) a GPIO23 (Pin físico 16)
  • Pin 12 de LCD (D5) a GPIO17 (Pin físico 11)
  • Pin 13 de LCD (D6) a GPIO18 (Pin físico 12)
  • Pin 14 de LCD (D7) a GPIO22 (Pin físico 15)
  • Pin 15 de la pantalla LCD (LED +) al riel positivo de la placa de pruebas
  • Pin 16 de la pantalla LCD (LED -) al riel de tierra de la placa de pruebas

Diagrama de cableado del LCD del sistema de asistencia RFID

 Prueba de la pantalla LCD de 16 × 2

1. Ahora que el circuito se ha configurado, sigamos adelante y vamos a probarlo para asegurarnos de que todo esté cableado correctamente.

Para comenzar, continúa y clona la biblioteca Adafruit CharLCD que utilizaremos para este proyecto, si tu placa de visualización utiliza el controlador HD44780 , funcionará sin problemas.

Para clonar la biblioteca en tu Raspberry Pi, ejecuta el siguiente comando.

git clone https://github.com/pimylifeup/Adafruit_Python_CharLCD.git

2.Ahora, con la biblioteca clonada en nuestra Raspberry Pi, necesitamos ejecutar el script de configuración. Esta secuencia de comandos instalará la biblioteca para que cualquier secuencia de comandos de Python pueda utilizarla.

Ejecuta los siguientes dos comandos para moverte al directorio recién clonado y ejecuta el script setup.py .

cd ./Adafruit_Python_CharLCD
sudo python3 setup.py install

3.Con la biblioteca instalada en la Raspberry Pi, debemos seguir adelante y editar un archivo de ejemplo. Necesitamos hacer esto para probar el circuito ya que estamos usando pines diferentes a los que utiliza el ejemplo.

Comienza a editar el archivo ejecutando el siguiente comando.

nano ~/Adafruit_Python_CharLCD/examples/char_lcd.py

4. En este archivo, busca la linea donde pone #Raspberry Pi pin configuration: y cámbiala para que los valores coincidan con los que tenemos a continuación.

# Raspberry Pi pin configuration:
lcd_rs        = 4
lcd_en        = 24
lcd_d4        = 23
lcd_d5        = 17
lcd_d6        = 18
lcd_d7        = 22

Una vez realizados los cambios, guarda el archivo presionando CTRL + X, luego Y y luego ENTER .

5.Ahora, antes de seguir adelante y ejecutar nuestro nuevo ejemplo modificado, necesitaremos instalar la biblioteca Python GPIO de Raspberry Pi .

Para instalar la biblioteca requerida, ejecuta el siguiente comando:

sudo pip3 install RPi.GPIO

6. Para probar que todo está funcionando, ahora ejecutamos ese script de Python ejecutando el siguiente comando. Si todo funciona correctamente, ahora deberías ver el texto en la pantalla LCD.

python3 ~/Adafruit_Python_CharLCD/examples/char_lcd.py

 

Construcción del circuito del lector RFID RC522

1. Ahora que has configurado la pantalla LCD de 16 × 2, pasamos a agregar el lector RFID en este circuito.

Para esta sección sobre el cableado del RFID RC522 al circuito, necesitarás los siguientes equipos listos:

  • 1 pieza de cable macho a macho para placa de pruebas
  • 6 piezas de cable macho a hembra para placa de pruebas
  • Lector / Escritor RFID RC522
  • Tablero de circuitos

2. Una vez que tengas todo lo que necesitas para el circuito RFID, podemos proceder a cablear todo, esto será un poco más complicado porque ya tenemos la pantalla LCD colocada.

Ten en cuenta que este diagrama de circuito asume que has seguido los pasos de la sección anterior para la pantalla LCD. Si no estás utilizando la pantalla LCD, asegúrate de conectar el pin físico 6 en la Raspberry Pi al riel de tierra en la placa de pruebas.

Sigue los diagramas y pasos a continuación para conectar el circuito RFID a la Raspberry Pi:

  • SDA se conecta a GPIO8 (Pin físico 24)
  • SCK se conecta a GPIO11 (Pin físico 23)
  • MOSI se conecta a GPIO10 (Pin físico 19)
  • MISO se conecta a GPIO9 (Pin físico 21)
  • GND se conecta al riel de tierra de la placa de pruebas .
  • RST se conecta a GPIO25 (Pin físico 22)
  • 3.3v se conecta a 3v3 (Pin físico 1)

Diagramas de cableado del sistema de asistencia RFID RC522

 

 Habilitación de la interfaz SPI

1.Con la RFID ahora conectada a nuestra Raspberry Pi, tendremos que ir a la herramienta raspi-config para habilitar la interfaz SPI. Esta interfaz es necesaria para que podamos comunicarnos con el módulo RC522.

Para hacer esto, primero debes iniciar la herramienta raspi-config ejecutando el siguiente comando:

sudo raspi-config

2. Al ejecutar el comando, verás una pantalla que muestra varias opciones que puedes configurar.

Por ahora, solo nos interesa activar la interfaz SPI. 

En esta pantalla, usa las teclas de flecha para bajar y selecciona “ 5 opciones de interfaz ” y presiona ENTER .

3.En la siguiente pantalla, querrás usar las teclas de flecha para seleccionar la opción “ P4 SPI ”, una vez seleccionada presiona ENTER .

4.Ahora deberás confirmar si deseas habilitar la interfaz SPI. Para esto, querrás usar las teclas de flecha para seleccionar “  ” y luego presiona ENTER una vez que esté seleccionado.

5. La interfaz SPI ahora debería estar habilitada correctamente, y deberías ver el texto " La interfaz SPI está habilitada " aparecer en la pantalla.

Ahora, antes de que la interfaz SPI esté completamente habilitada, tendremos que reiniciar la Raspberry Pi. Podemos lograr esto volviendo a la terminal presionando ENTER y luego ESC .

Introduce el siguiente comando para reiniciar la Raspberry Pi.

sudo reboot

6. Una vez que la Raspberry Pi haya terminado de reiniciarse, puedes verificar que la interfaz SPI se haya habilitado ejecutando el siguiente comando.

Este comando recuperará la lista de módulos del kernel habilitados y tomará cualquier cosa de esa lista que contenga el texto " spi ".

lsmod | grep spi

Si ves el texto “ spi_bcm2835 ” aparecer en la línea de comando, entonces está listo para proceder a probar que el circuito está funcionando correctamente. 

Una vez hecho esto, podemos configurar nuestro sistema de control horario por RFID.

 

Prueba de RFID RC522

1.Instalamos ahora la biblioteca spidev en nuestra Raspberry Pi usando el siguiente comando "pip".

Confiamos en la biblioteca spidev para interactuar con la interfaz del lector RFID.

sudo pip3 install spidev

2.Ahora que hemos instalado la biblioteca spidev en nuestra Raspberry Pi, debemos proceder a descargar la biblioteca MFRC522 usando el comando "pip".

Esta biblioteca es la que se encargará del trabajo duro de nuestro sistema de asistencia RFID.

sudo pip3 install mfrc522

3. Ahora que tenemos la biblioteca MFRC522 y la biblioteca spidev instaladas en nuestra Raspberry Pi, sigamos adelante y creamos un directorio para mantener nuestro script de prueba.

mkdir ~/pi-rfid

4. Ahora necesitaremos escribir un breve script para probar que nuestro RC522 es, de hecho, capaz de leer tarjetas RFID y que todo esté cableado correctamente.

Primero, abrimos nuestro nuevo script ejecutando el siguiente comando, esto creará un archivo llamado " read.py " en nuestro directorio creado recientemente.

nano ~/pi-rfid/read.py

5.Introduce las siguientes líneas de código en este archivo. 


#!/usr/bin/env python import RPi.GPIO as GPIO from mfrc522 import SimpleMFRC522 reader = SimpleMFRC522() try: id, text = reader.read() print(id) print(text) finally: GPIO.cleanup()

Una vez hecho esto, guarda el archivo presionando CTRL + X, luego Y y ENTER .

6. Ahora prueba el RFID RC522 ejecutando el siguiente script y tocando el chip RFID en el lector.

python3 ~/pi-rfid/read.py

Circuito completo del sistema de asistencia RFID Raspberry Pi

1.Con ambos circuitos configurados, verifica que todo funciona correctamente. Prueba ejecutando los scripts de prueba que reunimos rápidamente en un par de secciones anteriores.

Si tienes problemas, puedes comparar tu circuito final con los diagramas siguientes. Estos diagramas están diseñados para darte una idea de cómo debería verse el circuito final.

Esquema del circuito del sistema de asistencia RFID

 

Pines GPIO del sistema de asistencia RFID utilizados

 Preparación de la base de datos del sistema de asistencia RFID

1.Ahora, antes de continuar y programar nuestro sistema de asistencia RFID, primero debemos preparar y configurar la base de datos MYSQL. Esta base de datos es donde realizaremos un seguimiento de la asistencia de cada tarjeta RFID y quién es el propietario de esa tarjeta RFID.

Comienza instalando MYSQL en tu Raspberry Pi ejecutando el siguiente comando en tu Pi:

sudo apt-get install mysql-server -y

2. A continuación, necesitaremos ejecutar el script de " instalación segura " que viene empaquetado con MYSQL. Este script te llevará a través de algunos procesos para hacer que tu servidor MYSQL sea más seguro.

Ejecuta este script ejecutando el siguiente comando dentro del terminal en la Raspberry Pi:

sudo mysql_secure_installation

Cuando se te solicite, asegúrate de establecer una nueva contraseña para el servidor raíz MYSQL. Además, debes respondery " a la mayoría de las solicitudes, como deshabilitar el acceso de inicio de sesión de root a tu servidor MYSQL.

3.Ahora carguemos en la herramienta de línea de comandos MYSQL ejecutando el siguiente comando. Te pedirá que introduzcas la contraseña que estableciste en el paso anterior.

Como MariaDB cuando se instala utiliza UNIX_SOCKET como método de autenticación por defecto, debemos iniciar sesión usando el superusuario, haz esto usando sudo.

sudo mysql -u root -p

4. Comencemos por crear una base de datos donde almacenaremos todos los datos que utilizaremos para nuestro sistema de asistencia RFID.

Llamaremos a esta base de datos “sistema de asistencia ”. Para crear esta base de datos, ejecuta el siguiente comando:

CREATE DATABASE sistemadeasistencia;

5.Con nuestra base de datos creada, creamos ahora un usuario llamado " asistadmin ", utilizaremos este usuario en nuestros scripts de Python para leer nuestra base de datos recién creada.

Asegúrate de establecer la contraseña para esto en algo único y difícil de adivinar. Para nuestro ejemplo, solo usaremos " kolwidi" como contraseña.

CREATE USER 'asistadmin'@'localhost' IDENTIFIED BY 'kolwidi';

6. Ahora que hemos creado nuestro usuario, debemos otorgarle los derechos para acceder a nuestra base de datos del “sistema de asistencia ”.

Podemos hacer esto ejecutando el siguiente comando. Este comando te dará a nuestro usuario de " administrador de asistencia " todos los privilegios en cualquier mesa dentro de nuestra base de datos.

GRANT ALL PRIVILEGES ON sistemadeasistencia.* TO 'asistadmin'@'localhost';

7. Antes de crear nuestras tablas, necesitamos utilizar el comando " use " para que estemos interactuando directamente con la base de datos del "sistema de asistencia ".

Comienza a interactuar con la base de datos ejecutando el siguiente comando:

use sistemadeasistencia;

8. Ahora que estamos tratando directamente con la base de datos que queremos utilizar, podemos comenzar a crear las tablas donde se almacenarán todos nuestros datos.

La ejecución de los siguientes dos comandos creará las tablas en las que confiaremos para almacenar datos. Explicaremos los campos en estas tablas después de haberlos creado.

create table asistencia(
   id INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
   user_id INT UNSIGNED NOT NULL,
   clock_in TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
   PRIMARY KEY ( id )
);

create table usuarios(
   id INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
   rfid_uid VARCHAR(255) NOT NULL,
   name VARCHAR(255) NOT NULL,
   created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
   PRIMARY KEY ( id )
);

Puedes salir de la herramienta MYSQL introduciendo exit;

Ahora que hemos creado las tablas, echemos un vistazo a los datos que almacenaremos y cómo los usaremos en nuestro script.

Para la tabla de asistencia, tenemos tres datos para cada toma RFID registrada:

  • id : este es un número entero que se usa para realizar un seguimiento de la fila actual y aumenta automáticamente.
  • user_id : este es un número entero, y lo utilizamos para vincular la asistencia con un usuario en nuestra tabla de usuarios que tiene la misma identificación .
  • clock_in : esta variable almacena una marca de tiempo SQL . Esta marca de tiempo se usa para rastrear cuando el usuario toca su tarjeta RFID en el lector RFID.

Para la tabla de usuarios , tenemos cuatro datos para cada usuario que agregamos:

  • id : este es un número entero que se usa para realizar un seguimiento del usuario actual y aumenta automáticamente.
  • rfid_uid : esta variable se utiliza para almacenar el UID que se captura cuando se toca una tarjeta RFID en el lector RFID.
  • nombre : esta variable almacena el nombre de la persona propietaria de la tarjeta RFID.
  • creado : utilizamos esta variable para realizar un seguimiento de cuándo se creó el usuario.

Registro de un usuario en el sistema de asistencia

1.Antes de comenzar a escribir los scripts de nuestro sistema de asistencia, primero necesitamos instalar el “ Conector MYSQL ” de Python usando pip.

Instala la biblioteca de conectores ejecutando el siguiente comando en tu Pi.

sudo pip3 install mysql-connector-python

2. Creamos ahora una carpeta para guardar todo para este proyecto.

mkdir ~/sistemadeasistencia

3.Es hora de empezar a escribir nuestro primer script de Python para nuestro sistema de asistencia. Este primer script te permitirá crear un usuario basado en una tarjeta RFID intervenida.

Al tocar la tarjeta RFID, la secuencia de comandos de Python te pedirá que ingreses un nombre de usuario para registrar esta tarjeta a una persona.

Comienza a escribir la primera parte de nuestro sistema de asistencia ejecutando el siguiente comando:

nano ~/sistemadeasistencia/save_user.py

4.En este nuevo archivo escribe las siguientes líneas de código. Explicaremos qué hace cada sección de código a medida que avanzamos y por qué estamos utilizando ese código.

#!/usr/bin/env python

Agregamos esta línea para que el sistema operativo sepa que este archivo debe ejecutarse usando Python.

import time

Importamos la biblioteca de tiempo para que podamos poner el script en reposo, para que las cosas no ocurran instantáneamente.

import RPi.GPIO as GPIO

Necesitamos la biblioteca GPIO para que podamos ejecutar la función de limpieza cuando finalice el script.

from mfrc522 import SimpleMFRC522

La biblioteca SimpleMFRC522 se utiliza para facilitar la comunicación con nuestro lector RFID.

import mysql.connector

Utilizamos el conector MySQL para poder hablar con la base de datos que configuramos anteriormente.

import Adafruit_CharLCD as LCD

Finalmente, cargamos en la biblioteca de Adafruit para hablar con LCD. Esta biblioteca simplifica significativamente el proceso de comunicación con nuestra pantalla de 16 × 2.

db = mysql.connector.connect(
  host="localhost",
  user="asistadmin",
  passwd="kolwidi",
  database="sistemadeasistencia"
)

En esta sección del código, creamos nuestra conexión a nuestro servidor MYSQL. Para esta función, pasamos toda la información necesaria para realizar la conexión, como el host, el usuario, el nombre de la base de datos y la contraseña.

El objeto creado por el conector se almacena en la variable db para que podamos interactuar con la base de datos fácilmente.

Asegúrate de que al introducir el código que sustituya la contraseña con la que se establece anteriormente en esta guía para el “ asistadmin” usuario de SQL.

cursor = db.cursor()

Aquí instanciamos una copia del objeto cursor desde nuestra conexión a la base de datos. Utilizamos este objeto para interactuar con la base de datos y ejecutar consultas SQL.

reader = SimpleMFRC522()

Ahora preparamos la biblioteca SimpleMFRC522 al instanciarla en nuestro objeto lector. Esta biblioteca nos permitirá hablar fácilmente con el RC522 más adelante en el script para leer la entrada del lector.

lcd = LCD.Adafruit_CharLCD(4, 24, 23, 17, 18, 22, 16, 2, 4);

Nuestra línea de configuración final, prepara la biblioteca CharLCD para manejar nuestra pantalla de 16 × 2. Para esta función, pasamos todos los números de pines requeridos, la cantidad de filas y más.

try:
  while True:
    lcd.clear()
    lcd.message('Pase la tarjeta por el lector')
    id, text = reader.read()

Este bloque de código es el comienzo de nuestra lógica de creación de usuarios. Primero, envolveremos la totalidad de nuestra lógica en una declaración try: explicaremos por qué más adelante en esta guía.

También envolvemos nuestra lógica en un ciclo while True. Este bucle garantizará que el código siguiente se ejecute indefinidamente para que el usuario final pueda registrar varios usuarios en sucesión.

A continuación, borramos la pantalla LCD en cada bucle para asegurarnos de que estamos tratando con una pantalla limpia antes de escribir "Coloque la tarjeta para registrar" en la pantalla. Este texto solicita al usuario que coloque su tarjeta RFID en el lector.

Finalmente, utilizamos nuestra biblioteca SimpleMFRC522 para leer la entrada de nuestro lector. Esta función esperará hasta que un usuario coloque su lector RFID antes de devolver tanto la identificación de la tarjeta como el texto almacenado en ella.

    cursor.execute("SELECT id FROM users WHERE rfid_uid="+str(id))
    cursor.fetchone()

En esta sección, usamos el cursor para ejecutar nuestro primer bit de SQL. En esta declaración SQL, simplemente buscamos en nuestra tabla de "usuarios" para ver si alguna fila tiene un UID RFID que coincida con el ID que obtuvimos al leer la tarjeta RFID.

Para tomar los datos que recuperamos, utilizamos otra función del objeto cursor, específicamente la función fetchone (). Esta función tomará una fila de los resultados devueltos.

    if cursor.rowcount >= 1:
      lcd.clear()
      lcd.message("¿Sobre escribir usuario existente?")
      overwrite = input("Sobreescribir (Y/N)? ")

      if overwrite[0] == 'Y' or overwrite[0] == 'y':
        lcd.clear()
        lcd.message("Sobreescribiendo.")
        time.sleep(1)
        sql_insert = "UPDATE users SET name = %s WHERE rfid_uid=%s"
      else:
        continue;
    else:
      sql_insert = "INSERT INTO users (name, rfid_uid) VALUES (%s, %s)"

 

Comenzamos en esta sección comprobando cuántas filas devolvió nuestra última llamada SQL.

Si la llamada SQL devuelve filas, debemos preguntarle al usuario si desea sobrescribir el usuario ya existente.

Dentro de la declaración if procedemos a borrar la pantalla LCD y mostrar el mensaje “¿ Sobrescribir usuario existente? ”Y proporcionar un mensaje en la línea de comandos para que el usuario responda y para sobrescribir o cualquier otra cosa para cancelar.

Una vez que la función de entrada ha recibido la entrada, verificamos si el primer carácter de los datos devueltos es igual a ' Y ' o ' y '.

Si el primer carácter es igual a lo que esperamos, borramos la pantalla LCD nuevamente. A continuación, mostramos un mensaje " Overwriting user " durante un segundo.

Por último, construimos la consulta SQL para actualizar la entrada existente con el nuevo nombre que especificamos en el siguiente paso. Hacemos este proceso en lugar de eliminar la entrada anterior y volver a agregarla.

Si el usuario responde cualquier cosa que no sea ' Y ' e ' y ' a la función de entrada, entonces saltamos al inicio del ciclo usando “ continuar ”.

Si esta no era una entrada duplicada, construimos una consulta SQL diferente para crear una nueva entrada en nuestra tabla de " usuarios ". Esta nueva entrada contendrá el nuevo nombre que especificamos en el siguiente bloque de código y el ID RFID que obtuvimos cuando el usuario tocó su tarjeta.

    lcd.clear()
    lcd.message('Introduce el nuevo nombre')
    new_name = input("Nombre: ")

    cursor.execute(sql_insert, (new_name, id))

    db.commit()

    lcd.clear()
    lcd.message("Ususario " + new_name + "\n Grabado")
    time.sleep(2)
finally:
  GPIO.cleanup()

Nuestro segmento final de código es bastante simple y lo resume todo. 

Comenzamos limpiando la pantalla LCD nuevamente e indicando al usuario en la pantalla LCD que debe introducir un nuevo nombre.

Mientras tanto, en la consola, el texto " Nombre: " debería aparecer mientras utilizamos la entrada para esperar la entrada del usuario.

Una vez que un usuario ha ingresado un nombre en la consola y presionado Enter, procedemos a utilizar el objeto cursor para ejecutar la consulta que formamos en la sección anterior de código.

También creamos una tupla que se pasa a la función de ejecución. Esta tupla contiene el nuevo nombre y la identificación de la tarjeta RFID. Ambos valores pasarán automáticamente a nuestras cadenas de consulta en la ejecución.

Finalmente, confirmamos los cambios en la base de datos llamando al objeto db con la función .commit () . Si no llamamos a esta función, nuestras consultas INSERT y UPDATE no ocurrirán.

Terminamos nuestra lógica de código principal limpiando la pantalla LCD nuevamente y mostrando un mensaje que el nuevo usuario ha guardado. Ejecutamos una suspensión rápida de 2 segundos para que el usuario tenga tiempo suficiente para ver el mensaje antes de reiniciar el ciclo.

Por último, tenemos nuestra declaración finally: esta es la otra parte de nuestra declaración try : . Este fragmento de código garantiza que, pase lo que pase, ejecutaremos la función GPIO.cleanup . Por ejemplo, si presionamos CTRL + C mientras el script se está ejecutando, aún debería limpiar el estado de GPIO.

6. Con suerte, en este punto, habrás terminado de escribir el script en el archivo.

Sin embargo, si deseas verificar y asegurarte de que todo esté correcto, puedes encontrar la versión completa del código a continuación.

Una vez que estés satisfecho con todo, guarda el archivo presionando CTRL + X, luego Y y finalmente ENTER .

#!/usr/bin/env python

import time
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
import mysql.connector
import Adafruit_CharLCD as LCD

db = mysql.connector.connect(
  host="localhost",
  user="asistadmin",
  passwd="kolwidi",
  database="sistemadeasistencia"
)

cursor = db.cursor()
reader = SimpleMFRC522()
lcd = LCD.Adafruit_CharLCD(4, 24, 23, 17, 18, 22, 16, 2, 4);

try:
  while True:
    lcd.clear()
    lcd.message('Pase la tarjeta')
    id, text = reader.read()
    cursor.execute("SELECT id FROM users WHERE rfid_uid="+str(id))
    cursor.fetchone()

    if cursor.rowcount >= 1:
      lcd.clear()
      lcd.message("¿Sobreescribir usuario existente?")
      overwrite = input("¿Sobreescribir (S/N)? ")
      if overwrite[0] == 'S' or overwrite[0] == 's':
        lcd.clear()
        lcd.message("Sobreescribiendo usuario.")
        time.sleep(1)
        sql_insert = "UPDATE users SET name = %s WHERE rfid_uid=%s"
      else:
        continue;
    else:
      sql_insert = "INSERT INTO users (name, rfid_uid) VALUES (%s, %s)"
    lcd.clear()
    lcd.message('Introduce nuevo usuario')
    new_name = input("Nombre: ")

    cursor.execute(sql_insert, (new_name, id))

    db.commit()

    lcd.clear()
    lcd.message("Usuario " + new_name + "\n Grabado")
    time.sleep(2)
finally:
  GPIO.cleanup()

7.Con nuestro script save_user guardado, sigamos adelante y demos una vuelta para asegurarnos de que todo funciona como debería y no hay errores al copiar el código.

Ejecuta el script ejecutando el siguiente comando:

python3 ~/sistemadeasistencia/save_user.py

8.Toca tu tarjeta RFID y ve si todo funciona según lo previsto, si no es así, verifica tu código y cableado. Si ves " Usuario guardado ", entonces todo debería estar funcionando.

 Registro de asistencia

1.Ahora que hemos escrito nuestro script save_user y nos hemos asegurado de que funciona correctamente, pasemos a nuestro script check_attendance .

Este script se ejecutará en un bucle infinito comprobando si hay algún toque de un chip RFID. Cuando alguien toque su chip RFID, verificaremos la identificación de ese chip en la base de datos.

Si encuentra un usuario, establecemos un mensaje de bienvenida e insertamos una entrada en nuestra tabla de asistencia que tendrá la fecha y hora actual.

Comencemos el proceso de escribir el script usando el siguiente comando:

nano ~/sistemadeasistencia/check_attendance.py

2.Introduce las siguientes líneas de código. Explicaremos cada nueva sección de código a medida que avancemos, estarás familiarizado con algo de esto ya que lo usamos dentro del guión de guardar usuario en la sección anterior.

#!/usr/bin/env python
import time
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
import mysql.connector
import Adafruit_CharLCD as LCD

db = mysql.connector.connect(
  host="localhost",
  user="asistadmin",
  passwd="kolwidi",
  database="sistemadeasistencia"
)

cursor = db.cursor()
reader = SimpleMFRC522()

lcd = LCD.Adafruit_CharLCD(4, 24, 23, 17, 18, 22, 16, 2, 4);

try:
  while True:

No profundizaremos demasiado en este bloque de código, ya que todo se reutiliza de nuestro primer script save_user.py que escribimos en la última sección de este tutorial del sistema de asistencia RFID Raspberry Pi.

Lo principal que debes recordar es reemplazar la contraseña de tu base de datos que se especifica junto a " passwd ", ya que por defecto es nuestra contraseña de ejemplo, "kolwidi"

    lcd.clear()
    lcd.message('Pase la tarjeta para registrarla')
    id, text = reader.read()

En este bloque de código, limpiamos la pantalla LCD y mostramos un mensaje para pedirle al usuario que coloque su tarjeta para registrar la asistencia. Luego esperamos una respuesta del lector RFID.

    cursor.execute("SELECT id, name FROM users WHERE rfid_uid="+str(id))
    result = cursor.fetchone()

    lcd.clear()

Aquí ejecutamos nuestro primer bit de SQL. Esta declaración SQL toma tanto el “ id ” como el “ nombre ” de nuestra tabla de “ usuarios ” donde el usuario tiene el mismo ID RFID que la tarjeta que fue colocada en el lector.

Luego tomamos la fila que es devuelta por la consulta SQL y almacenamos su resultado en nuestra variable " resultado " para su uso posterior.

Finalmente, limpiamos la pantalla LCD para que esté lista para imprimir un nuevo mensaje en nuestra siguiente sección de código.

    cursor.execute("SELECT id, name FROM users WHERE rfid_uid="+str(id))
    result = cursor.fetchone()

    lcd.clear()

En esta sección, primero verificamos si la última solicitud SQL devolvió filas. Si devolvió 0, mostramos un mensaje en la pantalla de 16 × 2 que indica que el usuario no existe. "

Si tenemos una fila, procedemos a mostrar un mensaje de bienvenida al usuario. Usamos su nombre que se recuperó de la base de datos como resultado [1] .

Luego, hacemos una declaración SQL para insertar una fila en nuestra tabla de asistencia. Necesitamos pasar la identificación del usuario que recuperamos de nuestra llamada SQL anterior y se almacena en el resultado [0] .

Finalmente, confirmamos los cambios en la base de datos.

    time.sleep(2)
finally:
  GPIO.cleanup()

Nuestra sección final de código es sencilla. Dejamos el script en reposo durante dos segundos para que el usuario tenga tiempo de leer el mensaje que mostramos en la pantalla de 16 × 2 y retirar la tarjeta RFID.

La declaración " finally: " asegura que limpiamos el GPIO una vez que la secuencia de comandos ha finalizado.

3. Una vez que hayas terminado de ingresar todo el código, puedes compararlo con la versión completa que se encuentra a continuación.

Lo principal a lo que debes prestar atención al introducir todo el código es de asegurarte de que todas las sangrías sean iguales. Dos espacios deben separar cada nivel.

Una vez que estés satisfecho de que todo está correcto, guarda el archivo presionando CTRL + X, luego Y y finalmente ENTER .

#!/usr/bin/env python
import time
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
import mysql.connector
import Adafruit_CharLCD as LCD

db = mysql.connector.connect(
  host="localhost",
  user="asistadmin",
  passwd="kolwidi",
  database="sistemadeasistencia"
)

cursor = db.cursor()
reader = SimpleMFRC522()

lcd = LCD.Adafruit_CharLCD(4, 24, 23, 17, 18, 22, 16, 2, 4);

try:
  while True:
    lcd.clear()
    lcd.message('Pase la tarjeta para registrarla')
    id, text = reader.read()

    cursor.execute("Select id, name FROM users WHERE rfid_uid="+str(id))
    result = cursor.fetchone()

    lcd.clear()

    if cursor.rowcount >= 1:
      lcd.message("Bienvenido" + result[1])
      cursor.execute("INSERT INTO attendance (user_id) VALUES (%s)", (result[0],) )
      db.commit()
    else:
      lcd.message("Usuario no existe.")
    time.sleep(2)
finally:
  GPIO.cleanup()

4. Con nuestro script guardado, seguimos adelante y lo revisamos rápidamente para comprobar que todo funciona como debería.

Ejecuta el script introduciendo el siguiente comando y sigue las indicaciones que se muestran en la pantalla de 16 × 2.

python3 ~/sistemadeasistencia/check_attendance.py

Si te encuentras con algún error, asegúrate de verificar que todo el código se haya introducido correctamente.

Comprobación de la base de datos

1. Ahora que hemos escrito y probado tanto nuestro guión de guardar usuario como nuestro guión de verificación de asistencia, sigamos adelante y echemos un vistazo a nuestra base de datos para ver las nuevas entradas.

Inicia la herramienta de línea de comandos MYSQL ejecutando el siguiente comando. Te pedirá que introduzcas la contraseña que ingresaste para el usuario root antes de continuar.

Utilizamos sudo para este comando, ya que MariaDB de forma predeterminada usa UNIX_SOCKET para la autenticación.

sudo mysql -u root -p

2.Una vez que te hayas conectado a la línea de comandos de MYSQL, debes utilizar el comando " use ". Necesitamos usar este comando para que podamos interactuar con nuestra base de datos del “sistema de asistencia ”.

Ejecuta el siguiente comando para interactuar con la base de datos del "sistema de asistencia ".

use sistemadeasistencia;

3. Ahora que estamos interactuando directamente con nuestra base de datos del “sistema de asistencia”, comienza por verificar todos los usuarios que han sido creados por nuestro script.

Podemos hacer esto ejecutando una simple llamada SELECT SQL que especifique nuestra tabla de " usuarios ". El asterisco ( * ) utilizado en la consulta a continuación significa que queremos tomar todas las columnas.

Escribe el siguiente comando para obtener todos los usuarios disponibles en la tabla " usuarios ".

SELECT * FROM users;

Desde este comando, deberías ver algo como lo que tenemos a continuación.

+--+------------------+---------+------------------------+
| id | rfid_uid       | name    | created                |
+--+------------------+---------+------------------------+
|  1 | 160747764001   | Emmet   | 2019-01-31 11:28:04    |
+--+------------------+---------+------------------------+

4.Ahora que hemos comprobado la tabla de " usuarios ", sigamos adelante y echemos un vistazo a nuestra tabla de " asistencia ". Al igual que en la consulta anterior que hicimos, estamos seleccionando todas las columnas de la tabla " asistencia ".

Introduce el siguiente comando para capturar todos los datos.

SELECT * FROM attendance;

Desde este comando, deberías ver algo como lo que tenemos a continuación. Puedes hacer referencia al "user_id" de nuevo a la tabla de "usuarios" "id" para ver qué usuario se registró.

+----+---------+---------------------+
| id | user_id | clock_in            |
+----+---------+---------------------+
|  6 |       1 | 2019-02-01 03:23:30 |
|  7 |       1 | 2019-02-01 03:35:36 |
|  8 |       1 | 2019-02-01 03:36:51 |
+----+---------+---------------------+

Puedes salir de la herramienta MYSQL con exit.

 

Si has llegado hasta aquí, tendrás todo el sistema listo para funcionar, pero si quieres rematarlo podrías hacer una interfaz web que tomara los datos de la base de datos y los presentara en una web, podrías incluso hacer que desde la web se puedan introducir los datos de usuarios y tarjetas. Intentaremos hacer un articulo cubriendo este aspecto.

 

SI TE APETECE SEGUIR LEYENDO, AQUI TIENES OTROS ARTICULOS


Compartir esta publicación



← Publicación más antigua Publicación más reciente →