实验01:连上 micro:bit,点亮第一行字
这个实验做完你会得到什么
在手机上输入一句话,点「发送」,micro:bit 正面的 5×5 红色点阵把这句话滚动显示出来。
这是 micro:bit 系列的起点:后面所有实验(读按钮、读温度、摇一摇、控制引脚)都建立在这一步 打通的扫描 → 连接 → 通信流程上,界面也可以直接复用。
| 项目 | 说明 |
|---|---|
| 难度 | ★☆☆☆☆ |
| 用时 | 约 30 分钟 |
| 前置 | 无,这是系列第一篇 |
一、器材清单
| 器材 | 数量 | 说明 |
|---|---|---|
| BBC micro:bit | 1 | v1 或 v2 都可以 |
| USB 数据线 | 1 | 给 micro:bit 刷固件用,必须是能传数据的线,充电线不行 |
| Android 手机 | 1 | Android 6.0 以上,支持蓝牙 4.0 (BLE) |
| 电池盒(可选) | 1 | 刷完固件后脱离电脑独立供电 |
不需要任何面包板、电阻或外接元件,这一篇只用板载的 LED 点阵。
二、给 micro:bit 刷蓝牙固件
App Inventor 是通过蓝牙 BLE 的标准服务跟 micro:bit 通信的,所以 micro:bit 那边必须先烧一个 开启了蓝牙服务的程序。没有这一步,手机扫描时根本看不到设备。
- 打开 MakeCode 在线编辑器,新建项目。
- 点「扩展」,搜索并添加 Bluetooth 扩展。
添加 Bluetooth 扩展时,MakeCode 会提示 Radio(无线电)扩展将被移除——这是正常的, 两者不能共存,选择确认即可。
- 拖入下面这段(MakeCode 积木,不是 App Inventor 积木):
在开机时→蓝牙 LED 服务在开机时→显示字符串 "READY"
- 点「设置 → 项目设置」,把 No Pairing Required: Anyone can connect via Bluetooth 打开。
这一项非常关键。默认的配对模式要求手机先跟 micro:bit 做 BLE 配对, App Inventor 的 BluetoothLE 扩展走的是直连,不打开这一项会连接失败。
- 下载
.hex文件,用 USB 线拷贝到电脑上出现的 MICROBIT 磁盘里,等黄灯闪烁结束。
验证这一步:micro:bit 上滚动显示 READY,说明固件烧好了。
三、准备 App Inventor 端
3.1 导入两个扩展
| 扩展 | 用途 | 下载 |
|---|---|---|
| BluetoothLE | 负责扫描、连接、断开 | 参考文档 |
| Microbit_Led | 负责往 LED 点阵写文字/图案 | com.bbc.microbit.profile-20200518.aix |
导入方式:设计视图左侧组件面板拉到底 → Extension → Import extension → 选 .aix 文件。
3.2 界面组件
| 组件 | 命名 | 关键属性 |
|---|---|---|
| 按钮 | 按钮_扫描 |
文本「扫描设备」 |
| 列表显示框 | 列表显示框_设备 |
高度 200 像素 |
| 标签 | 标签_状态 |
文本「未连接」 |
| 文本输入框 | 文本输入框_内容 |
提示「输入要显示的文字」 |
| 按钮 | 按钮_发送 |
文本「发送到 micro:bit」,启用 = 取消勾选 |
| 按钮 | 按钮_断开 |
文本「断开」 |
| BluetoothLE | BluetoothLE1 |
不可见组件 |
| Microbit_Led | Microbit_Led1 |
不可见组件,BluetoothDevice 属性选 BluetoothLE1 |
Microbit_Led1的 BluetoothDevice 属性必须在设计视图里指定为BluetoothLE1, 否则它不知道该用哪条连接去发数据。所有Microbit_*组件都有这个属性,都要设。
按钮_发送一开始要设成不可用:没连上就点发送,是新手最常见的一个坑。
四、分步搭代码块
第 1 步:扫描,把找到的设备列出来
when 按钮_扫描.Click() {
BluetoothLE1.StartScanning()
标签_状态.Text = "正在扫描…"
}
when BluetoothLE1.DeviceFound() {
列表显示框_设备.ElementsFromString = BluetoothLE1.DeviceList
}
中途验证:点「扫描设备」,几秒内列表里应该出现类似 BBC micro:bit [xxxxx] 的条目。
看不到就先别往下做,去看文末排错表的第 1 条。
第 2 步:点列表里的设备,连上去
when 列表显示框_设备.AfterPicking() {
BluetoothLE1.StopScanning()
BluetoothLE1.Connect(列表显示框_设备.SelectionIndex, true)
标签_状态.Text = "正在连接…"
}
when BluetoothLE1.Connected() {
标签_状态.Text = join("已连接:", BluetoothLE1.ConnectedDeviceName)
按钮_发送.Enabled = true
}
when BluetoothLE1.ConnectionFailed(reason) {
标签_状态.Text = join("连接失败:", reason)
按钮_发送.Enabled = false
}
Connect的第二个参数是autoReconnect,填true表示掉线后自动重连。先停扫描再连接:BLE 扫描很占蓝牙硬件资源,边扫边连在很多手机上会连接超时。
中途验证:点列表里的 micro:bit,状态标签变成「已连接:BBC micro:bit …」, 「发送」按钮由灰变亮。此时 micro:bit 屏幕上通常会出现一个连接标志。
第 3 步:把文字写到 LED 点阵
when 按钮_发送.Click() {
if isEmpty(文本输入框_内容.Text) {
标签_状态.Text = "请先输入内容"
} else {
Microbit_Led1.WriteLEDText(文本输入框_内容.Text)
}
}
when Microbit_Led1.WroteLEDText(LED_Text_Value) {
标签_状态.Text = join("已发送:", LED_Text_Value)
}
中途验证:输入 HELLO,点发送 —— micro:bit 上滚动显示 HELLO。
只能发 ASCII:micro:bit 的点阵字库没有中文,发中文会显示成一串问号或空白。 这不是程序错误,是硬件字库限制。
第 4 步:断开与善后
when 按钮_断开.Click() {
BluetoothLE1.Disconnect()
}
when BluetoothLE1.Disconnected() {
标签_状态.Text = "已断开"
按钮_发送.Enabled = false
}
when Screen1.ErrorOccurred(component, functionName, errorNumber, message) {
标签_状态.Text = join("出错:", message)
}
退出前一定要断开。BLE 连接不会随 App 关闭自动释放,不断开会导致下次扫描时 设备”看得见但连不上”,得把 micro:bit 断电重启才行。
五、进阶:在点阵上画图案
点阵不止能滚字,还能直接画图。WriteLEDMatrixState 收一个5 个数字的列表,
每个数字代表一行的亮灭。
when 按钮_笑脸.Click() {
Microbit_Led1.WriteLEDMatrixState(list(10, 10, 0, 17, 14))
}
when 按钮_爱心.Click() {
Microbit_Led1.WriteLEDMatrixState(list(10, 31, 31, 14, 4))
}
when Microbit_Led1.WroteLEDMatrixState(LED_Matrix_State) {
标签_状态.Text = "图案已发送"
}
中途验证:点「笑脸」,micro:bit 上出现一张笑脸;点「爱心」出现心形。
数字怎么来的:每一行 5 个灯,用 5 位二进制表示,1 = 亮、0 = 灭,再转成十进制。 笑脸的五行是:
01010 → 10 两只眼睛 01010 → 10 两只眼睛 00000 → 0 空一行 10001 → 17 嘴角两端 01110 → 14 嘴巴中间自己设计图案时,在纸上画 5×5 的格子,涂黑的写 1、空的写 0,一行一行读成二进制再换算。 嫌换算麻烦的话,App Inventor 数学抽屉里有「进制转换」块(选 二进制转十进制), 直接把
"01010"这样的字符串喂进去,可读性好得多 —— 官方教程用的就是这个办法。
界面上再加 按钮_笑脸 和 按钮_爱心 两个按钮即可。
六、调一下滚动速度(可选)
文字滚动太快看不清时,可以改滚动延时(单位毫秒,默认 120,值越大越慢):
when 滑动条_速度.PositionChanged(thumbPosition) {
Microbit_Led1.WriteScrollingDelay(round(thumbPosition))
}
when Microbit_Led1.WroteScrollingDelay(Scrolling_Delay_Value) {
标签_状态.Text = join("滚动延时:", Scrolling_Delay_Value, " 毫秒")
}
加一个滑动条 滑动条_速度,最小值 50、最大值 500 即可。
七、排错表
| 现象 | 原因与处理 |
|---|---|
| 扫不到任何设备 | ① micro:bit 没刷带蓝牙服务的固件(第二节);② Android 6+ 扫描 BLE 需要定位权限且定位开关打开——这是系统限制,不是 App 的 bug;③ micro:bit 已被别的手机/网页连着,BLE 同时只能连一个主机 |
| 扫得到但连接失败 | MakeCode 里 No Pairing Required 没打开,重刷固件;或上次没断开,把 micro:bit 断电重启 |
| 连上了但发送没反应 | Microbit_Led1 的 BluetoothDevice 属性没设成 BluetoothLE1(最常见);或固件里没加 蓝牙 LED 服务 |
| 显示成问号/空白 | 发了中文或特殊符号,点阵字库只支持 ASCII |
| 图案画出来是乱的 | 五个数字的顺序是从上到下五行;每行 5 位二进制左边是最左边那盏灯 |
| 一会儿就掉线 | micro:bit 供电不足(USB 供电不稳或电池没电);离手机太远,BLE 有效距离约 10 米且怕遮挡 |
| App 一发送就崩 | 没连上就调用了写入方法。按第三节把「发送」按钮的初始 启用 取消勾选 |
八、下一步
这个连接界面就是整个系列的地基,后面几篇直接在它上面加东西:
- 实验02:手机读 micro:bit 的按钮 A/B —— 学会「订阅通知」这种反向数据流
- 实验03:摇一摇 —— 读加速度计三轴数据
- 实验04:温度看板 —— 读温度并画成折线图
- 实验05:引脚控制 —— 接一个外部 LED 和光敏电阻
扫码添加客服咨询