在工作場合常常看見智慧門鎖,能夠感應磁卡、輸入密碼、指紋或人臉辨識並遠端開關門;不過由於市面上價格較高,亦或是有安全性疑慮等因素,台灣的住宅多半不會使用全感應式的智慧門鎖,往往僅裝設在社區出入口及電梯內;到家時仍舊是以舊式的鑰匙鎖開門,不像韓國這麼普遍地使用智慧門鎖。

即使是使用鑰匙的舊式門鎖,也能簡易的安裝門禁系統,不必將整個門鎖替換;這次就來透過簡易模組實作一個結合Line Notify的RFID NBIoT門禁通知系統,讓你不用換掉整個鎖,也能隨時收到開門通知!

 

所需材料

  • Arduino Uno

  • AM7020(含天線、SIM card)

  • RFID-RC522

  • RGB LED

  • 杜邦線數條

 

Arduino Uno

Arduino Uno是一塊入門級開發版,MCU使用ATMEGA328,週邊擁有SPII2CUARTDIDOAIPWMInterruptFlash 32KBSRAM 2K,對於入門來說非常適合。

 

AM7020

AM7020是一款NBIoT模組,模組本身支援HTTP(S)、MQTT(S)、TLS等多項Protocol,加上專屬AM7020的Arduino Library,讓使用門檻大大降低,對初學者相當親切的一款模組。

 

RFID-RC522

RFID-RC522是一款RFID模組,它可以用來讀取Mifare卡片;Mifare是NXP(恩智普)半導體公司推出的非接觸型IC卡(也就是外表沒有金屬接點的卡片),在市場上獲得廣泛的採用,像是停車場的感應幣(token)、現金卡、悠遊卡、員工識別證等;Mifare卡內建EEPROM,應用程式可對它寫入和讀取數據,我們這次只需讀取UID即可。

RFID讀寫器啟動之後,讀寫器的天線將不停地發送電磁波,每當卡片進入此電磁場,卡片內部的線圈和電路將與此電磁場產生共振,從而獲得電能(無線充電也是同樣原理,但無線充電器發出的功率更大)。

 

架構

使用SPI Protocol將RFID-RC522讀卡機與Arduino Uno溝通,並讓RC522讀取到的卡片UID與預先設定在程式內的資料做比對;再以SW UART與AM7020溝通,將MQTT封包發送至Adafruit IO;Adafruit IO透過預先設定的觸發器(Trigger)觸發事件,發送webhook訊息至IFTTT,IFTTT則透過預先設定的觸發事件使用Line Notify將訊息發送至用戶端。

 

步驟

  1. 建立IFTTT事件,使用webhook觸發Line Notify

  2. 設定Adafruit IO,建立Feed、Trigger

  3. 硬體配置

  4. 程式設計

 

1.建立IFTTT事件,使用webhook觸發Line Notify

IFTTT事件的建立與觸發設定,詳細設置方式與之前介紹過的叮!有人入侵了?3步驟遠端收到LINE警訊通知!大致相同,這裡就不再贅述。

設定結果如下圖,紅框為webhook 事件名稱,請設定為「unlock」;藍框為Line Notify 相關設定,可設定接收者(個人或聊天室)、接收訊息、圖片URL等細節。

 

2.設定Adafruit IO,建立Feed、Trigger

 

接下來在Adafruit IO建立一個Feed,用來存放後續要發送到Line的訊息;首先建立一個名為「rfid-message」的Group,並在裡面建立一個名為「message」的Feed。

 

上一步中已經建立好一個用來存放訊息的Feed,接下來需要為這個Feed建立觸發條件以及觸發內容;紅框內容改為以下URL,紅字改為你的IFTTT webhook key。

http://maker.ifttt.com/trigger/unlock/with/key/<your_webhook_key>

 

建立完成後,即可看到上圖畫面。

 

3.硬體配置

Arduino Uno

AM7020

RFID-RC522

RGB LED

5v

V

-

-

3v3

-

3v3

-

Gnd

G

Gnd

Gnd

8

T

-

-

9

R

-

-

7

EN

-

-

6

-

RST

-

5

-

-

RED PIN

4

-

-

Green PIN

10

-

SDA

-

11

-

MOSI

-

12

-

MISO

-

13

-

SCK

-

 

4.程式設計

程式碼請參閱 Github( https://github.com/JiekangHuang/rfid-line-notify )

請先燒錄get_card_UID.ino這支程式,它可以讀取並顯示卡片UID、型號到序列埠視窗上;將之後想要解鎖的卡片感應,並紀錄它們的UID,後續才能將這些UID設定到主程式裡面進行驗證。

 

重點程式碼說明:

File: rfid_line_notify.ino

  • Line 11~18:預先設定可以解鎖的RFID Card UID清單,請改為自己的RFID Card UID以及名字(可用ino取得卡片UID)

  • Line 78:讀取RFID Card

  • Line 81:檢查讀取到的RFID Card UID是否在資料清單內

  • Line 89:解鎖(這裡只用綠色LED表示解鎖狀態,可自行加入門鎖裝置)

  • Line 98:上鎖(這裡只用紅色LED表示上鎖狀態,可自行加入門鎖裝置)

  • Line 86、94:發送訊息至Adafruit IO

  • Line 100:停止RFID讀取

File: config.h

  • Line 65~66:Adafruit IO帳號密碼(請改為自己的帳號密碼)

 

成品

當感應到可解鎖的卡片,系統將變更為解鎖狀態(綠燈),並發送「歡迎XX回家!」訊息至Adafruit IO;反之則為上鎖狀態(紅燈),並發送「解鎖失敗 ! UID: XXX」訊息至Adafruit IO。經由Adafruit IO Trigger呼叫IFTTT事件即可透過Line Notify將訊息發送至Line用戶端。

 

小結

透過RFID讀卡機、通訊模組AM7020、Arduino Uno以及其他免費雲端平台服務,我們就能以較低的價格做出簡易門禁通知系統;由於沒有搭配更換鎖頭,而是用LED燈號代替,因此僅能辨識出入。若是想連同門鎖一併更換,也只需將程式碼及電路稍做修改;由於這次實作的主要通訊Protocol是使用MQTT,未來要加入遠端開鎖功能也不是難事,有機會再為大家介紹更多相關內容。

單純偵測是否有人入侵私有領土,則可以參考以紅外線感測的叮!有人入侵了?3步驟遠端收到LINE警訊通知!一文,更適合範圍廣的土地或區域(例如可以加裝在貴重物品或私人土地周遭,偵測是否有有心人士靠近);Blog中還有許多實作文章,從空汙偵測到氣象預報,都能對照教學文章簡易地自製出成品,喜歡這篇文章歡迎分享給親友,各位的支持就是更新的動力!