本文延伸自 App Inventor 中文學習網的[取得像素顏色]範例,將觸碰點的RGB值經由藍牙丟給Arduino 101 去點亮 RGB 燈,您可以擴充多顆RGB LED或其他彩色模組來達到更有趣的效果,可以說是極簡易版的 Philip HUE 照明系統喔!
本範例使用 Arduino 101,如果您是使用HC05 06 這類型的藍牙模組,則需使用 App Inventor 的 BluetoothClient元件,兩者不可混用。
| 作者/攝影 | 曾吉弘 |
| 時間 | 3~4小時 |
| 成本 |
|
| 難度 | * * * * * |
| 材料表 |
|
本文將介紹如何取得觸碰點的 RGB 參數之後透過 BLE 送給 Arduino 101 來點亮 RGB LED。
先來看影片吧
App Inventor
Designer
- 使用 Canvas 來取得觸碰點座標。
- 兩個連線斷線用的按鈕:Btn_Connect / Btn_DisConnect
- 三個用來呈現RGB值的 Slider (無法拖動)
- BletoothLE:處理BLE通訊
- Clock:定期要求 BluetoothLE 將資料(RGB參數)發送給 Arduino 101
Blocks
1.初始化
宣告相關變數,其中addr 代表您所要連線之Arduino 101 藍牙位址,印在板子背面。程式初始化時,要求BluetoothLE元件開始掃瞄。
按下連線按鈕,BluetoothLE元件對指定位址裝置(Arduino 101)連線,並設定相關畫面元件是否可操作,並顯示”Connected”於螢幕狀態列。
斷線則剛好相反,斷開與Arduino 101之BLE連線之後將相關畫面元件恢復原狀,這樣才能重新操作。
3.滑動手指取得觸碰點RGB參數
使用 Ball.Dragged 事件,當拖動這個小球(代表您手指的位置)時,會執行以下動作:
- 清除畫面
- 將該觸碰點的GetPixelColor結果顯示在Canvas上,會是一個相當大的負整數後續使用select list item 去解出來之後就會是 0~255 的整數了。
- Ball 移動到觸碰點位置
- 使用select list item 搭配 split 指令去分別取得該點的紅色、綠色與藍色值,顯示於Label上即可。
接著在 Ball.Dragged 事件的下半,分別更新每一個 Slider 的指針位置(ThumbPosition)以及更新 r g b 三個變數的內容為該觸碰點的 r g b 顏色強度,準備要發送出去囉!
如果您覺得這裡的程式碼相當冗長的話,可以用一個副程式包起來讓主程式流程更簡潔易讀。
4.發送訊號
使用 Clock 元件每1秒鐘觸發一次 Clock.Timer事件,其中會使用 BluetoothLE.WriteIntValue 將 r g b 值的組合結果發送出去,例如 (128, 34, 255) 的組合結果就是 128034255,Arduino 收到之後再拆解即可。
Clock.Timer 事件的1秒鐘您可以自行修改為較小的數字,看看是否有比較好的操作體驗。
Arduino 101 code
重點在於 line 53~67 之間的if (LEDStatus.written())判斷式中,使用 incom = LEDStatus.value(); 來取得 App Inventor 送過來的整數值,並以 1000 為單位來拆開並顯示於 Serial Monitor,最後使用 analogWrite 指令去控制對應的 RGB LED 腳位就完成囉!
[pastacode lang=”java” manual=”%23include%20%3CCurieBLE.h%3E%0A%23include%20%3Cstdlib.h%3E%0A%23define%20LEDr%206%0A%23define%20LEDg%205%0A%23define%20LEDb%203%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%20r%2C%20g%2C%20b%20%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%20RGBLED%20control.%22)%3B%0A%0A%20%20pinMode(LEDr%2C%20OUTPUT)%3B%0A%20%20pinMode(LEDg%2C%20OUTPUT)%3B%0A%20%20pinMode(LEDb%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%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%2F%2F110225101%0A%20%20%20%20%20%20%20%20r%20%3D%20incom%20%2F%201000000%20%3B%2F%2F110%0A%20%20%20%20%20%20%20%20g%20%3D%20(incom%20%2F%201000%20-%20r%20*%201000)%20%3B%20%2F%2F110225-110000%3D225%0A%20%20%20%20%20%20%20%20b%20%3D%20(incom%20-%20r%20*%201000000%20-%20g%20*%201000)%20%3B%20%2F%2F110225101-110000000-2250000%3D101%0A%20%20%20%20%20%20%20%20Serial.println(incom)%3B%0A%20%20%20%20%20%20%20%20Serial.println(r)%3B%0A%20%20%20%20%20%20%20%20Serial.println(g)%3B%0A%20%20%20%20%20%20%20%20Serial.println(b)%3B%0A%20%20%20%20%20%20%20%20analogWrite(LEDr%2C%20r)%3B%0A%20%20%20%20%20%20%20%20analogWrite(LEDg%2C%20g)%3B%0A%20%20%20%20%20%20%20%20analogWrite(LEDb%2C%20b)%3B%0A%20%20%20%20%20%20%20%20delay(10)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20digitalWrite(LEDr%2C%20LOW)%3B%0A%20%20%20%20digitalWrite(LEDg%2C%20LOW)%3B%0A%20%20%20%20digitalWrite(LEDb%2C%20LOW)%3B%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” message=”” highlight=”” provider=”manual”/]
相關文章:
- [開箱文] Arduino 101 / Genuino 101 – Arduino.cc 與 Intel 合作,板載藍牙 BLE 與六軸加速度計/陀螺儀
- [App Inventor 物聯網應用-藍牙4.0 BLE] Lesson 1 – LED 閃爍
- [App Inventor 物聯網應用-藍牙4.0 BLE] Lesson 2 – LED PWM呼吸燈
- [App Inventor 物聯網應用-藍牙4.0 BLE] Lesson 3 – 讀取Arduino 101類比腳位狀態
- [App Inventor 物聯網應用-藍牙4.0 BLE] Lesson 4 – 機器手臂
- [App Inventor 物聯網應用-藍牙4.0 BLE] Lesson 5 – 讀取DHT22 溫溼度模組資料











