[App Inventor 物聯網應用-藍牙4.0 BLE] Lesson 3 – 讀取Arduino 101類比腳位狀態

App Inventor BLE 元件搭配 Arduino 101 的教學文來了,本系列專文是介紹如何使用 App Inventor 的 BLE (Bluetooth Low Energy) 元件搭配 Arduino 101 開發板的各種互動專題。請用 http://ble-test.appinventor.mit.edu 這個測試用伺服器來測試,實際app執行畫面如下圖,先來看執行畫面吧:

[youtube=”https://youtu.be/uuapPq8GZYQ”]

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

延伸閱讀:

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

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

Arduino 101 購買連結

Arduino 101 開箱文

Arduino 101 BLE 第一課 LED閃爍

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

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

 

 

硬體架構

  • Arduino 101
  • Android 手機
  • 電位計(或您喜歡的類比輸入元件)。以電位計來說,請把中央的腳接在 Arduino 101的A0腳位。左側與右側則分別接到 5V 與 GND,接反沒關係,差別只在於您順時鐘轉動電位計時,述值的變化是遞增或遞減而已。

 

App Inventor 程式

基本上概念與咱們的[雙A計畫 part 3:Android 手機透過藍牙接收 Arduino 類比腳位狀態]完全相同,只是改用 BLE 元件而已。本範例將不斷讀取 Arduino 101 的 A0 類比腳位狀態,並顯示在 App Inventor 之 Label 與 Slider 滑桿上。請看以下說明

Designer 頁面

本範例使用了 Label 與 Slider 元件來呈現 Arduino 101 的類比腳位讀數,本範例一共用到3個 Clock 元件,您可以參考一下這樣的做法,如果有更好的做法也歡迎提出喔。這三個 Clock元件的 TimerInterval 是經過多次測試之後比較好的參數,您可能需要實際狀況來調整這些參數。

由於通訊協定的不同,您當然無法用原本的 BluetoothClient元件來與 Arduino 101 溝通。

ble_03_03

Blocks 頁面

1. 連線與斷線

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

Button_Connect 按下時,要求BluetoothLE1元件對指定位址的藍牙裝置(98:4F…) 進行連線,並在設定完畫面上元件的 enabled 屬性之後停止掃描。

ble_03_02

2. 連線確認

承上一步,BluetoothLE1.connected事件會在連線成功後啟動,我們在此顯示一些確認訊息。Screen的狀態列(title) 很好用,別冷落它囉

ble_03_07

3. Clock1 (每1秒呼叫一次):連續讀取 Arduino 101 回送的資料

本範例使用了3個 Clock元件,請看以下說明:

Clock1 元件首先會根據 disconnect 變數值(true/false) 來得知現在是否有與指定 Arduino 101 連線了。如果為 true,則接續判斷是否有連線,如果在連線狀況下就斷線(BluetoothLE.DisconnectWithAddress)。反之則開始掃描 (BluetoothLE.StartScanning)

如果 disconnect 變數值為 false,則開始進行本範例最重要的變數值組合,需要先把 Clock2 與 Clock3 兩個計時器事件啟動。

這是因為 Arduino 類比腳位數值範圍為 0~1023,所以會用到 data2 與 data1 兩個變數值組合起來就是實際的類比腳位數值了,最後呈現在 Label 與 Slider 上就完工囉!

ble_03_01

4. Clock2(每0.9秒呼叫一次): 

Clock2 會每 0.9 秒把自己與 Clock3 的 Timer事件關閉,接著再根據實際狀況 (就是 disconnect 變數值) 來啟動。

ble_03_04

5. Clock3(每0.005秒呼叫一次):控制offset 並組合資料

Clock3 首先會根據 status 變數值 (0, 1) 來控制如何從 Arduino 101 讀取整數(BluetoothLE.ReadIntValue)。接著把 data 變數設為 BluetoothLE.IntGattValue 之讀取結果,如果 data 變數值介於128~256之間的話,就減去 128 後丟給 data2。

如果data 變數值小於 128,則把 data變數值丟給 data1,以便在 Clock1 中進行組合。

請注意 service_uuid 與 characteristic_uuid 這兩個欄位請都填入“19B10011-E8F2-537E-4F6C-D104768A1214”,Arduino 101 都使用這個參數代表它所提供的 BLE 服務。

ble_03_06

6. 斷線 

Button_Disconnect按下時,要求BluetoothLE1元件對指定藍牙裝置斷線。在此的做法與先前不太一樣,您可以多多比較喔

ble_03_05

Arduino 101 程式碼

本草稿碼請直接複製後上傳至 Arduino 101 即可。請注意 Arduino 101 已經具備藍牙4.0,因此不必再外接 HC05 這類的藍牙裝置

文中一樣要寫明 service_uuid 與 characteristic_uuid,在此都是“19B10011-E8F2-537E-4F6C-D104768A1214”

[pastacode lang=”c” manual=”%23include%20%3CCurieBLE.h%3E%0A%0ABLEPeripheral%20blePeripheral%3B%20%20%2F%2F%20BLE%20Peripheral%20Device%20(the%20board%20you’re%20programming)%0ABLEService%20ARead(%2219B10010-E8F2-537E-4F6C-D104768A1214%22)%3B%20%2F%2F%20BLE%20AnalogRead%20Service%0A%0A%2F%2F%20BLE%20LED%20Switch%20Characteristic%20-%20custom%20128-bit%20UUID%2C%20read%20and%20writable%20by%20central%0ABLEUnsignedIntCharacteristic%20AnalogData(%20%2219B10011-E8F2-537E-4F6C-D104768A1214%22%2C%20BLERead%20%7C%20BLENotify)%3B%0ABLEUnsignedIntCharacteristic%20AnalogData2(%2219B10012-E8F2-537E-4F6C-D104768A1214%22%2C%20BLERead%20%7C%20BLENotify)%3B%0A%0Aint%20old_data%20%3B%0Avoid%20setup()%20%7B%0A%20%20Serial.begin(9600)%3B%0A%20%20%2F%2F%20set%20Light%20pin%20to%20output%20mode%0A%20%20%2F%2F%20set%20advertised%20local%20name%20and%20service%20UUID%3A%0A%20%20blePeripheral.setLocalName(%22ARead%22)%3B%0A%20%20blePeripheral.setAdvertisedServiceUuid(ARead.uuid())%3B%0A%0A%20%20%2F%2F%20add%20service%20and%20characteristic%3A%0A%20%20blePeripheral.addAttribute(ARead)%3B%0A%20%20blePeripheral.addAttribute(AnalogData)%3B%0A%20%20blePeripheral.addAttribute(AnalogData2)%3B%0A%0A%20%20%2F%2F%20begin%20advertising%20BLE%20Light%20service%3A%0A%20%20blePeripheral.begin()%3B%0A%0A%20%20Serial.println(%22BLE%20AnalogRead%20service.%22)%3B%0A%7D%0A%0Avoid%20loop()%20%7B%0A%20%20%2F%2F%20listen%20for%20BLE%20peripherals%20to%20connect%3A%0A%20%20BLECentral%20central%20%3D%20blePeripheral.central()%3B%0A%20%20%2F%2F%20if%20a%20central%20is%20connected%20to%20peripheral%3A%0A%20%20if%20(central)%20%7B%0A%20%20%20%20Serial.print(%22Connected%20to%20central%3A%20%22)%3B%0A%20%20%20%20%2F%2F%20print%20the%20central’s%20MAC%20address%3A%0A%20%20%20%20Serial.println(central.address())%3B%0A%0A%20%20%20%20%2F%2F%20while%20the%20central%20is%20still%20connected%20to%20peripheral%3A%0A%20%20%20%20while%20(central.connected())%20%7B%0A%20%20%20%20%20%20int%20new_data%20%3D%20analogRead(A0)%3B%0A%20%20%20%20%20%20if%20(old_data%20!%3D%20new_data)%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20int%20data1%20%3D%20new_data%20%25%20128%3B%0A%20%20%20%20%20%20%20%20int%20data2%20%3D%20new_data%20%2F%20128%20%2B%20128%3B%0A%20%20%20%20%20%20%20%20int%20send_data%20%3D%20data2%20*%20256%20%2B%20data1%3B%0A%20%20%20%20%20%20%20%20AnalogData.setValue(send_data)%3B%0A%20%20%20%20%20%20%20%20Serial.println(new_data)%3B%0A%20%20%20%20%20%20%20%20old_data%20%3D%20new_data%3B%0A%20%20%20%20%20%20%20%20delay(50)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F%2F%20when%20the%20central%20disconnects%2C%20print%20it%20out%3A%0A%20%20%20%20Serial.print(F(%22Disconnected%20from%20central%3A%20%22))%3B%0A%20%20%20%20Serial.println(central.address())%3B%0A%20%20%7D%0A%7D” message=”Read Arduino 101 analog pin with App Inventor” highlight=”” provider=”manual”/]

12 thoughts on “[App Inventor 物聯網應用-藍牙4.0 BLE] Lesson 3 – 讀取Arduino 101類比腳位狀態

  1. Victor says:

    請問一下APP INVENTOR一定要使用Arduino 101 才能連接藍芽4.0嗎?
    可以使用Arduino MEGA板外接藍芽模組嗎?

  2. LLB says:

    你好,我是大陆的电子爱好者,我最近也在了解AppInventor2和Arduino BLE的程序。但是我遇到一个问题是现在最新的AppInventor2 BluetoothLE插件,我没有找到如何可以在app查看服务的特征值,可以帮忙看看吗??O(∩_∩)O谢谢~~

  3. Miles says:

    阿吉老師,我曾上過您的課,收獲很多!請問您,這個App inventor 程式是完整的嗎? Timer 1 ,1 秒,Timer2 0 .9秒是在那裡設定,App inventor 程式沒看到設定。
    還有,請問老師問什麼要用Timer做接收? 而且要用3個Timer? 謝謝!

    • CAVEDU 阿吉 - 雜工 says:

      程式是完整的喔。三個 timer 各有用途,看一下 code 就可以理解。Timerinterval 是在 Designer 頁面各自的 properties 欄位(畫面最右側) 設定,當然也可以動態用指令來調整。

  4. Chanyin says:

    想請問如果想一次接收多筆類比訊號是可行的嗎?
    這部分APP該怎麼寫
    另外想請問global的宣告是怎麼宣告呢?
    找了許久都找不到
    麻煩您了

    • CAVEDU 阿吉 - 雜工 says:

      理論上可行,但也會有上限就是了,這與藍牙傳輸速率與 buffer 有關。宣告 Global variable 請到 App Inventor 的 Blocks頁面左上方 / Variable 即可找到,變數名稱自行修改即可

發佈留言

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