icon icon icon

RFID là gì? Hướng dẫn sử dụng Module RFID RC522 với Arduino

Đăng bởi Nguyễn Thành Trung vào lúc 26/05/2025

Bạn có bao giờ tự hỏi làm thế nào mà chỉ cần quẹt thẻ là có thể mở cửa văn phòng, thanh toán tại cửa hàng tiện lợi, hay check-in tại khách sạn không? Công nghệ đằng sau những tiện ích này chính là RFID - một trong những công nghệ IoT quan trọng nhất hiện nay.

Trong bài viết này, chúng ta sẽ khám phá RFID từ A đến Z và thực hành xây dựng các ứng dụng thực tế với Module RFID RC522 và Arduino. Từ việc hiểu nguyên lý hoạt động cơ bản đến xây dựng hệ thống kiểm soát ra vào hoàn chỉnh, bạn sẽ nắm vững kiến thức và kỹ năng cần thiết để áp dụng RFID vào các dự án của mình.

RFID là gì?

RFID (Radio Frequency Identification) là công nghệ nhận dạng sử dụng sóng radio để truyền dữ liệu giữa một thiết bị đọc (reader) và một thẻ điện tử (tag) mà không cần tiếp xúc vật lý. Khác với mã vạch truyền thống cần quét trực tiếp, RFID có thể hoạt động ở khoảng cách xa và đọc được nhiều thẻ cùng lúc.

Nguyên lý hoạt động của RFID khá đơn giản: Reader phát ra sóng radio với tần số nhất định, khi thẻ RFID nằm trong vùng phủ sóng, nó sẽ được kích hoạt và gửi lại thông tin được lưu trữ bên trong về cho Reader. Quá trình này diễn ra trong vài milliseconds, tạo nên sự tiện lợi và nhanh chóng mà chúng ta thường thấy.

So với các công nghệ khác như NFC, Bluetooth hay WiFi, RFID có những ưu điểm riêng biệt. NFC là một dạng RFID tần số cao với khoảng cách hoạt động rất ngắn (1-4cm), trong khi RFID truyền thống có thể hoạt động ở khoảng cách từ vài centimeter đến vài mét. Bluetooth và WiFi tuy có khoảng cách xa hơn nhưng tiêu thụ năng lượng cao và cần thiết bị có nguồn điện riêng.

Thành phần của hệ thống RFID

Một hệ thống RFID hoàn chỉnh bao gồm bốn thành phần chính:

RFID Reader/Writer là thiết bị trung tâm của hệ thống, có nhiệm vụ phát sóng radio để kích hoạt thẻ RFID và nhận dữ liệu trả về. Reader có thể chỉ đọc dữ liệu hoặc có khả năng ghi dữ liệu mới vào thẻ, tùy thuộc vào loại reader và thẻ được sử dụng.

RFID Tag/Card là thiết bị lưu trữ thông tin, bao gồm một vi mạch (chip) và anten. Chip chứa dữ liệu cần thiết như ID duy nhất, thông tin sản phẩm, hoặc dữ liệu cá nhân. Anten có nhiệm vụ thu nhận năng lượng từ sóng radio của Reader và truyền dữ liệu trở lại.

Antenna là bộ phận thu phát sóng radio, thường được tích hợp sẵn trong Reader và Tag. Thiết kế anten quyết định khoảng cách hoạt động và hiệu suất của hệ thống RFID.

Backend System là hệ thống xử lý dữ liệu phía sau, bao gồm cơ sở dữ liệu, phần mềm quản lý và giao diện người dùng. Hệ thống này xử lý thông tin từ Reader và thực hiện các hành động tương ứng như mở cửa, ghi nhận thời gian, hay cập nhật inventory.

Phân loại RFID

RFID được phân loại theo nhiều tiêu chí khác nhau:

Theo tần số hoạt động, RFID chia thành bốn loại chính. Low Frequency (LF, 125-134 kHz) có khoảng cách đọc ngắn (vài centimeter) nhưng ít bị ảnh hưởng bởi kim loại và chất lỏng, thường dùng cho kiểm soát ra vào và theo dõi động vật. High Frequency (HF, 13.56 MHz) có khoảng cách đọc trung bình (vài centimeter đến 1 mét), bao gồm công nghệ NFC, được sử dụng rộng rãi trong thanh toán và kiểم soát ra vào. Ultra High Frequency (UHF, 860-960 MHz) có khoảng cách đọc xa (có thể đến vài mét) và tốc độ truyền dữ liệu cao, thích hợp cho quản lý kho và supply chain. Microwave (2.4 GHz và 5.8 GHz) có khoảng cách đọc rất xa nhưng tiêu thụ năng lượng cao, thường dùng trong các ứng dụng đặc biệt.

Theo nguồn năng lượng, có ba loại RFID. Passive RFID không có nguồn điện riêng, hoạt động hoàn toàn bằng năng lượng từ sóng radio của Reader, có ưu điểm là giá thành thấp, tuổi thọ cao nhưng khoảng cách đọc hạn chế. Active RFID có pin riêng, có thể phát tín hiệu chủ động, khoảng cách hoạt động xa nhưng giá thành cao và cần thay pin định kỳ. Semi-passive RFID có pin để cung cấp năng lượng cho chip nhưng vẫn cần sóng radio từ Reader để truyền dữ liệu, cân bằng giữa hiệu suất và chi phí.

Theo dạng thức vật lý, RFID tag có nhiều hình dạng khác nhau phù hợp với từng ứng dụng. Card dạng thẻ cứng như thẻ tín dụng, bền và dễ sử dụng. Tag dạng nhãn dán, mỏng và dẻo, có thể dán lên nhiều bề mặt khác nhau. Sticker dạng tem dán, nhỏ gọn và rẻ tiền. Wristband dạng vòng đeo tay, thường dùng trong sự kiện và y tế.

Ưu điểm và ứng dụng của RFID

Ưu điểm nổi bật

RFID mang lại nhiều lợi ích vượt trội so với các công nghệ nhận dạng truyền thống. Đầu tiên là khả năng hoạt động không cần tiếp xúc trực tiếp, giúp tăng tốc độ xử lý và giảm mài mòn thiết bị. Người dùng chỉ cần đưa thẻ lại gần Reader mà không cần chạm vào hay đưa vào khe cắm như thẻ từ truyền thống.

Tốc độ xử lý là một ưu điểm lớn khác của RFID. Việc đọc thông tin từ thẻ RFID chỉ mất vài milliseconds, nhanh hơn nhiều so với việc quét mã vạch hay đọc thẻ từ. Điều này đặc biệt quan trọng trong các ứng dụng cần xử lý nhiều người như kiểm soát ra vào tại các tòa nhà lớn hay thanh toán tại siêu thị.

Độ bền cao là một đặc điểm quan trọng khác. Thẻ RFID không có bộ phận cơ học chuyển động, chống được nước, bụi bẩn và nhiều điều kiện môi trường khắc nghiệt. Nhiều loại thẻ RFID có thể hoạt động trong nhiệt độ từ -40°C đến +85°C và chịu được độ ẩm cao.

Khả năng đọc nhiều thẻ cùng lúc (anti-collision) là ưu điểm độc đáo của RFID. Một Reader có thể nhận diện và đọc thông tin từ nhiều thẻ khác nhau trong cùng một thời điểm, điều mà mã vạch không thể làm được. Tính năng này rất hữu ích trong quản lý kho hàng và inventory.

Ứng dụng thực tế

Kiểm soát ra vào là ứng dụng phổ biến nhất của RFID. Từ thẻ nhân viên trong văn phòng, thẻ phòng khách sạn đến thẻ học sinh trong trường học, RFID giúp quản lý an ninh một cách hiệu quả. Hệ thống có thể ghi nhận thời gian ra vào, kiểm soát quyền truy cập theo từng khu vực và tạo báo cáo chi tiết về hoạt động của người dùng.

Quản lý kho hàng và supply chain là lĩnh vực RFID phát huy mạnh mẽ. Mỗi sản phẩm được gắn tag RFID có thể được theo dõi từ lúc sản xuất đến khi đến tay người tiêu dùng. Điều này giúp giảm thất thoát hàng hóa, tăng độ chính xác của inventory và tối ưu hóa quy trình logistics.

Thanh toán không tiếp xúc đã trở thành xu hướng chính, đặc biệt sau đại dịch COVID-19. Thẻ tín dụng contactless, thẻ giao thông công cộng và ví điện tử đều sử dụng công nghệ RFID/NFC. Việc thanh toán chỉ cần một thao tác đơn giản là đưa thẻ lại gần thiết bị POS.

Ứng dụng trong y tế ngày càng được chú trọng. RFID giúp theo dõi bệnh nhân, quản lý thuốc men và thiết bị y tế, ngăn ngừa sai sót trong điều trị. Vòng đeo tay RFID có thể chứa thông tin y tế quan trọng của bệnh nhân, giúp nhân viên y tế truy cập nhanh chóng khi cần thiết.

Nông nghiệp thông minh cũng tận dụng RFID để theo dõi gia súc và quản lý cây trồng. Chip RFID được cấy vào tai hoặc đeo cổ động vật giúp theo dõi sức khỏe, sinh sản và di chuyển. Trong trồng trọt, RFID tag có thể gắn vào cây để theo dõi quá trình phát triển và áp dụng biện pháp chăm sóc phù hợp.

Giới thiệu Module RFID RC522

Thông số kỹ thuật

Module RFID RC522 là một trong những module RFID phổ biến nhất trong cộng đồng Arduino và IoT maker. Module này hoạt động ở tần số 13.56MHz thuộc dải High Frequency, tuân thủ chuẩn ISO14443A Type A, tương thích với các thẻ MIFARE Classic và MIFARE Ultralight phổ biến trên thị trường.

Khoảng cách đọc của RC522 từ 0 đến 60mm tùy thuộc vào kích thước và loại thẻ được sử dụng. Thẻ càng lớn thì khoảng cách đọc càng xa do có anten lớn hơn. Module hoạt động ở điện áp 3.3V nhưng các chân I/O tương thích với logic 5V của Arduino, giúp việc kết nối trở nên đơn giản.

Giao tiếp với vi điều khiển thông qua giao thức SPI (Serial Peripheral Interface) với tốc độ cao, đảm bảo việc truyền dữ liệu nhanh chóng và ổn định. Module cũng hỗ trợ giao tiếp I2C và UART nhưng SPI là phổ biến nhất do tốc độ cao và dễ sử dụng.

Tốc độ truyền dữ liệu có thể đạt tới 10Mbps, đủ nhanh cho hầu hết các ứng dụng. Module có khả năng phát hiện và xử lý nhiều thẻ cùng lúc nhờ thuật toán anti-collision được tích hợp sẵn.

Cấu trúc phần cứng

Pinout của RC522 bao gồm 8 chân chính. VCC cung cấp nguồn 3.3V cho module, RST là chân reset để khởi động lại module, GND là chân mass chung. Ba chân SPI là MISO (Master In Slave Out), MOSI (Master Out Slave In) và SCK (Serial Clock) để truyền dữ liệu. Chân SDA (còn được gọi là SS - Slave Select) dùng để chọn thiết bị trong giao tiếp SPI. Chân IRQ (Interrupt Request) có thể được sử dụng để tạo ngắt khi có thẻ mới được phát hiện.

LED chỉ thị trên module giúp người dùng biết trạng thái hoạt động. LED nguồn sáng khi module được cấp điện đúng cách. LED hoạt động nhấp nháy khi module đang đọc hoặc ghi dữ liệu với thẻ.

Vùng đọc thẻ được thiết kế dạng hình vuông với anten tích hợp bên trong PCB. Anten này được tối ưu hóa cho tần số 13.56MHz và có dạng hình xoắn ốc để tạo từ trường đều trên toàn bộ vùng đọc.

Tương thích

RC522 tương thích với nhiều loại thẻ RFID 13.56MHz khác nhau. MIFARE Classic 1K và 4K là loại thẻ phổ biến nhất, có khả năng lưu trữ dữ liệu người dùng và hỗ trợ mã hóa. MIFARE Ultralight có dung lượng nhỏ hơn nhưng giá thành rẻ, thích hợp cho các ứng dụng đơn giản chỉ cần lưu trữ ID.

Về board vi điều khiển, RC522 hoạt động tốt với Arduino Uno, Nano, Pro Mini và các board tương thích. Với ESP32 và ESP8266, cần lưu ý về mức điện áp logic và có thể cần điều chỉnh mức điện áp. Arduino Mega cũng tương thích tốt và có nhiều chân hơn để kết nối các thiết bị khác.

Kết nối Module RC522 với Arduino

Sơ đồ kết nối

Việc kết nối RC522 với Arduino khá đơn giản nhờ giao thức SPI chuẩn. Dưới đây là bảng kết nối chi tiết cho Arduino Uno:

RC522    |  Arduino Uno
---------|-------------
VCC      |  3.3V
RST      |  Pin 9
GND      |  GND
MISO     |  Pin 12
MOSI     |  Pin 11
SCK      |  Pin 13
SDA      |  Pin 10
IRQ      |  Không cần kết nối

Với Arduino Nano, các kết nối tương tự như Uno do chúng có cùng pinout SPI. Tuy nhiên cần lưu ý Nano có kích thước nhỏ hơn nên cần cẩn thận khi hàn.

Với ESP32, do có nhiều chân SPI hơn, bạn có thể tự định nghĩa các chân:

#define RST_PIN    22
#define SS_PIN     5
#define MOSI_PIN   23
#define MISO_PIN   19
#define SCK_PIN    18

ESP8266 cũng tương tự, thường sử dụng:

RC522    |  ESP8266
---------|----------
VCC      |  3.3V
RST      |  D3 (GPIO0)
GND      |  GND
MISO     |  D6 (GPIO12)
MOSI     |  D7 (GPIO13)
SCK      |  D5 (GPIO14)
SDA      |  D8 (GPIO15)

Chuẩn bị phần cứng

Danh sách linh kiện cần thiết:

  • 1x Module RFID RC522
  • 1x Arduino Uno/Nano hoặc ESP32/ESP8266
  • 1x Breadboard
  • Dây nối jumper (nam-nữ và nam-nam)
  • 1-2x Thẻ RFID 13.56MHz (thường đi kèm với module)
  • Nguồn cấp 5V cho Arduino (USB hoặc adapter)

Tools hỗ trợ:

  • Multimeter để kiểm tra điện áp và kết nối
  • Máy tính có cài Arduino IDE
  • Cáp USB phù hợp với board Arduino

Lưu ý an toàn:

  • Luôn ngắt nguồn trước khi thay đổi kết nối
  • Kiểm tra điện áp cấp cho module, RC522 chỉ chấp nhận 3.3V
  • Tránh chạm tay vào các chân IC khi module đang hoạt động
  • Đảm bảo kết nối GND chung giữa các thiết bị

Kiểm tra kết nối

Trước khi lập trình, cần kiểm tra kết nối phần cứng:

Test kết nối cơ bản:

  1. Đo điện áp VCC của module, phải là 3.3V ±0.1V
  2. Kiểm tra tín hiệu SPI bằng oscilloscope hoặc logic analyzer (nếu có)
  3. Quan sát LED trên module, LED nguồn phải sáng liên tục

Troubleshooting các lỗi thường gặp:

  • Nếu module không phản hồi: Kiểm tra kết nối VCC, GND và RST
  • Nếu không đọc được thẻ: Kiểm tra kết nối SPI (MISO, MOSI, SCK, SDA)
  • Nếu đọc được nhưng dữ liệu sai: Thường do nhiễu, kiểm tra dây nối và nguồn

Cài đặt thư viện và môi trường lập trình

Arduino IDE Setup

Trước tiên, bạn cần download và cài đặt Arduino IDE từ trang chủ arduino.cc. Chọn phiên bản phù hợp với hệ điều hành của bạn (Windows, macOS, hoặc Linux). Arduino IDE 2.0 có giao diện hiện đại hơn nhưng Arduino IDE 1.8.x vẫn ổn định và được sử dụng rộng rãi.

Sau khi cài đặt, kết nối Arduino với máy tính qua cáp USB. Trong Arduino IDE, vào Tools > Board và chọn board phù hợp (Arduino Uno, Nano, ESP32, v.v.). Tiếp theo chọn Tools > Port và chọn cổng COM mà Arduino đang kết nối.

Để test kết nối, bạn có thể upload chương trình Blink đơn giản: File > Examples > 01.Basics > Blink. Nếu LED built-in trên Arduino nhấp nháy, kết nối đã thành công.

Cài đặt thư viện MFRC522

Có ba cách để cài đặt thư viện MFRC522:

Cách 1: Qua Library Manager (Khuyên dùng)

  1. Mở Arduino IDE
  2. Vào Tools > Manage Libraries
  3. Tìm kiếm "MFRC522"
  4. Chọn thư viện "MFRC522" by GithubCommunity
  5. Click Install

Cách 2: Download từ GitHub

  1. Truy cập https://github.com/miguelbalboa/rfid
  2. Click "Code" > "Download ZIP"
  3. Trong Arduino IDE: Sketch > Include Library > Add .ZIP Library
  4. Chọn file ZIP đã download

Cách 3: Clone repository

git clone https://github.com/miguelbalboa/rfid.git

Sau đó copy thư mục vào thư mục libraries của Arduino.

Verify thư viện

Để kiểm tra thư viện đã được cài đặt đúng:

  1. Restart Arduino IDE
  2. Vào File > Examples, bạn sẽ thấy mục "MFRC522" với các example có sẵn
  3. Mở example "DumpInfo" để test thư viện
  4. Compile code (Ctrl+R), nếu không có lỗi thì thư viện đã được cài đặt thành công

Cấu trúc thư viện MFRC522 bao gồm:

  • MFRC522.h: Header file chính chứa khai báo các class và hàm
  • MFRC522.cpp: Implementation của các hàm
  • Các example: DumpInfo, ReadNUID, WritePersonalData, etc.
  • Documentation: Hướng dẫn sử dụng chi tiết

Lập trình cơ bản - Đọc thẻ RFID

Code đọc UID thẻ

Dưới đây là chương trình cơ bản để đọc UID (Unique Identifier) của thẻ RFID:

/*
 * Chương trình đơn giản đọc UID thẻ RFID
 * Sử dụng Module RC522 và Arduino
 */

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

// Định nghĩa các chân kết nối
#define RST_PIN         9           // Chân RST
#define SS_PIN          10          // Chân SDA (SS)

// Tạo đối tượng MFRC522
MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup() {
  // Khởi tạo Serial communication
  Serial.begin(9600);
  
  // Khởi tạo SPI bus
  SPI.begin();
  
  // Khởi tạo MFRC522
  mfrc522.PCD_Init();
  
  // In thông tin ban đầu
  Serial.println("=== RFID Reader RC522 ===");
  Serial.println("Đưa thẻ RFID lại gần reader...");
  Serial.println();
}

void loop() {
  // Kiểm tra có thẻ mới không
  if (!mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Chọn thẻ để đọc
  if (!mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  // In thông tin UID
  Serial.print("Phát hiện thẻ mới! UID: ");
  printUID(mfrc522.uid.uidByte, mfrc522.uid.size);
  Serial.println();
  
  // In thông tin loại thẻ
  Serial.print("Loại thẻ: ");
  MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  Serial.println(mfrc522.PICC_GetTypeName(piccType));
  
  Serial.println("---");
  
  // Dừng giao tiếp với thẻ hiện tại
  mfrc522.PICC_HaltA();
  
  // Delay để tránh đọc liên tục
  delay(1000);
}

// Hàm in UID dạng hex
void printUID(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

Giải thích code từng dòng

Include các thư viện cần thiết:

#include <SPI.h>        // Thư viện SPI communication
#include <MFRC522.h>    // Thư viện MFRC522

Định nghĩa các chân kết nối:

#define RST_PIN    9    // Chân reset của RC522
#define SS_PIN     10   // Chân Slave Select (SDA)

Tạo đối tượng MFRC522:

MFRC522 mfrc522(SS_PIN, RST_PIN);

Đối tượng này sẽ được sử dụng để điều khiển module RC522.

Hàm setup() chạy một lần khi Arduino khởi động:

  • Serial.begin(9600): Khởi tạo giao tiếp Serial với baudrate 9600
  • SPI.begin(): Khởi tạo SPI bus
  • mfrc522.PCD_Init(): Khởi tạo module RC522

Hàm loop() chạy liên tục:

  • PICC_IsNewCardPresent(): Kiểm tra có thẻ mới trong vùng đọc không
  • PICC_ReadCardSerial(): Đọc thông tin serial (UID) của thẻ
  • mfrc522.uid: Struct chứa thông tin UID của thẻ
  • PICC_GetType(): Xác định loại thẻ (MIFARE Classic, Ultralight, etc.)
  • PICC_HaltA(): Dừng giao tiếp với thẻ để chuẩn bị cho lần đọc tiếp theo

Test và debug

Upload code và test:

  1. Compile code bằng cách nhấn Ctrl+R hoặc click nút Verify
  2. Upload lên Arduino bằng Ctrl+U hoặc click nút Upload
  3. Mở Serial Monitor (Ctrl+Shift+M) và chọn baudrate 9600
  4. Đưa thẻ RFID lại gần module, bạn sẽ thấy UID được hiển thị

Xử lý các lỗi thường gặp:

Lỗi "Warning: Communication failure, is the MFRC522 properly connected?"

  • Kiểm tra lại kết nối phần cứng
  • Đảm bảo VCC = 3.3V, không phải 5V
  • Kiểm tra chân RST và SDA

Không phát hiện được thẻ:

  • Thử các loại thẻ khác nhau
  • Kiểm tra khoảng cách, đưa thẻ sát vào module
  • Kiểm tra kết nối SPI (MISO, MOSI, SCK)

Đọc được nhưng UID hiển thị sai:

  • Thường do nhiễu, sử dụng dây nối ngắn hơn
  • Thêm tụ lọc 100nF giữa VCC và GND
  • Kiểm tra chất lượng breadboard và dây nối

Tips optimize performance:

  • Sử dụng delay thích hợp để tránh đọc liên tục gây nhiễu
  • Implement timeout để tránh treo chương trình
  • Thêm LED hoặc buzzer để báo hiệu khi đọc thành công

Lập trình nâng cao - Đọc/Ghi dữ liệu

Cấu trúc dữ liệu thẻ MIFARE

Thẻ MIFARE Classic có cấu trúc dữ liệu phức tạp hơn so với việc chỉ đọc UID. Thẻ được chia thành các Sector (khu vực), mỗi sector chứa 4 Block (khối), mỗi block có 16 bytes dữ liệu.

MIFARE Classic 1K có 16 sectors (0-15), tổng cung 64 blocks. MIFARE Classic 4K có 40 sectors với tổng cộng 256 blocks. Block cuối cùng của mỗi sector (block trailer) chứa access keysaccess conditions, không được sử dụng để lưu dữ liệu người dùng.

Authentication Keys gồm có Key A và Key B, mỗi key dài 6 bytes. Key mặc định thường là FF FF FF FF FF FF hoặc 00 00 00 00 00 00. Các key này điều khiển quyền đọc/ghi từng block trong sector.

Access Conditions xác định quyền truy cập cho từng block, được encode trong 4 bytes cuối của block trailer. Điều này cho phép thiết lập các mức bảo mật khác nhau cho từng phần dữ liệu.

Code đọc dữ liệu từ thẻ

/*
 * Chương trình đọc dữ liệu từ block cụ thể
 * Sử dụng authentication với key
 */

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

#define RST_PIN         9
#define SS_PIN          10

MFRC522 mfrc522(SS_PIN, RST_PIN);

// Key mặc định cho MIFARE Classic
MFRC522::MIFARE_Key key;

void setup() {
  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
  
  // Chuẩn bị key mặc định
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;  // Key mặc định: FF FF FF FF FF FF
  }
  
  Serial.println("=== RFID Data Reader ===");
  Serial.println("Đưa thẻ lại gần để đọc dữ liệu...");
}

void loop() {
  // Đợi thẻ mới
  if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
    return;
  }
  
  Serial.print("UID thẻ: ");
  printUID(mfrc522.uid.uidByte, mfrc522.uid.size);
  Serial.println();
  
  // Đọc dữ liệu từ block 4 (sector 1, block 0)
  readDataFromBlock(4);
  
  Serial.println("---");
  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
  delay(2000);
}

void readDataFromBlock(byte blockNumber) {
  // Authenticate với key A
  MFRC522::StatusCode status = mfrc522.PCD_Authenticate(
    MFRC522::PICC_CMD_MF_AUTH_KEY_A, 
    blockNumber, 
    &key, 
    &(mfrc522.uid)
  );
  
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Authentication failed: ");
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  
  // Đọc dữ liệu từ block
  byte buffer[18];
  byte bufferSize = sizeof(buffer);
  
  status = mfrc522.MIFARE_Read(blockNumber, buffer, &bufferSize);
  
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Reading failed: ");
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  
  // Hiển thị dữ liệu
  Serial.print("Dữ liệu từ block ");
  Serial.print(blockNumber);
  Serial.print(": ");
  
  for (byte i = 0; i < 16; i++) {
    if (buffer[i] < 0x10) Serial.print("0");
    Serial.print(buffer[i], HEX);
    Serial.print(" ");
  }
  Serial.println();
  
  // Hiển thị dữ liệu dạng ASCII
  Serial.print("ASCII: ");
  for (byte i = 0; i < 16; i++) {
    if (buffer[i] >= 32 && buffer[i] <= 126) {
      Serial.print((char)buffer[i]);
    } else {
      Serial.print(".");
    }
  }
  Serial.println();
}

void printUID(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

Code ghi dữ liệu vào thẻ

/*
 * Chương trình ghi dữ liệu vào thẻ RFID
 * Cần cẩn thận vì có thể làm hỏng thẻ nếu ghi sai
 */

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

#define RST_PIN         9
#define SS_PIN          10

MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;

void setup() {
  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
  
  // Chuẩn bị key
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
  
  Serial.println("=== RFID Data Writer ===");
  Serial.println("CẢNH BÁO: Chương trình này sẽ ghi dữ liệu vào thẻ!");
  Serial.println("Đưa thẻ lại gần để bắt đầu...");
}

void loop() {
  if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
    return;
  }
  
  Serial.print("Đang ghi vào thẻ UID: ");
  printUID(mfrc522.uid.uidByte, mfrc522.uid.size);
  Serial.println();
  
  // Dữ liệu cần ghi (16 bytes)
  byte dataToWrite[16] = {
    'H', 'e', 'l', 'l', 'o', ' ', 'R', 'F', 
    'I', 'D', '!', ' ', '2', '0', '2', '4'
  };
  
  // Ghi vào block 4
  writeDataToBlock(4, dataToWrite);
  
  // Đọc lại để verify
  Serial.println("Verify dữ liệu đã ghi:");
  readDataFromBlock(4);
  
  Serial.println("=== Hoàn thành ===");
  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
  
  delay(5000); // Delay dài để tránh ghi liên tục
}

void writeDataToBlock(byte blockNumber, byte dataToWrite[]) {
  // Authenticate
  MFRC522::StatusCode status = mfrc522.PCD_Authenticate(
    MFRC522::PICC_CMD_MF_AUTH_KEY_A, 
    blockNumber, 
    &key, 
    &(mfrc522.uid)
  );
  
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Authentication failed: ");
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  
  // Ghi dữ liệu
  status = mfrc522.MIFARE_Write(blockNumber, dataToWrite, 16);
  
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Writing failed: ");
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  
  Serial.println("Ghi dữ liệu thành công!");
}

void readDataFromBlock(byte blockNumber) {
  MFRC522::StatusCode status = mfrc522.PCD_Authenticate(
    MFRC522::PICC_CMD_MF_AUTH_KEY_A, 
    blockNumber, 
    &key, 
    &(mfrc522.uid)
  );
  
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Authentication failed: ");
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  
  byte buffer[18];
  byte bufferSize = sizeof(buffer);
  
  status = mfrc522.MIFARE_Read(blockNumber, buffer, &bufferSize);
  
  if (status != MFRC522::STATUS_OK) {
    Serial.print("Reading failed: ");
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  
  Serial.print("Dữ liệu: ");
  for (byte i = 0; i < 16; i++) {
    if (buffer[i] >= 32 && buffer[i] <= 126) {
      Serial.print((char)buffer[i]);
    } else {
      Serial.print(".");
    }
  }
  Serial.println();
}

void printUID(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

Best practices cho data integrity:

  • Luôn authenticate trước khi đọc/ghi
  • Verify dữ liệu sau khi ghi
  • Không ghi vào block 0 (chứa UID) và block trailer
  • Sử dụng key riêng thay vì key mặc định trong ứng dụng thật
  • Backup dữ liệu quan trọng trước khi thay đổi

Chip RFID là gì? Công nghệ và ứng dụng phổ biến trong đời sống hiện đại

Đầu Đọc RFID: UHF, HF, LF - Phù Hợp Với Mọi Nhu Cầu

Giayinnhiet.vn là đơn vị chuyên cung cấp các loại giấy in nhiệt chất lượng cao và dịch vụ in tem nhãn giá rẻ với công nghệ sản xuất hiện đại nhất. Chúng tôi cam kết đem đến cho khách hàng sản phẩm và dịch vụ tốt nhất với mức giá cạnh tranh trên thị trường. Với đội ngũ nhân viên tư vấn nhiệt tình và kinh nghiệm, chúng tôi sẽ giúp quý khách hàng tìm được giải pháp in ấn phù hợp nhất với nhu cầu của mình. Hãy liên hệ với giayinnhiet.vn ngay để được tư vấn và nhận báo giá tốt nhất.

HOTLINE:  0932953111

Mr. Đạt: 0949853688

ĐỊA CHỈ: XƯỞNG SẢN XUẤT LÔ LV-1 CỤM CN TẬP TRUNG LÀNG NGHỀ TÂN TRIỀU, THANH TRÌ, HÀ NỘI

EMAIL:   TRUMGIAYIN@GMAIL.COM

FanpageTrùm giấy in

Xem ngay các sản phẩm giấy in nhiệt tại đây!

tham khảo ngay

VIẾT BÌNH LUẬN CỦA BẠN:

ĐỐI TÁC