实验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 接口:

烧固件时注意:在 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 = BluetoothLE1,Pin = 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 同时只能连一个主机 |
| 连上了但点开灯没反应 | ① Arduino101Led1 的 BluetoothDevice 没设成 BluetoothLE1(最常见);② Pin 写成了 D5,应填 5;③ 固件里 LED 那项没设 ENABLED |
| 灯一直亮不受控 | LED 模块插错接口了。Grove 板上 D5 那个插口才对应 Pin=5 |
| 亮度只有全亮/全灭 | 接在了不支持 PWM 的引脚。换到 3/5/6/9/10/11 |
| 连上几秒就断 | USB 供电不足或线材差;离手机太远(BLE 约 10 米且怕遮挡) |
| 反复重连后彻底连不上 | 上次没断开。板子断电重启,并按第 4 步补上断开逻辑 |
六、下一步
- 实验03:读一个按钮 —— 数据反过来从板子推到手机
- 实验04:温湿度传感器 —— 连续数值与折线图
- 实验09:PWM 电机、实验11:RGB LCD
扫码添加客服咨询