清泛IT社区
标题: Arduino101(Genuino 101)&App Inventor – RGB LED控制 [打印本页]
作者: App Inventor 2 时间: 昨天 14:18
标题: Arduino101(Genuino 101)&App Inventor – RGB LED控制
繁体中文原文:https://blog.cavedu.com/2017/02/ ... %e6%8e%a7%e5%88%b6/
本文將介紹如何取得觸碰點的 RGB 參數之後透過 BLE 送給 Arduino 101 來點亮 RGB LED。
App InventorDesigner
- 使用 Canvas 來取得觸碰點座標。
- 兩個連線斷線用的按鈕:Btn_Connect / Btn_DisConnect
- 三個用來呈現RGB值的 Slider (無法拖動)
- BletoothLE:處理BLE通訊
- Clock:定期要求 BluetoothLE 將資料(RGB參數)發送給 Arduino 101
[color=var(--fs-experimental-link-color)]
Blocks
1.初始化
宣告相關變數,其中addr 代表您所要連線之Arduino 101 藍牙位址,印在板子背面。程式初始化時,要求BluetoothLE元件開始掃瞄。
[color=var(--fs-experimental-link-color)]
2.連線與斷線
按下連線按鈕,BluetoothLE元件對指定位址裝置(Arduino 101)連線,並設定相關畫面元件是否可操作,並顯示”Connected”於螢幕狀態列。
斷線則剛好相反,斷開與Arduino 101之BLE連線之後將相關畫面元件恢復原狀,這樣才能重新操作。
[color=var(--fs-experimental-link-color)]
3.滑動手指取得觸碰點RGB參數
使用 Ball.Dragged 事件,當拖動這個小球(代表您手指的位置)時,會執行以下動作:
- 清除畫面
- 將該觸碰點的GetPixelColor結果顯示在Canvas上,會是一個相當大的負整數後續使用select list item 去解出來之後就會是 0~255 的整數了。
- Ball 移動到觸碰點位置
- 使用select list item 搭配 split 指令去分別取得該點的紅色、綠色與藍色值,顯示於Label上即可。
[color=var(--fs-experimental-link-color)]
接著在 Ball.Dragged 事件的下半,分別更新每一個 Slider 的指針位置(ThumbPosition)以及更新 r g b 三個變數的內容為該觸碰點的 r g b 顏色強度,準備要發送出去囉!
如果您覺得這裡的程式碼相當冗長的話,可以用一個副程式包起來讓主程式流程更簡潔易讀。
[color=var(--fs-experimental-link-color)]
4.發送訊號
使用 Clock 元件每1秒鐘觸發一次 Clock.Timer事件,其中會使用 BluetoothLE.WriteIntValue 將 r g b 值的組合結果發送出去,例如 (128, 34, 255) 的組合結果就是 128034255,Arduino 收到之後再拆解即可。
Clock.Timer 事件的1秒鐘您可以自行修改為較小的數字,看看是否有比較好的操作體驗。
[color=var(--fs-experimental-link-color)]
Arduino 101 code重點在於 line 53~67 之間的if (LEDStatus.written())判斷式中,使用 incom = LEDStatus.value(); 來取得 App Inventor 送過來的整數值,並以 1000 為單位來拆開並顯示於 Serial Monitor,最後使用 analogWrite 指令去控制對應的 RGB LED 腳位就完成囉!
- #include <CurieBLE.h>
- #include <stdlib.h>
- #define LEDr 6
- #define LEDg 5
- #define LEDb 3
- 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 r, g, b ;
- 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 RGBLED control.");
- pinMode(LEDr, OUTPUT);
- pinMode(LEDg, OUTPUT);
- pinMode(LEDb, 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();//110225101
- r = incom / 1000000 ;//110
- g = (incom / 1000 - r * 1000) ; //110225-110000=225
- b = (incom - r * 1000000 - g * 1000) ; //110225101-110000000-2250000=101
- Serial.println(incom);
- Serial.println(r);
- Serial.println(g);
- Serial.println(b);
- analogWrite(LEDr, r);
- analogWrite(LEDg, g);
- analogWrite(LEDb, b);
- delay(10);
- }
- }
- digitalWrite(LEDr, LOW);
- digitalWrite(LEDg, LOW);
- digitalWrite(LEDb, LOW);
- delay(100);
- }
- // when the central disconnects, print it out:
- Serial.print(F("Disconnected from central: "));
- Serial.println(central.address());
- }
复制代码
欢迎光临 清泛IT社区 (https://bbs.tsingfun.com/) |
Powered by Discuz! X3.3 |