Sistema avanzado de asistencia RFID v2.0: Solución sin Ethernet
Componentes y suministros
| Arduino UNO | × | 1 |
| Cables de conexión (genéricos) | × | 1 |
| Módulo RFID RC522 | × | 1 |
Aplicaciones y servicios en línea
- addrfidwin64.zip (solo Windows)
- markattendancewin64.zip (solo Windows)
Sobre este proyecto
La primera versión de nuestro "Sistema de Asistencia RFID Online (Sin Ethernet)" podía resultar complicada para aficionados sin conocimientos de programación. Con la Versión 2 del Sistema de Asistencia RFID Online, hemos avanzado un paso más eliminando la parte de codificación. Con solo realizar algunas conexiones, podrás crear tu propio Sistema de Asistencia Online.
En esta versión lanzamos un sistema de asistencia con todos los requisitos de uno real, incluyendo pantalla LCD.
¿Cómo funciona?
Circuito:
Si tienes dudas en las conexiones, consulta la sección de esquemáticos para ver las conexiones de pines.
Circuito para la pantalla LCD:
- Pin 3 a GND con resistencia de 220 ohmios
- LCD RS → pin digital A0
- LCD Enable → pin digital A1
- LCD D4 → pin digital 5
- LCD D5 → pin digital 4
- LCD D6 → pin digital 3
- LCD D7 → pin digital 2
- LCD R/W → GND
- LCD VSS → GND
- LCD VCC → 5V
Programación:
Paso 1: Para usar el sistema, realiza lo siguiente:
- Crear grupo de usuarios de asistencia
- Generar clave de validación
Ve a: https://www.parikshacrack.com/gadgetProgrammers/user_group.html
Guarda esta clave de validación.
Paso 2: Descarga los archivos necesarios para sincronizar Arduino y la Aplicación Web:
Nota: Solo para Windows. Estamos trabajando en otros sistemas operativos.
Extrae ambos archivos ZIP y guárdalos en tu PC, eligiendo según tu arquitectura (32 o 64 bits).
Paso 3: Conecta Arduino y el lector RFID al mismo PC.
Paso 4: Copia y pega el código Arduino (sección de código) en el IDE de Arduino. Compila y sube al dispositivo.
Paso 5: Ejecuta la aplicación de escritorio "addRFIDTagsProg" (en la carpeta addRFIDTagsProg.zip).
Si todo está conectado correctamente, la aplicación se abrirá mostrando un cuadro de texto; de lo contrario, aparecerá una pantalla en blanco.
Selecciona el puerto de comunicación disponible.
Introduce la clave de validación del Paso 1 y pulsa "Validate Key". Se validará tu grupo.
Tras la validación, podrás añadir usuarios con la misma ventana (solo pedirá la clave la primera vez).
Ejecuta de nuevo el programa tras validar, elige el puerto libre y aparecerá:
Acercando la tarjeta al lector RFID RC522, mostrará el UID. Introduce el nombre del usuario y pulsa Enter (el botón aparece tras detectar la tarjeta).
Si se añade correctamente, mostrará mensaje de éxito y podrás ver al usuario en el panel web:
URL: https://www.parikshacrack.com/gadgetProgrammers/index.php
Paso 6: Accede a la aplicación web para asignar etiquetas RFID a empleados/estudiantes:
Ve a Pestaña Users → Pending User List.
Paso 7: Ejecuta la aplicación "markOnlineAttendance" (en markattendancewin64.zip).
Se abrirá una pantalla mostrando Status: connected.
Acercando la etiqueta RFID al lector durante unos segundos, se registrará la asistencia de la persona correspondiente.
Paso 8: Para ver la asistencia de todos los empleados/estudiantes en un mes o año:
- Ve a Pestaña Attendance Controls → View Attendance
- Selecciona mes y año
- Pulsa "Show"
¡Listo! Si te gusta, dale apoyo. Deja tus dudas en los comentarios.
Código
Código Arduino
/* --------------------------------------------------------------------------------------------------------------------
Ejemplo para leer nuevo NUID de un PICC a serial.
Basado en librería MFRC522: https://github.com/miguelbalboa/rfid
-------------------------------------------------------------------------------------------------------------------- */
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
// Pines LCD
const int rs = A0, en = A1, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#define SS_PIN 10
#define RST_PIN 9
int writeVal;
int greenLedPin = A2;
int redLedPin = A3;
int orangeLedPin = 6;
int buzzerPin = A4;
boolean chkConn = false;
MFRC522 rfid(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
byte nuidPICC[4];
boolean isValidating = false;
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
pinMode(greenLedPin, OUTPUT);
pinMode(redLedPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("GadgetProgrammer");
delay(100);
lcd.setCursor(0, 1);
lcd.print(" Not Connected! ");
establishConnection();
}
void loop() {
lcd.setCursor(0, 1);
char retOutput;
if (Serial.available() > 0) {
retOutput = Serial.read();
lcd.blink();
if (retOutput == 'A') {
chkConn = true;
analogWrite(orangeLedPin, 0);
lcd.print("Swipe Your Card!");
}
if (retOutput == 'V') {
analogWrite(orangeLedPin, 1000);
lcd.print("Validating Group");
isValidating = true;
delay(1000);
}
if (retOutput == 'S') {
lcd.print("Validation Done!");
glowGreenLed(1000);
isValidating = false;
delay(1000);
}
}
if (chkConn && retOutput != 0) {
if (retOutput == '1') {
lcd.print("Attendance Done!");
glowGreenLed(1000);
delay(4000);
} else if (retOutput == '0') {
lcd.print("Network Error !");
glowRedLed(1000);
delay(4000);
} else if (retOutput == '2') {
lcd.print("User Not Found!");
glowRedLed(1000);
delay(4000);
} else if (retOutput == '5') {
lcd.print("Network Error!");
glowRedLed(1000);
delay(4000);
}
if (!isValidating) {
lcd.setCursor(0, 1);
analogWrite(orangeLedPin, 0);
lcd.print("Swipe Your Card!");
}
}
if (!rfid.PICC_IsNewCardPresent()) return;
if (!rfid.PICC_ReadCardSerial()) return;
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
return;
}
String s;
for (byte i = 0; i < 4; i++) {
nuidPICC[i] = rfid.uid.uidByte[i];
}
printHex(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
lcd.setCursor(0, 1);
lcd.print("Reading Card...!");
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
delay(1000);
}
void printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? "0" : "");
Serial.print(buffer[i], HEX);
}
}
void printDec(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? "0" : "");
Serial.print(buffer[i], DEC);
}
}
void glowGreenLed(int delaytime) {
digitalWrite(orangeLedPin, LOW);
digitalWrite(greenLedPin, HIGH);
digitalWrite(redLedPin, LOW);
tone(buzzerPin, 5000, 300);
if (delaytime > 0) {
delay(delaytime);
digitalWrite(greenLedPin, LOW);
noTone(buzzerPin);
}
}
void glowRedLed(int delaytime) {
digitalWrite(orangeLedPin, LOW);
digitalWrite(greenLedPin, LOW);
digitalWrite(redLedPin, HIGH);
digitalWrite(buzzerPin, HIGH);
delay(1000);
tone(buzzerPin, 5000);
if (delaytime > 0) {
delay(delaytime);
digitalWrite(redLedPin, LOW);
noTone(buzzerPin);
}
}
void glowOrangeLed() {
analogWrite(orangeLedPin, 100);
delay(100);
}
void establishConnection() {
while (Serial.available() <= 0 && !chkConn) {
Serial.println("A");
glowOrangeLed();
delay(200);
}
}
void printLcdMsg(String msg, int col, int row) {
if (msg.equals("") || row < 0 || col < 0) {
row = 0; col = 1;
}
lcd.setCursor(col, row);
lcd.print(msg);
}
Esquemáticos
- Conexiones de pines Arduino y LCD
- Conexiones de pines Arduino y RFID
Proceso de manufactura
- El rodillo de cocina: de los orígenes etruscos a la artesanía moderna
- La Evolución y la Artesanía de los Bolos de Bolera Modernos
- Sistemas de calefacción solar: de soluciones pasivas a activas para calefacción sostenible del hogar
- De los Fíbulas Antiguos a la Fabricación Moderna: El Imperdible Explicado
- Primal Display: construye monitor temperatura LCD con Raspberry Pi
- Sistema de Asistencia RFID Fiable con Arduino y Python
- Sistema de control de asistencia RFID en tiempo real con Arduino y Google Sheets
- Sistemas de transporte explicados: Funcionamiento, tipos y beneficios clave
- Domina el Sistema de Suspensión de tu Vehículo: Protege tu Coche y Mejora la Comodidad
- Sistema revolucionario de refrigeración termoeléctrica mejora rendimiento de computadoras y baterías
- Elkem Silicones presenta LSR Select: curado a baja temperatura y formulación a medida para ciclos un 50 % más rápidos