Arduino 101 实验02 - 手机开关灯与亮度调节

« 返回 Arduino101 平台  IoT 专题

实验02:手机开关灯与亮度调节

这个实验做完你会得到什么

手机上点「开灯」,接在 Arduino 101 上的 LED 亮起来;拖动滑动条,亮度跟着变

这是 Arduino 101 系列里最短的一个闭环,用来确认「手机 → BLE → 板子 → 执行器」这条链路是通的。 后面读传感器的实验是反方向(板子 → 手机),链路一样。

项目 说明
难度 ★☆☆☆☆
用时 约 30 分钟
前置 实验00:环境搭建实验01:板载 LED 闪烁

本文改编自 MIT 官方教程 App Inventor + IoT: LED。原文里的扩展下载地址已失效, 本文一律用本站的本地扩展文件。

不想一步步搭? 直接下载做好的工程导入即可: Arduino101LED.aia(组件命名与本文一致)


一、器材清单

器材 数量 说明
Arduino 101 1 板载 BLE,这是能直接跟手机通信的关键
Seeed Grove 扩展板 1 非必需,但免焊接免面包板,强烈建议
Grove LED 模块 1 白/红/绿都行
USB 数据线 1 烧固件用

不用 Grove 扩展板也可以:把 LED 长脚串一个 220Ω 电阻接到 D5,短脚接 GND,效果一样。


二、接线

LED 模块插在 Grove 扩展板的 D5 接口

LED 接在 Grove 扩展板的 D5

烧固件时注意:在 AIM-for-Things-Arduino101.ino 里,把 LED 设为 ENABLED,其余全部 DISABLED,然后点左上角箭头上传。

只开你这次要用的那个模块。全开会让固件同时注册一堆 BLE 服务,手机端扫描和连接都会变慢, 内存也吃紧。

验证这一步:上传成功后板子上的电源灯常亮,Grove LED 模块此时不亮(等着手机来点它)。


三、准备 App Inventor 端

3.1 导入两个扩展

扩展 用途 下载
BluetoothLE 扫描、连接、断开 edu.mit.appinventor.ble-20240822.aix
Arduino101 系列 板上各模块的控制块 edu.mit.appinventor.iot.arduino101.aix

导入后从组件面板把 Arduino101Led 拖进屏幕(不可见组件)。

3.2 界面组件

组件 命名 关键属性
按钮 按钮_扫描 文本「扫描设备」
列表显示框 列表显示框_设备 高度 200 像素
标签 标签_状态 文本「未连接」
按钮 按钮_开灯 文本「开灯」
按钮 按钮_关灯 文本「关灯」
滑动条 滑动条_亮度 宽度充满、最小值 0、最大值 100、初始 100
BluetoothLE BluetoothLE1 不可见
Arduino101Led Arduino101Led1 不可见,BluetoothDevice = BluetoothLE1Pin = 5,Intensity = 100

Pin 只填数字 5,不要写 D5,写成 D5 会被当成 0。

BluetoothDevice 不设,等于这个组件不知道从哪条连接发指令 —— 所有 Arduino101* 组件都有这个属性,都要设成 BluetoothLE1


四、分步搭代码块

第 1 步:连上板子

when 按钮_扫描.Click() {
  BluetoothLE1.StartScanning()
  标签_状态.Text = "正在扫描…"
}

when BluetoothLE1.DeviceFound() {
  列表显示框_设备.ElementsFromString = BluetoothLE1.DeviceList
}

when 列表显示框_设备.AfterPicking() {
  BluetoothLE1.StopScanning()
  BluetoothLE1.Connect(列表显示框_设备.SelectionIndex, true)
}

when BluetoothLE1.Connected() {
  标签_状态.Text = join("已连接:", BluetoothLE1.ConnectedDeviceName)
}

中途验证:点扫描,列表里出现 Arduino 101(名字通常带 AIM 或板子型号); 点它,状态标签变成「已连接:…」。

第 2 步:开灯关灯

when 按钮_开灯.Click() {
  Arduino101Led1.TurnOn()
}

when 按钮_关灯.Click() {
  Arduino101Led1.TurnOff()
}

中途验证:点「开灯」,LED 亮;点「关灯」,灭。做到这一步整条链路就已经通了, 剩下的都是锦上添花。

第 3 步:滑动条调亮度

when 滑动条_亮度.PositionChanged(thumbPosition) {
  Arduino101Led1.Intensity = round(thumbPosition)
  标签_状态.Text = join("亮度:", round(thumbPosition), "%")
}

中途验证:LED 亮着的时候拖滑动条,亮度平滑变化。

Intensity 取值 1~100,靠 PWM 实现。必须接在支持 PWM 的引脚上 —— 组件文档明确写了 Arduino 101 的 PWM 引脚只有 3、5、6、9 四个, 接到别的脚上只会有全亮/全灭两档,调亮度不生效。

第 4 步:断开

when Screen1.BackPressed() {
  BluetoothLE1.Disconnect()
}

when BluetoothLE1.Disconnected() {
  标签_状态.Text = "已断开"
}

BLE 连接不随 App 关闭自动释放。不断开的话,下次扫描会出现「看得见但连不上」, 得把板子断电重启。


五、排错表

现象 原因与处理
扫不到设备 ① 固件没烧成功,重新上传 .ino;② Android 6+ 扫 BLE 需要定位权限且定位开关打开,这是系统限制;③ 板子已被别的手机连着,BLE 同时只能连一个主机
连上了但点开灯没反应 Arduino101Led1BluetoothDevice 没设成 BluetoothLE1(最常见);② Pin 写成了 D5,应填 5;③ 固件里 LED 那项没设 ENABLED
灯一直亮不受控 LED 模块插错接口了。Grove 板上 D5 那个插口才对应 Pin=5
亮度只有全亮/全灭 接在了不支持 PWM 的引脚。换到 3/5/6/9/10/11
连上几秒就断 USB 供电不足或线材差;离手机太远(BLE 约 10 米且怕遮挡)
反复重连后彻底连不上 上次没断开。板子断电重启,并按第 4 步补上断开逻辑

六、下一步


相关文档

文档反馈