Arduino 101 实验01 - 让板载 LED 闪起来

« 返回 Arduino101 平台  IoT 专题

实验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 = BluetoothLE1Pin = 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

五、下一步


相关文档

文档反馈