IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series ESP32 & Cảm biến: Bài 20 – Đọc cảm biến RC522 (RFID): quét thẻ RFID & theo dõi realtime

Sau các bài về cảm biến môi trường, nhiệt độ và thời gian, chúng ta chuyển sang nhóm cảm biến nhận dạng (Identification).

RC522 (RFID 13.56 MHz) là module cực kỳ phổ biến để xây các hệ:

  • Chấm công
  • Kiểm soát ra vào
  • Nhận diện người dùng / thiết bị
  • Gắn sự kiện với ID duy nhất

Trong bài này, bạn sẽ:

  • Đọc UID thẻ RFID bằng ESP32
  • Chuẩn hoá dữ liệu sự kiện
  • Gửi realtime event lên IoTLabs Cloud MQTT

1. RFID trong hệ IoT có vai trò gì?

Khác với cảm biến đo đạc, RFID tạo ra event:

  • Có thẻ → có sự kiện
  • Không có thẻ → không có dữ liệu

RFID thường dùng để:

  • Gắn con người / vật thể vào hệ IoT
  • Kết hợp với:
    • Thời gian (RTC)
    • Vị trí (Area / Zone)
    • Trạng thái thiết bị

👉 Đây là nền tảng của Access Control & Tracking System.

2. Giới thiệu module RC522

RC522 là module RFID giá rẻ, phổ biến cho maker:

  • Tần số: 13.56 MHz
  • Chuẩn thẻ: MIFARE (UID)
  • Giao tiếp: SPI
  • Khoảng cách đọc: ~2–5 cm

📌 RC522 không dùng I2C, mà dùng SPI, giúp bạn làm quen thêm một bus quan trọng.

3. Chuẩn bị phần cứng & nối dây

Thiết bị

  • ESP32-C3 SuperMini
  • Module RC522
  • Thẻ RFID (card hoặc keyfob)

Kết nối SPI (ESP32-C3)

RC522ESP32-C3
SDA (SS)GPIO10
SCKGPIO6
MOSIGPIO7
MISOGPIO2
RSTGPIO3
GNDGND
3.3V3.3V

⚠️ Không cấp 5V cho RC522.

4. Thư viện sử dụng

Cài thư viện:

  • MFRC522 (Miguel Balboa)

5. Ví dụ 1: Đọc UID thẻ RFID (local)

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 3

MFRC522 rfid(SS_PIN, RST_PIN);

void setup() {
  Serial.begin(115200);
  SPI.begin(6, 2, 7, SS_PIN); // SCK, MISO, MOSI, SS
  rfid.PCD_Init();
  Serial.println("RC522 ready");
}

void loop() {
  if (!rfid.PICC_IsNewCardPresent()) return;
  if (!rfid.PICC_ReadCardSerial()) return;

  String uid = "";
  for (byte i = 0; i < rfid.uid.size; i++) {
    uid += String(rfid.uid.uidByte[i], HEX);
  }

  Serial.print("Card UID: ");
  Serial.println(uid);

  rfid.PICC_HaltA();
}

📌 UID là định danh duy nhất, dùng để mapping user / object phía server.

6. Chuẩn dữ liệu sự kiện RFID gửi Cloud

RFID không phải metric, mà là event:

{
  "ts": 1760000000,
  "event": {
    "type": "rfid_scan",
    "uid": "a1b2c3d4",
    "status": "detected"
  }
}

👉 Đây là điểm khác biệt quan trọng giữa sensor dataevent data.

7. Ví dụ 2: Gửi sự kiện RFID realtime qua MQTT

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 3

MFRC522 rfid(SS_PIN, RST_PIN);

const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_PASS";

const char* MQTT_HOST = "mqtt.iotlabs.vn";
const int MQTT_PORT = 8883;
const char* MQTT_USER = "YOUR_MQTT_USER";
const char* MQTT_PASS = "YOUR_MQTT_PASS";

const char* MQTT_TOPIC =
  "iotlabs/<orgId>/devices/<deviceId>/events";

WiFiClientSecure net;
PubSubClient mqtt(net);

void connectWiFi() {
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) delay(500);
}

void connectMQTT() {
  net.setInsecure();
  mqtt.setServer(MQTT_HOST, MQTT_PORT);
  while (!mqtt.connected()) {
    mqtt.connect("esp32c3-rc522", MQTT_USER, MQTT_PASS);
    delay(1000);
  }
}

void setup() {
  Serial.begin(115200);
  SPI.begin(6, 2, 7, SS_PIN);
  rfid.PCD_Init();
  connectWiFi();
  connectMQTT();
}

void loop() {
  if (!mqtt.connected()) connectMQTT();
  mqtt.loop();

  if (!rfid.PICC_IsNewCardPresent()) return;
  if (!rfid.PICC_ReadCardSerial()) return;

  String uid = "";
  for (byte i = 0; i < rfid.uid.size; i++) {
    uid += String(rfid.uid.uidByte[i], HEX);
  }

  long ts = millis() / 1000;

  String payload = "{";
  payload += "\"ts\":" + String(ts) + ",";
  payload += "\"event\":{";
  payload += "\"type\":\"rfid_scan\",";
  payload += "\"uid\":\"" + uid + "\"";
  payload += "}}";

  mqtt.publish(MQTT_TOPIC, payload.c_str());
  Serial.println(payload);

  rfid.PICC_HaltA();
  delay(1500);
}

8. Kinh nghiệm thực tế với RC522

  • Luôn debounce quét thẻ (delay / cooldown)
  • Không gửi liên tục cùng 1 UID
  • Mapping UID → user ở backend
  • Kết hợp:
    • RTC (thời gian)
    • Area / Gate ID
    • Device ID

👉 Đây là nền tảng cho Access Control System.

9. Ứng dụng thực tế từ Bài 20

Sau bài này, bạn có thể xây:

  • Hệ thống chấm công
  • Kiểm soát cửa
  • Quản lý ra/vào phòng
  • Theo dõi thiết bị theo thẻ

👉 RFID đưa IoT từ đo đạc → tương tác con người.

10. Tổng kết Bài 20

Bạn đã:

  • Làm quen SPI bus
  • Đọc RFID UID bằng ESP32
  • Phân biệt event vs metric
  • Gửi sự kiện realtime lên IoTLabs Cloud

👉 Gợi ý mở rộng:

  • RFID + RTC → access log
  • RFID + Rule → mở cửa / cảnh báo