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)
| RC522 | ESP32-C3 |
|---|---|
| SDA (SS) | GPIO10 |
| SCK | GPIO6 |
| MOSI | GPIO7 |
| MISO | GPIO2 |
| RST | GPIO3 |
| GND | GND |
| 3.3V | 3.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 data và event 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


