基於Arduino和RFID的簡單智能門禁

簡單智能門禁

1、RFID介紹
      射頻識別(英語:Radio Frequency IDentification,縮寫:RFID)是一種無線通信技術,可以通過無線電信號識別特定目標並讀寫相關數據,而無需識別系統與特定目標之間建立機械或者光學接觸。
      無線電的信號是通過調成無線電頻率的電磁場,把數據從附着在物品上的標籤上傳送出去,以自動辨識與追蹤該物品。某些標籤在識別時從識別器發出的電磁場中就可以得到能量,並不需要電池;也有標籤本身擁有電源,並可以主動發出無線電波(調成無線電頻率的電磁場)。標籤包含了電子儲存的信息,數米之內都可以識別。與條形碼不同的是,射頻標籤不需要處在識別器視線之內,也可以嵌入被追蹤物體之內。
      許多行業都運用了射頻識別技術。將標籤附着在一輛正在生產中的汽車,廠方便可以追蹤此車在生產線上的進度。倉庫可以追蹤藥品的位置。射頻標籤也可以附於牲畜與寵物上,方便對牲畜與寵物的積極識別(防止數只牲畜使用同一個身份)。射頻識別的身份識別卡可以使員工得以進入建築鎖住的部分,汽車上的射頻應答器也可以用來徵收收費路段與停車場的費用。
      某些射頻標籤附在衣物、個人財物上,甚至於植入人體之內。由於這項技術可能會在未經本人許可的情況下讀取個人信息,這項技術也會有侵犯個人隱私之隱憂。

2、步驟

  1. 準備Arduino板一塊,RFID模塊,門禁卡兩張(我用校園卡代替),舵機一個,米思齊圖形化編程軟件,若干公母線。
  2. 利用米思齊將代碼完成,然後根據代碼中使用到的引腳接線。
  3. 將程序燒錄進Arduino板。
  4. 門禁卡放到RFID模塊上,通過米思齊的串口打印出卡號
  5. 將卡號記錄,並寫在定義的數組中。相當於門禁信息的錄入。
  6. 重複3的步驟。
  7. 那已經錄入信息的門禁卡放在RFID模塊上,會發現舵機轉動了,卡拿開,過了幾秒後舵機恢復原來狀態。這就相當於開門、關門的動作
  8. 那沒錄入信息的卡放在RFID模塊上,舵機沒任何反應。
  9. 條件允許可利用一根鐵絲將門栓和舵機連接達到一個簡單的智能門禁效果。

3、完整代碼

#include <RFID.h>
#include <SPI.h>
#include <Servo.h>

String RC;//記錄卡號
RFID rfid(10,5);
unsigned char RC_size;
unsigned char blockAddr;        //選擇操作的塊地址0~63
unsigned char i,tmp;
unsigned char status;
unsigned char str[MAX_LEN];
Servo servo_8;
char * carid[]={"20a3b4ac2","60f1d4ad6"};//卡號

char * name[]={"pan","zeng"};//對應的姓名

String RFID_readcardnum() {

 rfid.readCardSerial();
  String stringserNum=String(rfid.serNum[0], HEX)+String(rfid.serNum[1], HEX)+String(rfid.serNum[2], HEX)+String(rfid.serNum[3], HEX)+String(rfid.serNum[4], HEX);
      //選卡,返回卡容量(鎖定卡片,防止多次讀寫)
      rfid.selectTag(rfid.serNum);
  return stringserNum;
}

//4字節卡序列號,第5字節爲校驗字節
//新扇區A密碼,16個扇區,每個扇區密碼6Byte
unsigned char sectorNewKeyA[16][16] = {
 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};
unsigned char serNum[5];
//寫卡數據
//原扇區A密碼,16個扇區,每個扇區密碼6Byte
unsigned char sectorKeyA[16][16] = {
 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};

void setup(){
  RC = "";
  Serial.begin(9600);
  SPI.begin();
  rfid.init();
  Serial.begin(9600);
  servo_8.attach(8);
}

void loop(){
  if ( rfid.isCard()  ) {//判斷RFID識別信號
    Serial.println(RC);
    RC = RFID_readcardnum();//讀取到的卡號賦值給RC
    for (int i = (1); i <= (sizeof(carid)/sizeof(carid[0])); i = i + (1)) {//循環讀取數組中的信息
      if (RC == carid[(int)(i - 1)]) {//將數組中的信息與讀取的卡號比較
        Serial.println(name[(int)(i - 1)]);
        servo_8.write(90);//舵機轉動
        delay(3000);
        servo_8.write(0);//復原
        delay(0);
        break;

      }
    }
  }

}

4、相關文件:Github   演示視頻

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