micro:bit 实验01 - 手机连上 micro:bit,点亮第一行字

« 返回 micro:bit 平台  IoT 专题

实验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 那边必须先烧一个 开启了蓝牙服务的程序。没有这一步,手机扫描时根本看不到设备。

  1. 打开 MakeCode 在线编辑器,新建项目。
  2. 点「扩展」,搜索并添加 Bluetooth 扩展。

    添加 Bluetooth 扩展时,MakeCode 会提示 Radio(无线电)扩展将被移除——这是正常的, 两者不能共存,选择确认即可。

  3. 拖入下面这段(MakeCode 积木,不是 App Inventor 积木):
    • 在开机时蓝牙 LED 服务
    • 在开机时显示字符串 "READY"
  4. 点「设置 → 项目设置」,把 No Pairing Required: Anyone can connect via Bluetooth 打开。

    这一项非常关键。默认的配对模式要求手机先跟 micro:bit 做 BLE 配对, App Inventor 的 BluetoothLE 扩展走的是直连,不打开这一项会连接失败。

  5. 下载 .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_Led1BluetoothDevice 属性必须在设计视图里指定为 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_Led1BluetoothDevice 属性没设成 BluetoothLE1(最常见);或固件里没加 蓝牙 LED 服务
显示成问号/空白 发了中文或特殊符号,点阵字库只支持 ASCII
图案画出来是乱的 五个数字的顺序是从上到下五行;每行 5 位二进制左边是最左边那盏灯
一会儿就掉线 micro:bit 供电不足(USB 供电不稳或电池没电);离手机太远,BLE 有效距离约 10 米且怕遮挡
App 一发送就崩 没连上就调用了写入方法。按第三节把「发送」按钮的初始 启用 取消勾选

八、下一步

这个连接界面就是整个系列的地基,后面几篇直接在它上面加东西:

  • 实验02:手机读 micro:bit 的按钮 A/B —— 学会「订阅通知」这种反向数据流
  • 实验03:摇一摇 —— 读加速度计三轴数据
  • 实验04:温度看板 —— 读温度并画成折线图
  • 实验05:引脚控制 —— 接一个外部 LED 和光敏电阻

相关文档

文档反馈