當前位置:米奇創意網>生活小發明>電子DIY>

物聯網:透過RFID卡來開啟您家的大門【轉譯】手工電子DIY教程

電子DIY 閲讀(1.61W)

物聯網:透過RFID卡來開啟您家的大門【轉譯】

在生活中,家是我們最後也是最重要的歸依,原有的銅鎖,越來越不安全,而且攜帶一堆鑰匙更是不方便,許多智慧家居都已尋求更簡單、方便、快速的方式來保全我們最重要的家。如果我們能夠用創客神器來Arduino來保全我們最重要的家,透過RFID卡,當成一個開門的Key卡,那該有多好?所以本月我們要使用Arduino,透過簡單RFID Mifare卡,建立一個安全的門鎖開門利器。

主要材料:

  電控鎖  模組

所需工具:

  電腦

製作步驟:

第1步:

物聯網:透過RFID卡來開啟您家的大門【轉譯】 第2張

電控鎖
一般門禁系統進出入口大部份為門,而門閉合與開合的關鍵裝置則為鎖(如下圖所示),但是人力鎖閉合與開合的關鍵裝置需要透過人的開鎖行為來運作,以聯接門禁系統之辨識系統來閉合與開合,該『鎖』必須是電力裝置方能達到需求。
所以一般都是電力控制之電控鎖,方能在「開鎖裝置」(例如鑰匙、密碼、開鎖卡片,或是指紋、掌紋、視網膜或聲音等生物特徵)辨識並判斷使用者的身份正確後,啟動迴路通電(或斷電)至電控鎖開門。

第2步:

物聯網:透過RFID卡來開啟您家的大門【轉譯】 第3張

驅動MF RC522 RFID模塊
MF RC522 RFID模塊本身就可以讀取Mifare卡片的數據,我們依照下表進行電路連接,連接MF RC522 RFID模塊,進行電路組立。
(表1)RFID門禁管制接腳表:

第3步:

物聯網:透過RFID卡來開啟您家的大門【轉譯】 第4張

第4步:

物聯網:透過RFID卡來開啟您家的大門【轉譯】 第5張

電路組立之後,依照下表之RFID門禁管制機測試程序一進行程序攥寫的動作。
RFID門禁管制接腳表:

第5步:

物聯網:透過RFID卡來開啟您家的大門【轉譯】 第6張

RFID門禁管制機測試程式一(doorcontrol01)
#include <LiquidCrystal.h>
#include <SPI.h>

#include <RFID.h>

/* LiquidCrystal display with:
LiquidCrystal(rs, enable, d4, d5, d6, d7)

LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)

LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)

LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)

R/W Pin Read = LOW / Write = HIGH // if No Pin connect RW , please leave R/W Pin for Low State
Parameters

*/
LiquidCrystal lcd(8,9,10,38,40,42,44); //ok

RFID rfid(53,5); //this is used for Arduino Mega 2560

//RFID rfid(10,5); //this is used for Arduino UNO

void setup()

{

n(9600);

tln(“RFID Mifare Read");

n();

();

// PinMode(11,OUTPUT);

// digitalWrite(11,LOW);

n(20, 4);

// 設定 LCD 的行列數目 (4 x 20)

ursor(0,0);

// 列印 “Hello World" 訊息到 LCD 上

t(“RFID Mifare Read");

}
void loop()

{

// 將遊標設到 column 0, line 1

// (注意: line 1 是第二行(row),因為是從 0 開始數起):

tln(millis()/1000);

delay(200);

if (rd()) { //找尋卡片

if (CardSerial()) { //取得卡片的ID+CRC校驗碼

//第0~3個byte:卡片ID

tln(" “);

t(“RFID Card Number is : “);

t(um[0],HEX);

t(" , “);

t(um[1],HEX);

t(" , “);

t(um[2],HEX);

t(" , “);

tln(um[3],HEX);

//第4個byte:CRC校驗位元

t(“CRC is : “);

tln(um[4],HEX);

ursor(2, 1);

t(um[0],HEX);

ursor(5, 1);

t(um[1],HEX);

ursor(8, 1);

t(um[2],HEX);

ursor(11, 1);

t(um[3],HEX);



}



}

(); //命令卡片進入休眠狀態

delay(500); //延時0.5秒

}

第6步:

物聯網:透過RFID卡來開啟您家的大門【轉譯】 第7張

RFID卡控制開鎖
我們已經可以正確讀取卡號號,我們加入繼電器模塊來控制外部電力裝置開關與否,主要是將電磁鎖(如圖1所示)的開門開關電路,參照(表1)所示,接至繼電器模塊的Com與NC兩接點,在正確讀取到適合卡號時,啟動繼電器模塊,使繼電器模塊的Com與NC兩接點短路,讓電磁鎖(如圖1所示)開門。
由於MF RC522 RFID模塊本身就可以讀取Mifare卡片的數據,我們依照表1進行電路連接,連接MF RC522 RFID模塊,讀者依照下表之RFID門禁管制機測試程序二進行程序攥寫的動作。

(表 3)RFID 門禁管制機測試程式二:
#include <LiquidCrystal.h>
#include <SPI.h>

#include <RFID.h>

#include <String.h>

#define openkeyPin 4

int debugmode = 0;

/* LiquidCrystal display with:
LiquidCrystal(rs, enable, d4, d5, d6, d7)

LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)

LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)

LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)

R/W Pin Read = LOW / Write = HIGH // if No Pin connect RW , please leave R/W Pin for Low State
Parameters

*/
LiquidCrystal lcd(8,9,10,38,40,42,44); //ok

RFID rfid(53,5); //this is used for Arduino Mega 2560

//RFID rfid(10,5); //this is used for Arduino UNO

String keyno1 = String(“6AE4E616″);

void setup()

{

n(9600);

tln(“RFID Mifare Read");

n();

();

pinMode(openkeyPin,OUTPUT);

digitalWrite(openkeyPin,LOW);

n(20, 4);

// 設定 LCD 的行列數目 (4 x 20)

ursor(0,0);

// 列印 “Hello World" 訊息到 LCD 上

t(“RFID Mifare Read");

}
void loop()

{

// 將遊標設到 column 0, line 1

// (注意: line 1 是第二行(row),因為是從 0 開始數起):

if (rd()) { //找尋卡片

if (CardSerial()) { //取得卡片的ID+CRC校驗碼

//第0~3個byte:卡片ID

tln(" “);

t(“RFID Card Number is : “);

t(strzero(um[0],2,16));

t(“/");

t(um[0],HEX);

t(“/");

t(um[0],DEC);

t(" , “);

t(strzero(um[1],2,16));

t(“/");

t(um[1],HEX);

t(“/");

t(um[1],DEC);

t(" , “);

t(strzero(um[2],2,16));

t(“/");

t(um[1],HEX);

t(“/");

t(um[1],DEC);

t(" , “);

t(strzero(um[3],2,16));

t(“/");

t(um[0],HEX);

t(“/");

tln(um[0],DEC);

//第4個byte:CRC校驗位元

t(“CRC is : “);

t(strzero(um[4],2,16));

t(“/");

t(um[4],HEX);

t(“/");

tln(um[4],DEC);

ursor(2, 1);

t(strzero(um[0],2,16));

ursor(5, 1);

t(strzero(um[1],2,16));

ursor(8, 1);

t(strzero(um[2],2,16));

ursor(11, 1);

t(strzero(um[3],2,16));

ursor(4, 2);

t(getcardnumber(um[0],um[1],um[2],um[3]) );



}



}

(); //命令卡片進入休眠狀態

if (keyno1 == getcardnumber(um[0],um[1],um[2],um[3]))

{

digitalWrite(openkeyPin,HIGH);

ursor(0, 3);

t(“Access Granted:Open");

tln(“Access Granted:Door Open");

}

else

{

digitalWrite(openkeyPin,LOW);

ursor(0, 3);

t(“Access Denied:Closed");

tln(“Access Denied:Door Closed");

}





delay(500); //延時0.5秒

}
String getcardnumber(byte c1, byte c2, byte c3, byte c4)

{

String retstring = String(“");

at(strzero(c1,2,16));

at(strzero(c2,2,16));

at(strzero(c3,2,16));

at(strzero(c4,2,16));

return retstring;

}
String strzero(long num, int len, int base)

{

String retstring = String(“");

int ln = 1 ;

int i = 0 ;

char tmp[10] ;

long tmpnum = num ;

int tmpchr = 0 ;

char hexcode[]={‘0′,’1′,’2′,’3′,’4′,’5′,’6′,’7′,’8′,’9′,’A’,’B’,’C’,’D’,’E’,’F’} ;

while (ln <= len)

{

tmpchr = (int)(tmpnum % base) ;

tmp[ln-1] = hexcode[tmpchr] ;

ln++ ;

tmpnum = (long)(tmpnum/base) ;

/*

t(“tran :(“);

t(ln);

t(“)/(“);

t(hexcode[tmpchr] );

t(“)/(“);

t(tmpchr);

tln(“)");

*/



}

for (i = len-1; i >= 0 ; i –)

{

at(tmp[i]);

}



return retstring;

}
unsigned long unstrzero(String hexstr)

{

String chkstring ;

int len = th() ;

if (debugmode == 1)

{

t(“String “);

tln(hexstr);

t(“len:");

tln(len);

}

unsigned int i = 0 ;

unsigned int tmp = 0 ;

unsigned int tmp1 = 0 ;

unsigned long tmpnum = 0 ;

String hexcode = String(“0123456789ABCDEF") ;

for (i = 0 ; i < (len ) ; i++)

{

// chkstring= tring(i,i) ;

perCase() ;

tmp = At(i) ; // give i th char and return this char

tmp1 = xOf(tmp) ;

tmpnum = tmpnum + tmp1* POW(16,(len -i -1) ) ;

if (debugmode == 1)

{

t(“char:( “);

t(i);

t(“)/(“);

t(hexstr);

t(“)/(“);

t(tmpnum);

t(“)/(“);

t((long)pow(16,(len -i -1)));

t(“)/(“);

t(pow(16,(len -i -1) ));

t(“)/(“);

t((char)tmp);

t(“)/(“);

t(tmp1);

t(“)");

tln(“");

}

}

return tmpnum;

}
long POW(long num, int expo)

{

long tmp =1 ;

if (expo > 0)

{

for(int i = 0 ; i< expo ; i++)

tmp = tmp * num ;

return tmp ;

}

else

{

return tmp ;

}

}

我們發現圖 3(a)所示,MF RC522 模組讀到卡(卡號:316C1155),為不是正確的開門卡,所以不會啟動繼電器,而見圖 3(b)所示,MF RC522 模組讀到卡(卡號:6AE4E616),為正確的開門卡,則Arduino 開發模組在 MF RC522 模組讀到該卡號之後,比對表 3 內『String keyno1 = String(“6AE4E616″);』的變數,為相同的變數內容,則使繼電器模組的 Com 與 NC 兩接點短路,讓電磁鎖。

小貼士:

轉載文章,感謝原作者 曹永忠 先生