在工作場合常常看見智慧門鎖,能夠感應磁卡、輸入密碼、指紋或人臉辨識並遠端開關門;不過由於市面上價格較高,亦或是有安全性疑慮等因素,台灣的住宅多半不會使用全感應式的智慧門鎖,往往僅裝設在社區出入口及電梯內;到家時仍舊是以舊式的鑰匙鎖開門,不像韓國這麼普遍地使用智慧門鎖。
即使是使用鑰匙的舊式門鎖,也能簡易的安裝門禁系統,不必將整個門鎖替換;這次就來透過簡易模組實作一個結合Line Notify的RFID NBIoT門禁通知系統,讓你不用換掉整個鎖,也能隨時收到開門通知!
所需材料
-
Arduino Uno
-
AM7020(含天線、SIM card)
-
RFID-RC522
-
RGB LED
-
杜邦線數條
Arduino Uno
Arduino Uno是一塊入門級開發版,MCU使用ATMEGA328,週邊擁有SPI、I2C、UART、DI、DO、AI、PWM、Interrupt,Flash 32KB、SRAM 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將訊息發送至用戶端。
步驟
-
建立IFTTT事件,使用webhook觸發Line Notify
-
設定Adafruit IO,建立Feed、Trigger
-
硬體配置
-
程式設計
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用戶端。