Sistema de registro de asistencia con tarjetas RFID

Hoy te mostraré un software que acabo de programar usando PHP, MySQL, tarjetas RFID y una tarjeta ESP8266. Este programa es totalmente gratuito y open source.

Se trata de un sistema de registro de asistencia de empleados en PHP, basado en otro sistema que recién publiqué, pero ahora con una característica adicional: la asistencia también puede ser tomada usando tarjetas RFID.

De este modo se pueden asignar tarjetas RFID a los empleados (incluido totalmente en el sistema) y también pasar la asistencia de manera automática al usar estas tarjetas.

Con ligeras modificaciones incluso se podría hacer un sistema para el registro del tiempo, entradas y salidas a determinado lugar, etcétera.

A través del post te mostraré cómo usar el sistema, descargarlo, y sobre todo cómo está programado.

Lecturas recomendadas

Si bien esto no es un “copiar y pegar”, sí que toma varios aspectos de varios posts que ya he expuesto, los cuales te animo a leer:

  • Leer serial de RFID con ESP8266: te muestro el circuito de conexión y los requisitos para leer las tarjetas RFID. En este caso vamos a usar la tarjeta NodeMCU ESP8266 que puede ser conectada al lector RC522
  • Enviar lectura de RFID a PHP: una vez que ya hemos leído el serial del RFID, usamos el módulo HTTP para enviarlo a nuestro servidor web.
  • Sistema de asistencias: el sistema en el que se basa el software gratuito que te muestro en este post.

Te repito que deberías leerlos, pues aquí solo explicaré lo que cambia desde esos sistemas hasta lo presentado en este artículo. Eso sí, te dejaré el código completo a lo largo del post, pero lo digo para que puedas aprender el funcionamiento.

Dicho eso, comencemos.

Código del lector RFID

Conexión lector RFID con NodeMCU ESP8266 – Circuito

Veamos primero el código de la tarjeta ESP8266. En este caso queda así:

Como puedes ver, lo único que hace la tarjeta es enviar el valor a través de la red, en el endpoint /rfid_register.php pasándole el serial como parámetro de la URL.

Ya en el servidor nos vamos a encargar de hacer lo pertinente de acuerdo a la situación. Para este caso habrá dos modos: el modo de lectura y modo de emparejamiento.

En el modo de emparejamiento, el servidor va a tener ya un id de empleado con el que va e relacionar o emparejar el serial de la tarjeta RFID, así que tan pronto se le envíe un serial, va a realizar el registro de que la tarjeta le pertenece al empleado.

Por otro lado, en el modo de lectura simplemente se leerá el serial y en caso de que haya un empleado registrado con esa tarjeta (emparejado anteriormente usando el otro modo) se le pondrá asistencia para esa fecha.

De este modo dejamos la mayor parte del funcionamiento en el servidor, para que podamos dejar que el lector y la ESP8266 se encarguen de una sola cosa.

Base de datos

En cuanto a la base de datos MySQL que usa este sistema de asistencias con tarjetas RFID, se usan 3 tablas. La primera es la de empleados, la segunda es la de la asistencia de empleados y la tercera es la que relaciona las tarjetas RFID con cada empleado.

Funciones útiles

A las funciones que ya estaban en el sistema de asistencias, le he agregado otras adicionales para el manejo de las tarjetas RFID, el modo del lector, etcétera.

Es importante mencionar los modos del lector, pues en este caso el modo se guarda en un archivo de texto (que es creado de manera automática). Además, el ID del empleado con el que se va a emparejar también es guardado en un archivo de texto.

La función más importante es onRfidSerialRead que indica un evento: el evento del serial leído. En este caso puedes ver que si el modo es emparejamiento, se empareja el empleado (obtenido de otra función) con el serial recién leído. Además, una vez leído se pasa al modo lectura.

Por otro lado, si el modo es lectura, entonces se obtiene el empleado ligado a esa tarjeta y se le pone asistencia para esa fecha.

Emparejar empleado con tarjeta RFID

Emparejamiento de tarjeta RFID con empleado – Sistema de asistencia con PHP y MySQL

Tenemos una interfaz que muestra a los empleados con su respectiva tarjeta en caso de que ya cuenten con una. Hay 3 opciones:

  1. Asignada: el empleado ya tiene una tarjeta, al presionar el botón se desasocia la tarjeta RFID del empleado.
  2. Esperando: pone al empleado listo para que, en la siguiente lectura, se le asigne la tarjeta RFID.
  3. No asignada: muestra que el empleado no tiene ninguna tarjeta, por lo que da la opción de asignarla. En caso de que se inicie la asignación, se pasa al modo de espera.

Nota: si una tarjeta RFID ya está usada por otro empleado y ésta se asigna a uno nuevo, se eliminará la asociación que tenía con el primero. Es decir, la tarjeta le pertenece al último que la haya registrado como suya.

He usado Vue.js para manejar este apartado, haciendo llamadas AJAX. El método más complejo de entender es el de esperar a que se asigne la tarjeta, pero lo único que se hace es consultar cada determinado tiempo si el empleado ya tiene asignado un serial, en ese caso, se indica con un toast y se refresca la lista.

De cualquier modo, el código queda así:

Por cierto, se usa un algoritmo similar al de la asistencia. Primero se obtienen todos los empleados, y luego los datos de las tarjetas. Finalmente se recorren los datos de las tarjetas y en caso de que haya una tarjeta para un empleado, se le sobrepone ese valor.

También es importante notar que usamos v-if propio de Vue para mostrar los botones.

Pasar asistencia con RFID

Ahora veamos el archivo que guarda la asistencia cuando el empleado la pasa por el lector RFID. En este caso es el evento que mencioné anteriormente. La función es:

Al leer la tarjeta vamos a recibir el id del empleado (obtenida de la otra función). Primero eliminamos todos los datos que haya para ese empleado en esa fecha (por si anteriormente tenía otro valor) y después de eso se inserta la asistencia con el estado de presencia.

Por cierto, este valor ya se reflejará al pasar asistencia (la opción ya estará seleccionada):

Asistencia tomada con tarjeta RFID usando PHP y MySQL

Aunque obviamente en caso de un error, se puede usar el sistema de asistencias para modificar ese apartado. Las tarjetas solo sirven como ayuda.

Y también aparecerá en el reporte de asistencia:

Reporte de asistencia – Sistema con PHP y MySQL

Poniendo todo junto

En un escenario perfecto, se registran todos los empleados, después se les asigna una tarjeta y cada uno pasa la tarjeta por el lector día con día, para así llevar un control de asistencia completo.

Por cierto, en caso de que no te hayas dado cuenta; las tarjetas son reutilizables. Por lo que si se elimina un empleado, su tarjeta puede ser reutilizada por otro.

Esto puede ser una ventaja o desventaja dependiendo de como lo veas, pero a como yo lo veo, puedes reutilizar su tarjeta y así evitar desperdiciarlas.

Recuerda que el sistema ya tiene toda la gestión de empleados, conexión a base de datos, etcétera. Aquí básicamente estoy mostrando las modificaciones que le hice al sistema que presenté anteriormente.

Te dejo el código fuente completo (el de C++ es el código de la tarjeta) en mi GitHub. También te dejo más posts sobre PHP, ESP8266 y sistemas que he creado.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

5 comentarios en “Sistema de registro de asistencia con tarjetas RFID”

  1. Hola Parzibyte, excelente tutorial, muchas gracias por compartirlo, estuve trabajando en un proyecto parecido, la aplicacion electronica era otra pero si tengo una intranet web escrito en php y como base de datos mysql tambien, lo que yo intento realizar es que mi cliente socket sea mi aplicacion web, o sea que inicia la comunicacion o quien realiza peticiones es mi web al modulo server esp8266 y este responde, estoy en eso y desarrollandolo, este tutorial me sirve de base, gracias por eso, anteriormente escribi una web en java y use java sockets con la web como cliente socket y funcionó aparentemente bien, mi aplicacion web java corria en mi localhost con mi laptop como host conectandome a internet via wifi con una ssid de mi operador local, en el lado del servidor esp8266 con el mismo ssid y no funcionaba, lei que el servidor no era visible para mi aplicacion, y que ambas tenian que estar en la misma red y con privilegios.

Dejar un comentario