清泛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 Inventor

Designer

[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 事件,當拖動這個小球(代表您手指的位置)時,會執行以下動作:

[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 腳位就完成囉!

  1. #include <CurieBLE.h>
  2. #include <stdlib.h>
  3. #define LEDr 6
  4. #define LEDg 5
  5. #define LEDb 3

  6. BLEPeripheral blePeripheral;  // BLE Peripheral Device (the board you're programming)
  7. BLEService ControlLED("19B10010-E8F2-537E-4F6C-D104768A1214"); // BLE AnalogRead Service

  8. // BLE LED Switch Characteristic - custom 128-bit UUID, read and writable by central
  9. BLEUnsignedIntCharacteristic LEDStatus("19B10011-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite  );

  10. int incom = 0;
  11. int r, g, b ;

  12. void setup() {
  13.   Serial.begin(9600);
  14.   // set Light pin to output mode
  15.   // set advertised local name and service UUID:
  16.   blePeripheral.setLocalName("ControlLED");
  17.   blePeripheral.setAdvertisedServiceUuid(ControlLED.uuid());

  18.   // add service and characteristic:
  19.   blePeripheral.addAttribute(ControlLED);
  20.   blePeripheral.addAttribute(LEDStatus);

  21.   // begin advertising BLE Light service:
  22.   blePeripheral.begin();

  23.   Serial.println("BLE RGBLED control.");

  24.   pinMode(LEDr, OUTPUT);
  25.   pinMode(LEDg, OUTPUT);
  26.   pinMode(LEDb, OUTPUT);

  27. }

  28. void loop() {
  29.   // listen for BLE peripherals to connect:

  30.   BLECentral central = blePeripheral.central();
  31.   // if a central is connected to peripheral:
  32.   if (central) {
  33.     Serial.print("Connected to central: ");
  34.     // print the central's MAC address:
  35.     Serial.println(central.address());


  36.     // while the central is still connected to peripheral:
  37.     while (central.connected()) {
  38.       //Serial.println(LEDStatus.written());
  39.       if (LEDStatus.written())
  40.       {
  41.         incom = LEDStatus.value();//110225101
  42.         r = incom / 1000000 ;//110
  43.         g = (incom / 1000 - r * 1000) ; //110225-110000=225
  44.         b = (incom - r * 1000000 - g * 1000) ; //110225101-110000000-2250000=101
  45.         Serial.println(incom);
  46.         Serial.println(r);
  47.         Serial.println(g);
  48.         Serial.println(b);
  49.         analogWrite(LEDr, r);
  50.         analogWrite(LEDg, g);
  51.         analogWrite(LEDb, b);
  52.         delay(10);
  53.       }
  54.     }
  55.     digitalWrite(LEDr, LOW);
  56.     digitalWrite(LEDg, LOW);
  57.     digitalWrite(LEDb, LOW);
  58.     delay(100);
  59.   }

  60.   // when the central disconnects, print it out:

  61.   Serial.print(F("Disconnected from central: "));
  62.   Serial.println(central.address());
  63. }
复制代码





欢迎光临 清泛IT社区 (https://bbs.tsingfun.com/) Powered by Discuz! X3.3