前言
本文發想來源是曾希哲老師的手機遠端控制門禁系統文章,並透過RK物聯網教學實驗箱來實現,RK物聯網教學實驗箱的特色有下列幾點:
- 符合108課綱「智慧居家實習」、「介面電路控制實習」。
- LinkIt7697開發板由聯發科技推出,搭載了WIFI及藍牙(BLE)模組,可激發使用者針對物聯網情境的應用。
- RK物聯網擴充板(RK IOT EX Shield),有Grove防呆接頭,可輕鬆接上感測器不費力,不必苦惱腳位接錯。
- 圖控介面的程式操作,圖形化程式介面取代文字介面撰寫,可以大大降低專題開發的難度,再也不用因為拼錯字所造成的編譯錯誤而傷腦筋。後續也可銜接到正式的文字程式環境。
| 撰寫/攝影 | 許鈺莨 | ||
| 時間 | 2小時 | 材料表 |
|
| 難度 | 中等 | ||
本實驗箱是依照108課綱所配置,其主題有「工場安全衛生及介面電路控制應用」、「通用序列匯流排介面」、「數位類比轉換介面」、「環境感測介面」、「辨識介面」、「藍牙無線傳輸介面」、「綜合應用」,共七個章節。本篇門禁系統就是屬於「藍牙無線傳輸介面」的延伸,以下就針對遠端控制門禁系統的範例來做說明。
流程圖說明
筆者是透過曾希哲老師公開的程式碼,可讓手機端藉由 BLE 藍牙來與 LinkIt 7697 開發板互動,請由此下載 iOS / Android 版本的 LinkIt Remote app,只要編寫 7697 端程式就能生成手機 app 介面,功能雖然簡單了點但已足以完成各種監控介面。請參考相關文章:https://blog.cavedu.com/?s=linkit%20remote
輸入密碼有三次機會,三次機會全錯會有五秒鐘的等待時間,正確密碼為 9527 ,而遠端控制門禁系統操作流程,如圖所示。
硬體介紹
再來介紹所使用的硬體,如下圖所示。本篇是利用LinkIt7697的LinkIt Remote功能與手機連線,並在擴充板接上繼電器來控制電磁鎖,但需注意的是控制電磁鎖需要額外的外接電源,所以筆者是用四顆 1.5V 的四號電池來當外接電源。
程式撰寫
本篇程式是透過 BlocklyDuino圖形化介面來撰寫,而以下 Arduino程式碼是由 BlocklyDuino圖形化介面轉換而來,若讀者希望取得本BlocklyDuino程式碼,請由此下載。
也請參考我們所編寫的 BlocklyDuino + LinkIt 7697 相關範例,很完整喔!
[pastacode lang=”cpp” manual=”%23include%20%3CLRemote.h%3E%0A%0Aint%20time%3B%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%0Aint%20count%3B%0A%0ALRemoteButton%20button0%3B%0ALRemoteLabel%20label1%3B%0ALRemoteButton%20button1%3B%0ALRemoteButton%20button2%3B%0ALRemoteButton%20button3%3B%0ALRemoteButton%20button4%3B%0ALRemoteButton%20button5%3B%0ALRemoteButton%20button6%3B%0ALRemoteButton%20button7%3B%0ALRemoteButton%20button8%3B%0ALRemoteButton%20button9%3B%0ALRemoteButton%20button10%3B%0A%0Avoid%20setup()%0A%7B%0A%20%20LRemote.setName(%22remote%22)%3B%0A%20%20LRemote.setOrientation(RC_PORTRAIT)%3B%0A%20%20LRemote.setGrid(3%2C%205)%3B%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_ORANGE)%3B%0A%20%20%20%20LRemote.addControl(button0)%3B%0A%0A%20%20%20%20label1.setPos(0%2C%200)%3B%0A%20%20%20%20label1.setText(%22%E8%BC%B8%E5%85%A5%E5%AF%86%E7%A2%BC%22)%3B%0A%20%20%20%20label1.setSize(3%2C%201)%3B%0A%20%20%20%20label1.setColor(RC_BLUE)%3B%0A%20%20%20%20LRemote.addControl(label1)%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_ORANGE)%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_ORANGE)%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_ORANGE)%3B%0A%20%20%20%20LRemote.addControl(button3)%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_ORANGE)%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_ORANGE)%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_ORANGE)%3B%0A%20%20%20%20LRemote.addControl(button6)%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_ORANGE)%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_ORANGE)%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_ORANGE)%3B%0A%20%20%20%20LRemote.addControl(button9)%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_GREEN)%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%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%20count%20%3D%203%3B%0A%20%20pinMode(5%2C%20OUTPUT)%3B%0A%7D%0A%0A%0Avoid%20loop()%0A%7B%0A%20%20time%20%3D%205%3B%0A%20%20LRemote.process()%3B%0A%20%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%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(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%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(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%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(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%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(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%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(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%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(%22%E8%BC%B8%E5%85%A5%E5%AF%86%E7%A2%BC%22))%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(%22%E9%96%8B%E9%96%80%22))%3B%0A%20%20%20%20%20%20digitalWrite(5%2C%20HIGH)%3B%0A%20%20%20%20%20%20delay(5000)%3B%0A%20%20%20%20%20%20digitalWrite(5%2C%20LOW)%3B%0A%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20label1.updateText(String(%22%E5%AF%86%E7%A2%BC%E9%8C%AF%E8%AA%A4%22))%3B%0A%20%20%20%20%20%20delay(1000)%3B%0A%20%20%20%20%20%20count%20%3D%20count%20-%201%3B%0A%20%20%20%20%20%20label1.updateText(String(String()%20%2B%20%22%E9%82%84%E6%9C%89%22%20%2B%20count%20%2B%20%22%E6%AC%A1%22))%3B%0A%20%20%20%20%20%20if%20(count%20%3D%3D%200)%20%7B%0A%20%20%20%20%20%20%20%20count%20%3D%203%3B%0A%20%20%20%20%20%20%20%20label1.updateText(String(%22%E4%BA%94%E7%A7%92%E5%BE%8C%E8%BC%B8%E5%85%A5%22))%3B%0A%20%20%20%20%20%20%20%20delay(1000)%3B%0A%20%20%20%20%20%20%20%20for%20(int%20count2%20%3D%200%3B%20count2%20%3C%205%3B%20count2%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20time%20%3D%20time%20-%201%3B%0A%20%20%20%20%20%20%20%20%20%20label1.updateText(String(String()%20%2B%20%22%E5%89%A9%E9%A4%98%22%20%2B%20time%20%2B%20%22%E7%A7%92%22))%3B%0A%20%20%20%20%20%20%20%20%20%20delay(1000)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20delay(2000)%3B%0A%0A%20%20%20%20%7D%0A%20%20%20%20label1.updateText(String(%22%E8%BC%B8%E5%85%A5%E5%AF%86%E7%A2%BC%22))%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=”RK iot box remote control” highlight=”” provider=”manual”/]影片展示
最後,來看看RK物聯網教學實驗箱門禁系統影片的操作說明吧!
結語
本實驗箱已備有使用手冊,及多種範例實際應用操作,各位讀者及大專院校老師們欲購買RK物聯網教學實驗箱,請點選以下連結,我們會有專人為您服務:
https://robotkingdom.com.tw/product/rk_iotedubox/
本篇主題到此告一段落,下次再見囉!



