实验01:让板载 LED 闪起来
这个实验做完你会得到什么
不接任何元件,手机连上 Arduino 101 后,板子上那颗贴片 LED(13 号引脚)开始每秒闪一次; 点「停止」就停。
这是整个系列的第一个闭环。故意不接线 —— 先确认「手机 ↔ BLE ↔ 板子」这条链路是通的, 接线的问题留到下一篇。链路通不了的话,接再多元件也白搭。
| 项目 | 说明 |
|---|---|
| 难度 | ★☆☆☆☆ |
| 用时 | 约 25 分钟 |
| 前置 | 实验00:环境搭建 |
改编自 MIT 官方教程 App Inventor + IoT: Starter Tutorial,扩展改用本站本地文件。
一、器材清单
| 器材 | 数量 | 说明 |
|---|---|---|
| Arduino 101 | 1 | 用板载 LED,不需要任何外接元件 |
| USB 数据线 | 1 | 烧固件用;烧完可以改用电池供电 |
固件:AIM-for-Things-Arduino101.ino 里把 LED 设为 ENABLED,其余 DISABLED,上传。
二、界面组件
| 组件 | 命名 | 关键属性 |
|---|---|---|
| 按钮 | 按钮_扫描 |
文本「扫描设备」 |
| 列表显示框 | 列表显示框_设备 |
高度 200 像素 |
| 标签 | 标签_状态 |
文本「未连接」 |
| 按钮 | 按钮_开始闪烁 |
文本「开始闪烁」,启用 = 取消勾选 |
| 按钮 | 按钮_停止 |
文本「停止」,启用 = 取消勾选 |
| 计时器 | 计时器1 |
计时器启用 = 取消勾选、计时间隔 = 1000 |
| BluetoothLE | BluetoothLE1 |
不可见 |
| Arduino101Led | Arduino101Led1 |
不可见,BluetoothDevice = BluetoothLE1、Pin = 13、Intensity = 100 |
Pin 填 13:这是 Arduino 101 板载 LED 的引脚号,写在板子上(旁边印着
L)。计时器的「计时器启用」一定要先取消勾选。不取消的话 App 一打开就开始触发, 那时还没连上蓝牙,每次触发都会报错。
三、分步搭代码块
第 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)
按钮_开始闪烁.Enabled = true
按钮_停止.Enabled = true
}
中途验证:点扫描 → 列表里出现板子 → 点它 → 状态标签变成「已连接:…」, 两个按钮由灰变亮。做到这里链路就通了,这是本篇最重要的一步。
第 2 步:用计时器交替开关
global 灯亮着 = false
when 按钮_开始闪烁.Click() {
计时器1.TimerEnabled = true
标签_状态.Text = "闪烁中…"
}
when 计时器1.Timer() {
if 灯亮着 {
Arduino101Led1.TurnOff()
global 灯亮着 = false
} else {
Arduino101Led1.TurnOn()
global 灯亮着 = true
}
}
中途验证:点「开始闪烁」,板子上的 LED 开始每秒亮灭一次。
为什么要自己记一个
灯亮着:Arduino101Led1.On是只读属性,读的是上一次已知状态, 而 BLE 通信有延迟。自己维护一个变量最可靠,也少一次往返。
第 3 步:停止与收尾
when 按钮_停止.Click() {
计时器1.TimerEnabled = false
Arduino101Led1.TurnOff()
标签_状态.Text = "已停止"
}
when Screen1.BackPressed() {
计时器1.TimerEnabled = false
BluetoothLE1.Disconnect()
}
when BluetoothLE1.Disconnected() {
计时器1.TimerEnabled = false
标签_状态.Text = "已断开"
按钮_开始闪烁.Enabled = false
按钮_停止.Enabled = false
}
中途验证:点停止,LED 灭且不再闪;退出 App 后再进来,能重新扫描连接。
断开时一定要关掉计时器。不关的话它会继续每秒触发,对着一条已经断了的连接发指令, 满屏报错。
第 4 步:闪得更快一点(可选)
when 滑动条_频率.PositionChanged(thumbPosition) {
计时器1.TimerInterval = round(thumbPosition)
标签_状态.Text = join("间隔 ", round(thumbPosition), " 毫秒")
}
加一个 滑动条_频率,最小值 200、最大值 2000。
别调到 100 毫秒以下。每次开关都是一次 BLE 往返,太快会堵住通道, 表现为闪烁变得不规律甚至卡住。
四、排错表
| 现象 | 原因与处理 |
|---|---|
| 扫不到设备 | ① 固件没烧成功或 LED 没设 ENABLED;② Android 6+ 扫 BLE 需要定位权限且定位开关打开;③ 板子已被别的手机连着 |
| 连上了但 LED 不闪 | ① Pin 不是 13;② BluetoothDevice 属性没设成 BluetoothLE1;③ 计时器的「计时器启用」没被代码打开 |
| App 一打开就报错 | 计时器的「计时器启用」在设计器里没取消勾选,还没连上就开始触发了 |
| 闪烁不规律 / 卡住 | 计时间隔太小(<100 毫秒),BLE 通道堵了。调回 500 以上 |
| 断开后满屏报错 | Disconnected 事件里没关计时器 |
| 板卡版本装错 | 见 实验00 第三节:Intel Curie 必须用 1.0.7 |
五、下一步
- 实验02:外接 LED 开关与亮度调节 —— 开始接元件,并用 PWM 调光
- 实验03:读一个按钮 —— 数据反过来从板子推到手机
相关文档
- Arduino101Led 组件参考
- 官方原版教程(英文,已标注过时):MIT_App_Inventor_IoT_Starter_Tutorial.pdf
扫码添加客服咨询