Arduino提高篇21—RFID模塊門禁設計

在這裏插入圖片描述

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學習資料。
個人博客
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章