[App Inventor 物聯網應用-藍牙4.0 BLE] Lesson 1 – LED 閃爍

話說從 MIT 回來之後一樣沒閒著,今天要介紹的是還沒正式公布的秘辛 – App Inventor 的 BLE (Bluetooth Low Energy) 元件。請用 http://ble-test.apinventor.mit.edu 這個測試用伺服器來測試,當然您得先買一片 Arduino 101才行

2019/08 update

http://ble-test.apinventor.mit.edu 伺服器已關閉,請直接匯入 BLE extension 到 MIT AI2 正式伺服器。

請改用MIT App Inventor團隊於 2018/11/24 release 的 BLE extension,並改用 WriteIntegers 指令即可。由下圖可看到可透過 signed 欄位指定為有號數或無號數。

MIT App Inventor 之後會使用 Arduino 101 作為物聯網教學套件核心開發板,套件包還在規劃中,大家有沒有想要套件包裡面放那些東西呢?說不定可以美夢成真喔

2016-01-26-14.50.47-1024x768

 

 

Arduino 101 是 Arduino.cc (注意不是 .org) 與 Intel 合作的最新開發板,在美國以外的區域稱為 Genuino 101

延伸閱讀:

[Make雜誌國際中文版]Arduino 101 介紹

Arduino.cc 論壇的 callbackLED 教學(手機端並非使用 App Inventor )

Arduino 101 購買連結

Arduino 101 開箱文

Arduino 101 BLE 第二課 LED呼吸燈(PWM)

Arduino 101 BLE 第三課 讀取類比腳位狀態

Arduino 101 BLE 第四課 控制機器手臂

硬體架構

  1. Arduino 101
  2. Android 手機
  3. [非必須]LED,長腳接在 Arduino 101的D13腳位。或直接使用板載的LED也可以。

App Inventor 程式

基本上概念與咱們的[雙A計畫]完全相同,只是改用 BLE 元件而已。本範例將控制 Arduino 101 的 D13 板載 LED 燈亮滅。別忘了這樣的架構可以改成繼電器再接個檯燈或風扇,就是小小智慧家電控制囉

Designer 頁面

這個版面很熟悉吧,雙A計畫都長這樣嘛,差別就在於 BluetoothLE 這個元件。由於通訊協定的不同,您當然無法用原本的 BluetoothClient元件來與 Arduino 101 溝通。

ble1

Blocks 頁面

1. 連線與斷線

程式初始化時,要求 BluetoothLE1元件進行掃描。請注意本範例是直接對指定藍牙裝置(Arduino 101)連線。如果您日後需要從多個裝置中選擇的話,建議還是先配對再從 ListPicker 中點選是比較好的做法。請注意 BLE 元件不需要事先配對,只要指定 address 即可直接連線。

ConnectButton按下時,要求BluetoothLE1元件對指定位址的藍牙裝置(98:4F…) 進行連線。

%e8%9e%a2%e5%b9%95%e5%bf%ab%e7%85%a7-2016-10-07-%e4%b8%8a%e5%8d%8810-57-29

2. 連線確認

承上一步,BluetoothLE1.connected事件會在連線成功後啟動,我們在此顯示一些確認訊息。

%e8%9e%a2%e5%b9%95%e5%bf%ab%e7%85%a7-2016-10-07-%e4%b8%8a%e5%8d%8810-57-05

3. 發送訊號

在 TurnButton按下時,使用 BluetoothLE1.WriteIntValue,Arduino 101 在接收到 value 1 之後就會點亮 LED (digitalWrite)。請注意 service_uuid 與 characteristic_uuid 這兩個欄位請分別填入“19B10010-E8F2-537E-4F6C-D104768A1214″ 與 “19B10011-E8F2-537E-4F6C-D104768A1214″ ,這是一組自定義的文字數字組合,Arduino 101 會使用這個參數代表它所提供的 BLE 服務。您可以使用這個網站來幫您產生 UUID

%e8%9e%a2%e5%b9%95%e5%bf%ab%e7%85%a7-2016-10-07-%e4%b8%8a%e5%8d%8810-57-37

您可以把這兩個動作寫在同一個 Button 的 TouchDown 與 TouchUp 事件中,就能做到按著按鈕時開燈,放開按鈕就關燈的效果囉,例如像這樣:

%e8%9e%a2%e5%b9%95%e5%bf%ab%e7%85%a7-2016-10-07-%e4%b8%8a%e5%8d%8811-04-33

4. 斷線

Button_Disconnect按下時,要求BluetoothLE1元件對指定藍牙裝置斷線。

%e8%9e%a2%e5%b9%95%e5%bf%ab%e7%85%a7-2016-10-07-%e4%b8%8a%e5%8d%8811-04-59

Arduino 101 程式碼

本草稿碼感謝 MIT App Inventor 小組提供。請注意 Arduino 101 已經具備藍牙4.0,因此不必再外接 HC05 這類的藍牙裝置

文中一樣要寫明 service_uuid 與 characteristic_uuid,在此是一組自訂的文字分別是“19B10010-E8F2-537E-4F6C-D104768A1214” 與 “19B10011-E8F2-537E-4F6C-D104768A1214”。這要與 App Inventor 中對應,您可以使用這個網站來幫您產生 UUID

Arduino 101 LED blink
#include <CurieBLE.h>

#define LED 13

BLEPeripheral blePeripheral; // BLE Peripheral Device (the board you're programming)
BLEService ControlLED("19B10010-E8F2-537E-4F6C-D104768A1214"); // BLE AnalogRead Service

// BLE LED Switch Characteristic - custom 128-bit UUID, read and writable by central
BLEUnsignedIntCharacteristic LEDStatus("19B10011-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite );

int incom = 0;
int last_incom = 0;

void setup() {
Serial.begin(9600);
// set Light pin to output mode
// set advertised local name and service UUID:
blePeripheral.setLocalName("ControlLED");
blePeripheral.setAdvertisedServiceUuid(ControlLED.uuid());

// add service and characteristic:
blePeripheral.addAttribute(ControlLED);
blePeripheral.addAttribute(LEDStatus);

// begin advertising BLE Light service:
blePeripheral.begin();

Serial.println("BLE AnalogRead service.");

pinMode(LED, OUTPUT);

}

void loop() {
// listen for BLE peripherals to connect:

BLECentral central = blePeripheral.central();
// if a central is connected to peripheral:
if (central) {
Serial.print("Connected to central: ");
// print the central's MAC address:
Serial.println(central.address());


// while the central is still connected to peripheral:
while (central.connected()) {
//Serial.println(LEDStatus.written());


if (LEDStatus.written())
{
incom = LEDStatus.value();
Serial.print("incom ");
Serial.println(incom);
if (incom != last_incom)
{
if (incom == 1)
{
Serial.println("LED On");

digitalWrite(LED, HIGH);
}
else
{
Serial.println("LED Off");
digitalWrite(LED, LOW);
}
}
last_incom = incom;
}
}

delay(100);
}

// when the central disconnects, print it out:

Serial.print(F("Disconnected from central: "));
Serial.println(central.address());
}

44 thoughts on “[App Inventor 物聯網應用-藍牙4.0 BLE] Lesson 1 – LED 閃爍

  1. godball says:

    請問一下, 我手邊沒有Arduino 101, 取而代之用兩台藍芽BT4.0的手機來測試 (兩台互連), 那BluetoothLE1會正常運作嗎?

    我自行測試好像無法連線

  2. godball says:

    抱歉, 我之前留言好像不見了

    想請問大大,
    1. BLE元件, 是否只能連BT4.0裝置, 而無法向下相容BT2.0+EDR (HC-05)
    2. BLE元件, 現階段是否只能連Arduino 101, 而無法連接其他BT4.0裝置? (我試過手邊支援BT4.0手機, 連線好像都無法成功)

  3. FUNG says:

    我用DXBT05(BLE4.0) 及ARDUINO UNO 以及ANDROID手機做連接,手機可以與DXBT05配對,但是APP INVENTOR 的APP按下BT05,最後會出ERROR507 UNABLE TO CONNECT,請問如何解決><? 謝

    • CAVEDU 阿吉 - 雜工 says:

      您好,請確認在App 按下連線之前,您的裝置是沒有被連接的。我們的範例上有 Serial Monitor相關訊息,請看看是否顯示 “Connected to central: XX:00:…” 這段文字,後者代表連到 Arduion 101 的裝置(您的手機)

  4. playdd1 says:

    老師你好 不好意思 我摸索了許久,還是在App Inventor裡 找不出一些指令的 , 不知是否方便像雙A計畫的範例一樣 堤供 範例程式下載嗎 感謝

  5. liliang says:

    您好,感谢,已经可以控制灯了!
    不过我这里的arduino程序if (incom == 1)这句的 1 需要改成字符 ‘1’才可以控制。
    另外请问一下做出来的软件可以用,但是为何打开软件就提示“unsupported bluetooth advertisenments not supported,sorry”,谢谢!

  6. 4A0L0068 says:

    老師您好
    想請問一下 如果改用HM10的BLE藍芽模組後
    我ARDUINO所使用的函式庫是跟一般藍芽組的#include 函數庫一樣使用方法
    還是需要如本文中所提到的需要使用其他的指令然後打上UUID才能使用?
    謝謝

  7. Joe says:

    Hi Mr. Cavedu,

    We were using the BLE-Test.appinventor.mit.edu in 2016 then stopped… Now the site is not working anymore. Error message: Server error: could not save one or more files. Please try again later!

    Please help us. We hope to get the old source code to work on it again. Thank you very very much!
    Joe

  8. 侯同學 says:

    老師您好!
    因為我是使用Arduino和藍芽4.0 BLE模組(HC-08)有兩個問題。
    請問我該引用哪個函式庫 (我有看到您上面有參考資料,但是我還是看不太懂)? 以及Arduion程式會和之前的雙A計畫有差別嗎??

    • 許 鈺莨 says:

      侯同學你好:
      本篇文章的Arduino101藍牙是內建BLE也就是低功耗藍牙,這個在Appinventor是需要額外匯入的模組。
      而雙A計畫的Arduino藍牙為HC-05或HC-06傳統藍牙,在Appinventor已經是有元件使用的。

      Arduino程式部分,和雙A計畫最大的不同點是BLE程式有所謂的UUID和藍牙位址MAC的部分,由於我們的部落格沒有Arduino和藍芽4.0 BLE模組的文章,因為我們的開發板已經有內建BLE了,所以你可以在跟賣家或搜尋HC-08的Arduino範例程式,再搭配本文章服用,重點是Arduino程式的藍牙UUID、MAC和Appinventor程式的藍牙UUID、MAC要一致。

      你亦可在技術部落格搜尋 http://blog.cavedu.com/?s=藍牙http://blog.cavedu.com/?s=BLE

  9. JUN says:

    使用 BLE 在 AI Campanion 上驗證功能 OK , 包含取得 清單並連接與傳送收發.
    但是 封裝成 APK 後,在同樣的手機上運行,卻無法取得 device list, 所以無法再連接與收發.
    想請問要導出 apk 時需要做時麼設定嗎?

發佈留言

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