工程筆記本 / AppInventor - 圖形化Android

AppInventor - 圖形化Android

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

CAVEDU 阿吉 - 雜工📅 2016-04-09👁 138
話說從 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   https://youtu.be/WSktBhO94Ug   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 [pastacode lang="c" manual="%23include%20%3CCurieBLE.h%3E%0A%0A%23define%20LED%2013%0A%0ABLEPeripheral%20blePeripheral%3B%20%20%2F%2F%20BLE%20Peripheral%20Device%20(the%20board%20you're%20programming)%0ABLEService%20ControlLED(%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%20LEDStatus(%2219B10011-E8F2-537E-4F6C-D104768A1214%22%2C%20BLERead%20%7C%20BLEWrite%20%20)%3B%0A%0Aint%20incom%20%3D%200%3B%0Aint%20last_incom%20%3D%200%3B%0A%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(%22ControlLED%22)%3B%0A%20%20blePeripheral.setAdvertisedServiceUuid(ControlLED.uuid())%3B%0A%0A%20%20%2F%2F%20add%20service%20and%20characteristic%3A%0A%20%20blePeripheral.addAttribute(ControlLED)%3B%0A%20%20blePeripheral.addAttribute(LEDStatus)%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%0A%20%20pinMode(LED%2C%20OUTPUT)%3B%0A%0A%7D%0A%0Avoid%20loop()%20%7B%0A%20%20%2F%2F%20listen%20for%20BLE%20peripherals%20to%20connect%3A%0A%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%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%20%2F%2FSerial.println(LEDStatus.written())%3B%0A%0A%0A%20%20%20%20%20%20if%20(LEDStatus.written())%0A%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20incom%20%3D%20LEDStatus.value()%3B%0A%20%20%20%20%20%20%20%20Serial.print(%22incom%20%22)%3B%0A%20%20%20%20%20%20%20%20Serial.println(incom)%3B%0A%20%20%20%20%20%20%20%20if%20(incom%20!%3D%20last_incom)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(incom%20%3D%3D%201)%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Serial.println(%22LED%20On%22)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20digitalWrite(LED%2C%20HIGH)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Serial.println(%22LED%20Off%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20digitalWrite(LED%2C%20LOW)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20last_incom%20%3D%20incom%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20delay(100)%3B%0A%20%20%7D%0A%0A%20%20%2F%2F%20when%20the%20central%20disconnects%2C%20print%20it%20out%3A%0A%0A%20%20Serial.print(F(%22Disconnected%20from%20central%3A%20%22))%3B%0A%20%20Serial.println(central.address())%3B%0A%7D%0A" message="Arduino 101 LED blink" highlight="" provider="manual"/]

相關文章 📎

留言 💬 (0)

還沒有留言,來當第一個。