使用RK物聯網教學實驗箱搭配手機建構遠端控制門禁系統

前言

本文發想來源是曾希哲老師的手機遠端控制門禁系統文章,並透過RK物聯網教學實驗箱實現,RK物聯網教學實驗箱的特色有下列幾點:

  1. 符合108課綱「智慧居家實習」、「介面電路控制實習」。
  2. LinkIt7697開發板由聯發科技推出,搭載了WIFI及藍牙(BLE)模組,可激發使用者針對物聯網情境的應用。
  3. RK物聯網擴充板(RK IOT EX Shield),有Grove防呆接頭,可輕鬆接上感測器不費力,不必苦惱腳位接錯。
  4. 圖控介面的程式操作,圖形化程式介面取代文字介面撰寫,可以大大降低專題開發的難度,再也不用因為拼錯字所造成的編譯錯誤而傷腦筋。後續也可銜接到正式的文字程式環境。
撰寫/攝影 許鈺莨
   
時間 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 相關範例,很完整喔!

RK iot box remote control
#include <LRemote.h>

int time;

int SetPasswd;

int PhonePasswd;

int c;

String S1;

String S2;

String S3;

String S4;

int count;

LRemoteButton button0;
LRemoteLabel label1;
LRemoteButton button1;
LRemoteButton button2;
LRemoteButton button3;
LRemoteButton button4;
LRemoteButton button5;
LRemoteButton button6;
LRemoteButton button7;
LRemoteButton button8;
LRemoteButton button9;
LRemoteButton button10;

void setup()
{
LRemote.setName("remote");
LRemote.setOrientation(RC_PORTRAIT);
LRemote.setGrid(3, 5);
button0.setPos(0, 4);
button0.setText("0");
button0.setSize(1, 1);
button0.setColor(RC_ORANGE);
LRemote.addControl(button0);

label1.setPos(0, 0);
label1.setText("輸入密碼");
label1.setSize(3, 1);
label1.setColor(RC_BLUE);
LRemote.addControl(label1);

button1.setPos(0, 3);
button1.setText("1");
button1.setSize(1, 1);
button1.setColor(RC_ORANGE);
LRemote.addControl(button1);

button2.setPos(1, 3);
button2.setText("2");
button2.setSize(1, 1);
button2.setColor(RC_ORANGE);
LRemote.addControl(button2);

button3.setPos(2, 3);
button3.setText("3");
button3.setSize(1, 1);
button3.setColor(RC_ORANGE);
LRemote.addControl(button3);

button4.setPos(0, 2);
button4.setText("4");
button4.setSize(1, 1);
button4.setColor(RC_ORANGE);
LRemote.addControl(button4);

button5.setPos(1, 2);
button5.setText("5");
button5.setSize(1, 1);
button5.setColor(RC_ORANGE);
LRemote.addControl(button5);

button6.setPos(2, 2);
button6.setText("6");
button6.setSize(1, 1);
button6.setColor(RC_ORANGE);
LRemote.addControl(button6);

button7.setPos(0, 1);
button7.setText("7");
button7.setSize(1, 1);
button7.setColor(RC_ORANGE);
LRemote.addControl(button7);

button8.setPos(1, 1);
button8.setText("8");
button8.setSize(1, 1);
button8.setColor(RC_ORANGE);
LRemote.addControl(button8);

button9.setPos(2, 1);
button9.setText("9");
button9.setSize(1, 1);
button9.setColor(RC_ORANGE);
LRemote.addControl(button9);

button10.setPos(1, 4);
button10.setText("Clear");
button10.setSize(2, 1);
button10.setColor(RC_GREEN);
LRemote.addControl(button10);
LRemote.begin();
SetPasswd = 10;
PhonePasswd = 0;
c = 0;
S1 = "*";
S2 = "**";
S3 = "***";
S4 = "****";
count = 3;
pinMode(5, OUTPUT);
}


void loop()
{
time = 5;
LRemote.process();
if (button9.isValueChanged()) {
if (button9.getValue() == 1) {
c = c + 1;
if (c == 1) {
PhonePasswd = PhonePasswd + 1;

}

}

} else if (button5.isValueChanged()) {
if (button5.getValue() == 1) {
c = c + 1;
if (c == 2) {
PhonePasswd = PhonePasswd + 2;

}

}
} else if (button2.isValueChanged()) {
if (button2.getValue() == 1) {
c = c + 1;
if (c == 3) {
PhonePasswd = PhonePasswd + 3;

}

}
} else if (button7.isValueChanged()) {
if (button7.getValue() == 1) {
c = c + 1;
if (c == 4) {
PhonePasswd = PhonePasswd + 4;

}

}
} else if (button4.isValueChanged()) {
if (button4.getValue() == 1) {
c = c + 1;

}
} else if (button0.isValueChanged()) {
if (button0.getValue() == 1) {
c = c + 1;

}
} else if (button6.isValueChanged()) {
if (button6.getValue() == 1) {
c = c + 1;

}
} else if (button1.isValueChanged()) {
if (button1.getValue() == 1) {
c = c + 1;

}
} else if (button8.isValueChanged()) {
if (button8.getValue() == 1) {
c = c + 1;

}
} else if (button3.isValueChanged()) {
if (button3.getValue() == 1) {
c = c + 1;

}
} else if (button10.isValueChanged()) {
if (button10.getValue() == 1) {
label1.updateText(String("輸入密碼"));
c = 0;
PhonePasswd = 0;

}
}
if (c == 1) {
label1.updateText(String(S1));

} else if (c == 2) {
label1.updateText(String(S2));
} else if (c == 3) {
label1.updateText(String(S3));
} else if (c == 4) {
label1.updateText(String(S4));
delay(500);
if (SetPasswd == PhonePasswd) {
label1.updateText(String("開門"));
digitalWrite(5, HIGH);
delay(5000);
digitalWrite(5, LOW);

} else {
label1.updateText(String("密碼錯誤"));
delay(1000);
count = count - 1;
label1.updateText(String(String() + "還有" + count + "次"));
if (count == 0) {
count = 3;
label1.updateText(String("五秒後輸入"));
delay(1000);
for (int count2 = 0; count2 < 5; count2++) {
time = time - 1;
label1.updateText(String(String() + "剩餘" + time + "秒"));
delay(1000);
}

}
delay(2000);

}
label1.updateText(String("輸入密碼"));
c = 0;
PhonePasswd = 0;
}
delay(100);
}

影片展示

最後,來看看RK物聯網教學實驗箱門禁系統影片的操作說明吧!

結語

本實驗箱已備有使用手冊,及多種範例實際應用操作,各位讀者及大專院校老師們欲購買RK物聯網教學實驗箱,請點選以下連結,我們會有專人為您服務:
https://robotkingdom.com.tw/product/rk_iotedubox/

本篇主題到此告一段落,下次再見囉!

發佈留言

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