本文章教各位讀者如何用手機撰寫App Inventor的應用程式,並透過Buletooth Low Energy來遙控LinkIt 7697的的LED燈。
| 作者/攝影 | 袁佑緣 |
| 時間 | 1小時 |
| 難度 |
★★☆☆☆ |
| 材料表 |
|
App Inventor Extension 安裝
請先進到App Inventor的網站,並建立一個專案,在左下角Extension的部份,點選import extension,如下圖。

並把從MIT App Inventor Extensions網站(http://appinventor.mit.edu/extensions/)上的BLE套件裝上去 (最新版本為20181124)。

如果讀者想要直接取用本範例的aia檔也可以(點我下載)。這樣就不需要再手動安裝Extension,因為已經包含在aia檔中了。
App Ineventor 程式設計
首先請確認您有按照前面的步驟將BLE元件新增App Inventor中,如下圖。

接下來請看到Desginer的部份,connect按鈕主要是用來連線到7697的,而下面有兩個按鈕,分別用來控制LED燈的ON跟OFF。

接下來看到後台的Blocks端,首先我們要先定義一個addr的變數,用來指定要連接的LinkIt 7697的mac address,至於這個mac address會根據每一塊不同的板子而有所不同,請讀者按照待會Arduino程式設計的部份所顯示的MAC Adress填入正確的位址。

再來當按鈕connect按下去之後,就會嘗試連上指定mac address的控制板,如果成功的話就,按鈕就會切換到Disconnect,以等待下一次使用者按下時,就會斷線。

至於定義連線時與斷線時的功能有哪些,則是用下面的when block來決定,只有成功連線時,才能夠控制控制LED的開關。

接下來是本範例的重點部份,當按下ON/OFF開關時,會透過BLE元件的WriteIntValue來傳送訊息給7697,並且是已經指定好service跟characteristic的uuid了,而這個uuid其實是跟Arduino端裡面寫的UUID是一致的,詳情請看下面的範例程式碼。
而我們送出的整數數值1或者是0則分別代表LED是要亮或者是暗,請想想看 TouchDown, TouchUp 與 Click 的差別。
LinkIt 7697 程式設計
本範例程式可以在Arduino IDE的範例code上找到,請先確定您的控制板在編輯器中切換成7697,再點選Files->Examlpes->LBLE->SimplePeripheral。
[pastacode lang=”python” manual=”%2F*%0A%20%20This%20example%20configures%20LinkIt%207697%20to%20act%20as%20a%20simple%20GATT%20server%20with%201%20characteristic.%0A%0A%20%20To%20use%20it%2C%20open%20AppInventor%20project%3A%0A%0A%20%20%20%20*%20%0A%0A%20%20Build%20%26%20install%20it%20on%20Android%20id%0A%0A%20%20created%20Mar%202017%0A*%2F%0A%23include%20%3CLBLE.h%3E%0A%23include%20%3CLBLEPeriphral.h%3E%0A%0A%2F%2F%20Define%20a%20simple%20GATT%20service%20with%20only%201%20characteristic%0ALBLEService%20ledService(%2219B10010-E8F2-537E-4F6C-D104768A1214%22)%3B%0ALBLECharacteristicInt%20switchCharacteristic(%2219B10011-E8F2-537E-4F6C-D104768A1214%22%2C%20LBLE_READ%20%7C%20LBLE_WRITE)%3B%0A%0Avoid%20setup()%20%7B%0A%0A%20%20%2F%2F%20Initialize%20LED%20pin%0A%20%20pinMode(LED_BUILTIN%2C%20OUTPUT)%3B%0A%20%20digitalWrite(LED_BUILTIN%2C%20LOW)%3B%0A%0A%20%20%2F%2FInitialize%20serial%20and%20wait%20for%20port%20to%20open%3A%0A%20%20Serial.begin(9600)%3B%0A%0A%20%20%2F%2F%20to%20check%20if%20USR%20button%20is%20pressed%0A%20%20pinMode(6%2C%20INPUT)%3B%0A%0A%20%20%2F%2F%20Initialize%20BLE%20subsystem%0A%20%20LBLE.begin()%3B%0A%20%20while%20(!LBLE.ready())%20%7B%0A%20%20%20%20delay(100)%3B%0A%20%20%7D%0A%20%20Serial.println(%22BLE%20ready%22)%3B%0A%0A%20%20Serial.print(%22Device%20Address%20%3D%20%5B%22)%3B%0A%20%20Serial.print(LBLE.getDeviceAddress())%3B%0A%20%20Serial.println(%22%5D%22)%3B%0A%0A%20%20%2F%2F%20configure%20our%20advertisement%20data.%0A%20%20%2F%2F%20In%20this%20case%2C%20we%20simply%20create%20an%20advertisement%20that%20represents%20an%0A%20%20%2F%2F%20connectable%20device%20with%20a%20device%20name%0A%20%20LBLEAdvertisementData%20advertisement%3B%0A%20%20advertisement.configAsConnectableDevice(%22BLE%20LED%22)%3B%0A%0A%20%20%2F%2F%20Configure%20our%20device’s%20Generic%20Access%20Profile’s%20device%20name%0A%20%20%2F%2F%20Ususally%20this%20is%20the%20same%20as%20the%20name%20in%20the%20advertisement%20data.%0A%20%20LBLEPeripheral.setName(%22BLE%20LED%22)%3B%0A%0A%20%20%2F%2F%20Add%20characteristics%20into%20ledService%0A%20%20ledService.addAttribute(switchCharacteristic)%3B%0A%0A%20%20%2F%2F%20Add%20service%20to%20GATT%20server%20(peripheral)%0A%20%20LBLEPeripheral.addService(ledService)%3B%0A%0A%20%20%2F%2F%20start%20the%20GATT%20server%20-%20it%20is%20now%20%0A%20%20%2F%2F%20available%20to%20connect%0A%20%20LBLEPeripheral.begin()%3B%0A%0A%20%20%2F%2F%20start%20advertisment%0A%20%20LBLEPeripheral.advertise(advertisement)%3B%0A%7D%0A%0Avoid%20loop()%20%7B%0A%20%20delay(1000)%3B%0A%0A%20%20Serial.print(%22conected%3D%22)%3B%0A%20%20Serial.println(LBLEPeripheral.connected())%3B%0A%0A%20%20if%20(digitalRead(6))%0A%20%20%7B%0A%20%20%20%20Serial.println(%22disconnect%20all!%22)%3B%0A%20%20%20%20LBLEPeripheral.disconnectAll()%3B%0A%20%20%7D%0A%0A%20%20if%20(switchCharacteristic.isWritten())%20%7B%0A%20%20%20%20const%20char%20value%20%3D%20switchCharacteristic.getValue()%3B%0A%20%20%20%20switch%20(value)%20%7B%0A%20%20%20%20%20%20case%201%3A%0A%20%20%20%20%20%20%20%20digitalWrite(LED_BUILTIN%2C%20HIGH)%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20case%200%3A%0A%20%20%20%20%20%20%20%20digitalWrite(LED_BUILTIN%2C%20LOW)%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20default%3A%0A%20%20%20%20%20%20%20%20Serial.println(%22Unknown%20value%20written%22)%3B%0A%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%0A%7D%0A” message=”” highlight=”” provider=”manual”/]成功上傳本隻程式碼到7697上後,請打開Serial Monitor,7697將會印出這塊板子的MAC Address,請務必記得把這段位址修改到App Inventor端的addr變數上喔。

範例影片
([Appinventor ]使用手機BLE控制7697 LED燈)
相關文章:
- App Inventor 相關系列文章
- [App Inventor+Microbit小專題 ] 按鈕控制畫面小球
- [App Inventor+Microbit小專題 ] LED控制
- Linkit 7697 相關系列文章
- [LinkIt 7697開發板教學]MCS雲端RGB LED類比控制-Blocklyduino圖形化開發環境








課程,太棒了,如果有一系列資料,就太感謝了
有的,陸續上線中,您可以用 https://blog.cavedu.com/?s=7697 或頁面右上角搜尋 7697 即可看到 7697 最新文章喔
請問如果以APP INVENTOR本身有的藍芽客戶端來連結7697可以這樣寫嗎?
#include
#include
void setup() {
Serial.begin(9600);
pinMode(13,OUTPUT);
pinMode(14,OUTPUT);
}
void loop() {
if(Serial.available()>0)
{
char data = Serial.read();
if (data == ‘a’)
{
digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
}
else if(data == ‘b’)
{
digitalWrite(14,HIGH);
delay(1000);
digitalWrite(14,LOW);
}
}
}
您好,不行啊… 因為7697不支援傳統藍牙,所以一定要用 BluetoothLE 元件喔
請教一下這幾個參數意義?
serviceUuid / characteristicUuid
signed 是指要加密嗎?
serviceUuid / characteristicUuid 是 BLE 兩邊所要設定的 ID,請參考 https://zh.wikipedia.org/zh-tw/%E8%93%9D%E7%89%99%E4%BD%8E%E5%8A%9F%E8%80%97
另外 signed 是指”有號數” 有一個位元會用來表示正負數。