清泛IT社区App Inventor 2 中文社区

搜索

扫码访问移动社区 移动社区,您的掌上技术专家

关注我,精彩不错过! 关注我,精彩不错过!

扫码安装最新版AI伴侣 最新版AI伴侣v2.74

Aia Store .aia 源码一站式解决方案 发布日志AI2连接测试ai2Starter模拟器

App Inventor 2 离线版AI2 拓展接入DeepSeek VIP会员 享专有教程,免费赠送基础版*技术支持服务! AI2入门必读中文文档中文教程IoT专题

查看: 28|回复: 0
打印 上一主题 下一主题

[经验分享] Arduino101(Genuino 101)&App Inventor – RGB LED控制

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 390 天

    [LV.9]以坛为家II

    646

    主题

    1117

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    28455

    AI2中文网VIP弹球达人接水果达人撸猫达人

    跳转到指定楼层
    楼主
    发表于 昨天 14:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    繁体中文原文:https://blog.cavedu.com/2017/02/ ... %e6%8e%a7%e5%88%b6/


    本文將介紹如何取得觸碰點的 RGB 參數之後透過 BLE 送給 Arduino 101 來點亮 RGB LED。


    App Inventor

    Designer

    • 使用 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 腳位就完成囉!

    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. }
    复制代码
    App Inventor 2 中文网 - MIT同步更新的中文本土化平台!v2.74 支持Android 14 更新日志
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    © 2025 tsingfun.com, Inc.  沪ICP备2020034476号-1  沪公网安备31011702000040号

    GMT+8, 2025-03-12 14:23 , Processed in 0.023722 second(s), 37 queries .