LinkIt7697搭配LinkIt Remote打造智慧門禁系統 6項功能、6大特色一次帶您看!!

作者/攝影
  • 智慧門禁系統作者:曾希哲老師
  • 文字整理:CAVEDU 宗諭
  • 圖片:曾希哲老師、pixabay
材料表
  • LinkIt 7697*1(若欲購買,請洽機器人王國商城)
  • RC522 RFID讀取器*1
  • 電磁鎖*1
  • LCD*1
  • 蜂鳴器*1
  • Mifare S50 Card*1
  • 智慧型手機*1

因長期致力於科技教育,CAVEDU團隊認識許多老師,但慢慢地我們才發現,教師當中真是人才濟濟,高手藏身於教育界。對科技、程式教育,有熱忱又富能力的老師其實相當多,例如熱衷於四軸飛行器教學的洪雅慧老師,還有對於Micro:bit深有研究的劉正吉老師⋯⋯等等,而花蓮的曾希哲老師也是其中之一。

圖1 各路高手在教師界

 

若仔細瞧瞧曾希哲老師的臉書頁面,上面幾乎都是他各種學習程式、物聯網、開發板的心得、照片及影片,例如,他最近就在玩LinkIt 7697的擴充板,不斷發出新的貼文,真感受到他的樂此不疲!為將所學得的技術充分教導給學生,曾老師也架設一個網站「曾希哲的學習天地」,上面有他學習物聯網、LinkIt 7697、Arduino⋯⋯等等心得,讀者們記得抽空去逛逛喔!

圖2 曾希哲老師的個人網站

 

本文的主角是曾希哲老師一手打造的「智慧門禁系統」。當初,曾老師有做過RFID的門禁系統,並於2017年以此系統參加過「花蓮創客賽物聯網組」,卻一直找不著適合的按鍵輸入方式。

因此,曾希哲老師便逐漸萌生以手機當作藍牙鍵盤的想法,並想透過LinkIt Remote實現。後來,他在手機上實做出藍牙鍵盤,並加入原有的門禁系統中,再把幾項一直想做出的功能實現,最後「智慧門禁系統」就大功告成。(噹啷~~)

圖3 智慧門禁系統

 

讓我們先看看曾希哲老師親自錄製的介紹影片:

 

這個「智慧門禁系統」包含哪些單元呢?請見下圖:

圖4

 

智慧門禁系統的功能與特色

系統是以LinkIt 7697為核心建立,有以下幾項功能:

  1. 可用RFID刷卡輸入
  2. 可以藍牙鍵盤輸入
  3. LCD顯示輸出
  4. 蜂鳴器輸出
  5. 若使用者兩次輸入錯誤,系統就會透過Line即時訊息通知屋主。
  6. 假設使用者受威脅必須開門,可輸入威脅密碼,門一樣會打開,但會在威脅者無法察覺情況下,以Line即時訊息通知屋主,使屋主能盡快報警。

 

這個系統又有哪些特色呢?

  1. 以手機作為藍牙鍵盤,使用起來相對方便。
  2. 使用者受威脅需開門時,可使用威脅密碼。
  3. 同時使用藍牙與WiFi功能,LinkIt 7697是以IFTTT網路服務,透過Wi-Fi傳送Line即時訊息。
  4. 不需使用App Inventor撰寫手機程式,只要撰寫7697程式即可。
  5. 使用LinkIt 7697 BlocklyDuino,程式撰寫比較容易。
圖5

 

圖6 圖5、6為曾希哲老師運用LinkIt 7697 BlocklyDuino,所撰寫的程式碼。

 

6.可透過這個系統,學習RFID的概念。

 

進一步交流

關於如何自造智慧門禁系統,應是因製作步驟較複雜,曾希哲老師只簡單提及,就是拆解系統各部分功能,然後進行各單元製作、測試,逐步組成為一個完整系統。若讀者閱畢本文,有興趣進一步了解此系統,歡迎直接至曾希哲老師的臉書頁面與他交流。

前文提及,曾老師設計、製作此系統很重要的原因,是為了實踐把手機當成藍牙鍵盤。而他是用BlocklyDuino撰寫藍牙鍵盤的程式,若讀者想更多了解,可點此下載原始程式碼。

 

結語

總之,曾希哲老師目前正積極測試LinkIt 7697擴充板的各式功能,若後續有任何消息、成果,CAVEDU教育團隊也會成為報馬仔,透過技術部落格或臉書粉絲專頁,跟讀者們分享,敬請期待!

 

附錄:

曾希哲老師以BlocklyDuino撰寫藍牙鍵盤的程式碼

[pastacode lang=”c” manual=”%2F*%0A%20*%20Generated%20using%20BlocklyDuino%3A%0A%20*%0A%20*%20https%3A%2F%2Fgithub.com%2FMediaTek-Labs%2FBlocklyDuino-for-LinkIt%0A%20*%0A%20*%20Date%3A%20Wed%2C%2027%20Jun%202018%2018%3A58%3A00%20GMT%0A%20*%2F%0A%0A%23include%20%3CLRemote.h%3E%0A%0Aint%20SetPasswd%3B%0A%0Aint%20PhonePasswd%3B%0A%0Aint%20c%3B%0A%0AString%20S1%3B%0A%0AString%20S2%3B%0A%0AString%20S3%3B%0A%0AString%20S4%3B%0A%0AString%20InputPsaawd%3B%0A%0AString%20OpeningDoor%3B%0A%0AString%20PasswdError%3B%0A%0ALRemoteLabel%20label1%3B%0ALRemoteButton%20button7%3B%0ALRemoteButton%20button8%3B%0ALRemoteButton%20button9%3B%0ALRemoteButton%20button4%3B%0ALRemoteButton%20button5%3B%0ALRemoteButton%20button6%3B%0ALRemoteButton%20button1%3B%0ALRemoteButton%20button2%3B%0ALRemoteButton%20button3%3B%0ALRemoteButton%20button0%3B%0ALRemoteButton%20button10%3B%0A%0Avoid%20setup()%0A%7B%0A%20%20pinMode(LED_BUILTIN%2C%20OUTPUT)%3B%0A%20%20LRemote.setName(%22LinkIt%207697%22)%3B%0A%20%20LRemote.setOrientation(RC_PORTRAIT)%3B%0A%20%20LRemote.setGrid(3%2C%205)%3B%0A%20%20%20%20label1.setPos(0%2C%200)%3B%0A%20%20%20%20label1.setText(%22Input%20Password%22)%3B%0A%20%20%20%20label1.setSize(3%2C%201)%3B%0A%20%20%20%20label1.setColor(RC_ORANGE)%3B%0A%20%20%20%20LRemote.addControl(label1)%3B%0A%0A%20%20%20%20button7.setPos(0%2C%201)%3B%0A%20%20%20%20button7.setText(%227%22)%3B%0A%20%20%20%20button7.setSize(1%2C%201)%3B%0A%20%20%20%20button7.setColor(RC_BLUE)%3B%0A%20%20%20%20LRemote.addControl(button7)%3B%0A%0A%20%20%20%20button8.setPos(1%2C%201)%3B%0A%20%20%20%20button8.setText(%228%22)%3B%0A%20%20%20%20button8.setSize(1%2C%201)%3B%0A%20%20%20%20button8.setColor(RC_GREEN)%3B%0A%20%20%20%20LRemote.addControl(button8)%3B%0A%0A%20%20%20%20button9.setPos(2%2C%201)%3B%0A%20%20%20%20button9.setText(%229%22)%3B%0A%20%20%20%20button9.setSize(1%2C%201)%3B%0A%20%20%20%20button9.setColor(RC_BLUE)%3B%0A%20%20%20%20LRemote.addControl(button9)%3B%0A%0A%20%20%20%20button4.setPos(0%2C%202)%3B%0A%20%20%20%20button4.setText(%224%22)%3B%0A%20%20%20%20button4.setSize(1%2C%201)%3B%0A%20%20%20%20button4.setColor(RC_GREEN)%3B%0A%20%20%20%20LRemote.addControl(button4)%3B%0A%0A%20%20%20%20button5.setPos(1%2C%202)%3B%0A%20%20%20%20button5.setText(%225%22)%3B%0A%20%20%20%20button5.setSize(1%2C%201)%3B%0A%20%20%20%20button5.setColor(RC_BLUE)%3B%0A%20%20%20%20LRemote.addControl(button5)%3B%0A%0A%20%20%20%20button6.setPos(2%2C%202)%3B%0A%20%20%20%20button6.setText(%226%22)%3B%0A%20%20%20%20button6.setSize(1%2C%201)%3B%0A%20%20%20%20button6.setColor(RC_GREEN)%3B%0A%20%20%20%20LRemote.addControl(button6)%3B%0A%0A%20%20%20%20button1.setPos(0%2C%203)%3B%0A%20%20%20%20button1.setText(%221%22)%3B%0A%20%20%20%20button1.setSize(1%2C%201)%3B%0A%20%20%20%20button1.setColor(RC_BLUE)%3B%0A%20%20%20%20LRemote.addControl(button1)%3B%0A%0A%20%20%20%20button2.setPos(1%2C%203)%3B%0A%20%20%20%20button2.setText(%222%22)%3B%0A%20%20%20%20button2.setSize(1%2C%201)%3B%0A%20%20%20%20button2.setColor(RC_GREEN)%3B%0A%20%20%20%20LRemote.addControl(button2)%3B%0A%0A%20%20%20%20button3.setPos(2%2C%203)%3B%0A%20%20%20%20button3.setText(%223%22)%3B%0A%20%20%20%20button3.setSize(1%2C%201)%3B%0A%20%20%20%20button3.setColor(RC_BLUE)%3B%0A%20%20%20%20LRemote.addControl(button3)%3B%0A%0A%20%20%20%20button0.setPos(0%2C%204)%3B%0A%20%20%20%20button0.setText(%220%22)%3B%0A%20%20%20%20button0.setSize(1%2C%201)%3B%0A%20%20%20%20button0.setColor(RC_GREEN)%3B%0A%20%20%20%20LRemote.addControl(button0)%3B%0A%0A%20%20%20%20button10.setPos(1%2C%204)%3B%0A%20%20%20%20button10.setText(%22Clear%22)%3B%0A%20%20%20%20button10.setSize(2%2C%201)%3B%0A%20%20%20%20button10.setColor(RC_ORANGE)%3B%0A%20%20%20%20LRemote.addControl(button10)%3B%0A%20%20LRemote.begin()%3B%0A%20%20SetPasswd%20%3D%2010%3B%0A%20%20PhonePasswd%20%3D%200%3B%0A%20%20c%20%3D%200%3B%0A%20%20digitalWrite(LED_BUILTIN%2C%20LOW)%3B%0A%20%20S1%20%3D%20%22*%22%3B%0A%20%20S2%20%3D%20%22**%22%3B%0A%20%20S3%20%3D%20%22***%22%3B%0A%20%20S4%20%3D%20%22****%22%3B%0A%20%20InputPsaawd%20%3D%20%22Input%20Password%22%3B%0A%20%20OpeningDoor%20%3D%20%22Opening%20Door%22%3B%0A%20%20PasswdError%20%3D%20%22Password%20Error%22%3B%0A%7D%0A%0A%0Avoid%20loop()%0A%7B%0A%20%20LRemote.process()%3B%0A%20%20if%20(button0.isValueChanged())%20%7B%0A%20%20%20%20if%20(button0.getValue()%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20c%20%3D%20c%20%2B%201%3B%0A%20%20%20%20%20%20if%20(c%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20%20%20PhonePasswd%20%3D%20PhonePasswd%20%2B%201%3B%0A%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%7D%0A%0A%20%20%7D%20else%20if%20(button1.isValueChanged())%20%7B%0A%20%20%20%20if%20(button1.getValue()%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20c%20%3D%20c%20%2B%201%3B%0A%20%20%20%20%20%20if%20(c%20%3D%3D%202)%20%7B%0A%20%20%20%20%20%20%20%20PhonePasswd%20%3D%20PhonePasswd%20%2B%202%3B%0A%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%7D%0A%20%20%7D%20else%20if%20(button2.isValueChanged())%20%7B%0A%20%20%20%20if%20(button2.getValue()%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20c%20%3D%20c%20%2B%201%3B%0A%20%20%20%20%20%20if%20(c%20%3D%3D%203)%20%7B%0A%20%20%20%20%20%20%20%20PhonePasswd%20%3D%20PhonePasswd%20%2B%203%3B%0A%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%7D%0A%20%20%7D%20else%20if%20(button3.isValueChanged())%20%7B%0A%20%20%20%20if%20(button3.getValue()%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20c%20%3D%20c%20%2B%201%3B%0A%20%20%20%20%20%20if%20(c%20%3D%3D%204)%20%7B%0A%20%20%20%20%20%20%20%20PhonePasswd%20%3D%20PhonePasswd%20%2B%204%3B%0A%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%7D%0A%20%20%7D%20else%20if%20(button4.isValueChanged())%20%7B%0A%20%20%20%20if%20(button4.getValue()%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20c%20%3D%20c%20%2B%201%3B%0A%0A%20%20%20%20%7D%0A%20%20%7D%20else%20if%20(button5.isValueChanged())%20%7B%0A%20%20%20%20if%20(button5.getValue()%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20c%20%3D%20c%20%2B%201%3B%0A%0A%20%20%20%20%7D%0A%20%20%7D%20else%20if%20(button6.isValueChanged())%20%7B%0A%20%20%20%20if%20(button6.getValue()%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20c%20%3D%20c%20%2B%201%3B%0A%0A%20%20%20%20%7D%0A%20%20%7D%20else%20if%20(button7.isValueChanged())%20%7B%0A%20%20%20%20if%20(button7.getValue()%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20c%20%3D%20c%20%2B%201%3B%0A%0A%20%20%20%20%7D%0A%20%20%7D%20else%20if%20(button8.isValueChanged())%20%7B%0A%20%20%20%20if%20(button8.getValue()%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20c%20%3D%20c%20%2B%201%3B%0A%0A%20%20%20%20%7D%0A%20%20%7D%20else%20if%20(button9.isValueChanged())%20%7B%0A%20%20%20%20if%20(button9.getValue()%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20c%20%3D%20c%20%2B%201%3B%0A%0A%20%20%20%20%7D%0A%20%20%7D%20else%20if%20(button10.isValueChanged())%20%7B%0A%20%20%20%20if%20(button10.getValue()%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20label1.updateText(String(InputPsaawd))%3B%0A%20%20%20%20%20%20c%20%3D%200%3B%0A%20%20%20%20%20%20PhonePasswd%20%3D%200%3B%0A%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20if%20(c%20%3D%3D%201)%20%7B%0A%20%20%20%20label1.updateText(String(S1))%3B%0A%0A%20%20%7D%20else%20if%20(c%20%3D%3D%202)%20%7B%0A%20%20%20%20label1.updateText(String(S2))%3B%0A%20%20%7D%20else%20if%20(c%20%3D%3D%203)%20%7B%0A%20%20%20%20label1.updateText(String(S3))%3B%0A%20%20%7D%20else%20if%20(c%20%3D%3D%204)%20%7B%0A%20%20%20%20label1.updateText(String(S4))%3B%0A%20%20%20%20delay(500)%3B%0A%20%20%20%20if%20(SetPasswd%20%3D%3D%20PhonePasswd)%20%7B%0A%20%20%20%20%20%20label1.updateText(String(OpeningDoor))%3B%0A%20%20%20%20%20%20digitalWrite(LED_BUILTIN%2C%20HIGH)%3B%0A%20%20%20%20%20%20delay(5000)%3B%0A%20%20%20%20%20%20digitalWrite(LED_BUILTIN%2C%20LOW)%3B%0A%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20label1.updateText(String(PasswdError))%3B%0A%20%20%20%20%20%20delay(5000)%3B%0A%0A%20%20%20%20%7D%0A%20%20%20%20label1.updateText(String(InputPsaawd))%3B%0A%20%20%20%20c%20%3D%200%3B%0A%20%20%20%20PhonePasswd%20%3D%200%3B%0A%20%20%7D%0A%20%20delay(100)%3B%0A%7D” message=”” highlight=”” provider=”manual”/]

 

相關文章

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *