/*☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄
☄ ☄
☄ ☘ DATOS GENERALES: ☄
☄ NOMBRE: Uso básico del lector RFID MFRC522. ☄
☄ FECHA: 14 de marzo de 2026. ☄
☄ VERSIÓN: 2.0. ☄
☄ ☄
☄ AUTOR: M. en C. Esli Castellanos Berján. ☄
☄ E-MAIL: [email protected]. ☄
☄ COMPAÑÍA: Universidad de Colima - Facultad de Telemática. ☄
☄ ☄
☄ uC: ESP32 (compatible con Arduino IDE). ☄
☄ Nombre: ESP32 DevKit v1. ☄
☄ ☄
☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄
☄ ☄
☄ ☘ DESCRIPCIÓN DEL PROGRAMA: ☄
☄ Arquitectura de software que ejemplifica el uso del lector RFID. ☄
☄ Se emplea la librería MFRC522 para comunicación SPI. ☄
☄ El programa detecta tarjetas, imprime su UID y continúa ejecutando ☄
☄ otras tareas sin bloquear el flujo gracias al uso de millis(). ☄
☄ ☄
☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄
☄ ☄
☄ ☘ NOTAS: ☄
☄ - El uso de millis() evita bloqueos y permite multitarea. ☄
☄ - La comunicación SPI requiere conexiones correctas: ☄
☄ SS_PIN → GPIO5, RST_PIN → GPIO21. ☄
☄ - El UID de la tarjeta es único y puede usarse como identificador. ☄
☄ - Este ejemplo es base para sistemas de acceso, control de inventario, ☄
☄ o registro de asistencia. ☄
☄ ☄
☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄☄*/
#include <SPI.h>
#include <MFRC522.h>
#include <SD.h>
// Definición de pines para el lector RFID
#define SS_PIN 5 // Slave Select (chip select del lector RFID)
#define RST_PIN 21 // Reset del lector RFID
#define CS_SD 4 // Chip Select de la MicroSD
MFRC522 rfid(SS_PIN, RST_PIN); // Objeto RFID
File archivo;
// Variables para control no bloqueante con millis()
unsigned long lastCheck = 0;
const unsigned long interval = 200; // intervalo en ms para revisar el RFID
void setup() {
Serial.begin(115200); // Comunicación serial
SPI.begin(); // Inicializa bus SPI
// Inicializar lector RFID
rfid.PCD_Init();
Serial.println("=====================================");
Serial.println(" PRUEBA RFID + MicroSD en ESP32 ");
Serial.println("=====================================");
Serial.println(F("El lector RFID-MFRC522 ha iniciado correctamente"));
// Inicializar MicroSD
if (!SD.begin(CS_SD)) {
Serial.println("Error al inicializar la MicroSD.");
while (true); // Detener si falla
}
Serial.println("MicroSD inicializada correctamente.");
}
void loop() {
// Simulación de otras tareas
delay(100);
// Revisión periódica del RFID
checkRFID();
}
// Función que revisa el lector RFID cada cierto intervalo usando millis()
void checkRFID(void) {
unsigned long currentMillis = millis();
if (currentMillis - lastCheck >= interval) {
lastCheck = currentMillis;
// Revisar si hay tarjeta nueva y leer su UID
if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
Serial.println("Tarjeta detectada!");
Serial.print("UID:");
// Construir el UID en formato texto
String uid = "";
for (byte i = 0; i < rfid.uid.size; i++) {
uid += (rfid.uid.uidByte[i] < 0x10 ? "0" : "");
uid += String(rfid.uid.uidByte[i], HEX);
if (i < rfid.uid.size - 1) uid += ":";
}
Serial.println(uid);
// Guardar en archivo de la MicroSD
archivo = SD.open("/rfid_log.txt", FILE_APPEND);
if (archivo) {
archivo.println(uid);
archivo.close();
Serial.println("UID guardado en rfid_log.txt");
} else {
Serial.println("Error al abrir el archivo.");
}
// Detener comunicación con la tarjeta
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}
}
}