RFID可應用於門禁系統,我們可以把數據寫入標籤,然後將有權限的標籤進行記錄保存,當有用戶標籤被掃描時,進行身份信息讀取比對,然後根據權限進行相應的操作。
本篇配合OLED屏幕來模擬門禁系統,只對標籤的UID進行簡單對比判斷,當然你也可以設置好自己的密鑰,然後將數據寫入到標籤,進行更加嚴謹的身份識別。
1. 實驗材料
- Uno R3開發板
- 配套USB數據線
- 麪包板及配套連接線
- OLED顯示屏
- RFID-RC522模塊及配套S50白卡和異形卡
2. 實驗步驟
1. 根據原理圖搭建電路圖。
RC522模塊的3.3V、GND分別對應連接開發板的3.3V、GND,模塊的MOSI、MISO、SCK分別連接開發板的SPI接口11、12、13,模塊的SDA、RST分別連接開發板數字管腳10、9。OLED屏的VCC和GND分別連接開發板的3.3V和GND,OLED屏的SDA和SCL分別連接開發板A4和A5。
實驗原理圖如下圖所示:
實物連接圖如下圖所示:
2. 新建sketch,拷貝如下代碼替換自動生成的代碼並進行保存。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);
#define OLED_RESET 4
Adafruit_SSD1306 oled(128, 64, &Wire, OLED_RESET);
byte nuidPICC[4]; //存儲讀取的UID
byte cardID[4] = {0x6D, 0xC5, 0x4D, 0x96};//存儲有權限的卡ID
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
Serial.println("RC522初始化完成...");
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.setTextColor(WHITE);//開像素點發光
oled.clearDisplay();//清屏
oled.setTextSize(2); //設置字體大小
}
void loop() {
oled.clearDisplay();//清屏
oled.setCursor(15, 2);//設置顯示位置
oled.println("--RFID--");
oled.setCursor(25, 40);//設置顯示位置
oled.println("SCAN...");
oled.display(); // 開顯示
//搜索新卡
if ( ! rfid.PICC_IsNewCardPresent())
return;
// 驗證NUID是否可讀
if ( ! rfid.PICC_ReadCardSerial())
return;
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
// 檢查是否MIFARE卡類型
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println("不支持讀取此卡類型");
return;
}
// 保存讀取到的UID
for (byte i = 0; i < 4; i++) {
nuidPICC[i] = rfid.uid.uidByte[i];
}
Serial.print("十六進制UID:");
printHex(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
if (nuidPICC[0] == cardID[0] && nuidPICC[1] == cardID[1]
&& nuidPICC[2] == cardID[2] && nuidPICC[3] == cardID[3])
{
oled.clearDisplay();//清屏
oled.setCursor(15, 2);//設置顯示位置
oled.println("--RFID--");
oled.setCursor(25, 40);//設置顯示位置
oled.println("CHECK OK");
oled.display(); // 開顯示
delay(1000);
oled.clearDisplay();//清屏
oled.setCursor(15, 2);//設置顯示位置
oled.println("--RFID--");
oled.setCursor(25, 40);//設置顯示位置
oled.println("OPEN...");
oled.display(); // 開顯示
} else {
oled.clearDisplay();//清屏
oled.setCursor(15, 2);//設置顯示位置
oled.println("--RFID--");
oled.setCursor(15, 40);//設置顯示位置
oled.println("CHECK ERR");
oled.display(); // 開顯示
}
// 使放置在讀卡區的IC卡進入休眠狀態,不再重複讀卡
rfid.PICC_HaltA();
// 停止讀卡模塊編碼
rfid.PCD_StopCrypto1();
delay(3000);
}
// 十六進制輸出
void printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
3. 連接開發板,設置好對應端口號和開發板類型,進行程序下載。
3. 實驗現象
有權限的標籤卡事先保存記錄了UID,讀卡對比可以開門,而另外的卡則不能開門操作。
關注公衆號「TonyCode」,更多精彩內容分享。
回覆「1024」獲取1000G學習資料。
個人博客