[101專題計畫分享] Arduino101(Genuino 101)&App Inventor – RGB LED控制

本文延伸自 App Inventor 中文學習網的[取得像素顏色]範例,將觸碰點的RGB值經由藍牙丟給Arduino 101 去點亮 RGB 燈,您可以擴充多顆RGB LED或其他彩色模組來達到更有趣的效果,可以說是極簡易版的 Philip HUE 照明系統喔!

本範例使用 Arduino 101,如果您是使用HC05 06 這類型的藍牙模組,則需使用 App Inventor 的 BluetoothClient元件,兩者不可混用。

程式碼請由此下載

 

作者/攝影   曾吉弘
時間   3~4小時
成本
  • Arduino 101 $1575 (購買連結)
  • RGB LED模組(本範例使用共陰) $30~50
  • 跳線  (一綑單芯線,$100左右,也可以買公公/公母杜邦線)
  • 400孔麵包板 ($80~100)
難度   * * * * *
材料表
  • 個人電腦 (作業系統可用 Windows, Mac OSX 與 Linux,本範例使用 Windows 7)
  • Arduino 101開發板
  • RGB LED模組(本範例使用共陰)

本文將介紹如何取得觸碰點的 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元件開始掃瞄。

2.連線與斷線

按下連線按鈕,BluetoothLE元件對指定位址裝置(Arduino 101)連線,並設定相關畫面元件是否可操作,並顯示”Connected”於螢幕狀態列。

斷線則剛好相反,斷開與Arduino 101之BLE連線之後將相關畫面元件恢復原狀,這樣才能重新操作。

 

3.滑動手指取得觸碰點RGB參數

使用 Ball.Dragged 事件,當拖動這個小球(代表您手指的位置)時,會執行以下動作:

  1. 清除畫面
  2. 將該觸碰點的GetPixelColor結果顯示在Canvas上,會是一個相當大的負整數後續使用select list item 去解出來之後就會是 0~255 的整數了。
  3. Ball 移動到觸碰點位置
  4. 使用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”/]

 

相關文章:

發佈留言

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