实验02:按 A/B 键让小球跑起来
这个实验做完你会得到什么
按 micro:bit 上的 A 键,手机屏幕上的小球往左跑;按 B 键,往右跑。
实验01 是手机往 micro:bit 发数据,这一篇是反过来:micro:bit 主动把按钮状态推给手机。 这条反向通道是后面所有传感器实验(温度、加速度、磁力计)的共同套路。
| 项目 | 说明 |
|---|---|
| 难度 | ★★☆☆☆ |
| 用时 | 约 40 分钟 |
| 前置 | 实验01:连上 micro:bit,界面直接接着用 |
改编自 MIT 官方教程 Bouncing ball with BBC Micro:bit buttons。原文里的扩展下载地址已失效, 本文用本站本地扩展。原文组件名写作
Microbit_Buttons,实际组件名是Microbit_Button(无 s)。
一、器材清单
| 器材 | 数量 | 说明 |
|---|---|---|
| BBC micro:bit | 1 | 用板载的 A/B 两个按键,不需要任何外接元件 |
固件要求同实验01:MakeCode 里加 Bluetooth 扩展 + 蓝牙按钮服务,并打开
No Pairing Required。
实验01 加的是「蓝牙 LED 服务」,这一篇要的是「蓝牙按钮服务」。两个可以同时加, 这样一份固件能跑完整个系列,不用来回重烧。
二、在实验01 的界面上加东西
保留实验01 的扫描/连接部分,再加:
| 组件 | 命名 | 关键属性 |
|---|---|---|
| 画布 | 画布1 |
宽度充满、高度 200 像素、背景色浅灰 |
| 图像精灵 | 图像精灵_小球 |
放在画布上,图片用一张小球图(没有就把宽高设成 30×30,颜色随意) |
| Microbit_Button | Microbit_Button1 |
不可见,BluetoothDevice = BluetoothLE1 |
三、分步搭代码块
第 1 步:连上之后,订阅按钮状态
按钮状态不会自动送过来,必须先”请求更新”(订阅),micro:bit 才会在状态变化时推消息。
when BluetoothLE1.Connected() {
标签_状态.Text = "已连接,按 A/B 试试"
Microbit_Button1.RequestButtonAStateUpdates()
Microbit_Button1.RequestButtonBStateUpdates()
}
中途验证:连上后状态标签变成「已连接,按 A/B 试试」。此时按键还没有效果,正常。
第 2 步:收到 A 键状态,小球左移
when Microbit_Button1.ButtonAStateReceived(Button_State_Value) {
if Button_State_Value > 0 {
图像精灵_小球.X = 图像精灵_小球.X - 20
标签_状态.Text = "A 键按下"
}
}
中途验证:按住 micro:bit 的 A 键,小球往左跳一格,状态标签变成「A 键按下」。
状态值的含义:
0= 松开,1= 按下,2= 长按。所以判断条件写> 0而不是= 1,长按也能算按下。松开时也会推一次(值为 0),所以事件其实触发了两次 —— 不加这个
if, 小球会按一下走两格。
第 3 步:B 键右移,并且别跑出画布
when Microbit_Button1.ButtonBStateReceived(Button_State_Value) {
if Button_State_Value > 0 {
图像精灵_小球.X = 图像精灵_小球.X + 20
标签_状态.Text = "B 键按下"
}
}
小球跑出边界的处理交给画布自己:把 图像精灵_小球 的 允许离开边界 取消勾选即可,
不用写代码。
中途验证:A/B 两个键都能推动小球,一直按同一个方向,小球停在边缘不会消失。
第 4 步:断开时停止订阅
when BluetoothLE1.Disconnected() {
标签_状态.Text = "已断开"
}
when 按钮_断开.Click() {
Microbit_Button1.StopButtonAStateUpdates()
Microbit_Button1.StopButtonBStateUpdates()
BluetoothLE1.Disconnect()
}
先退订再断开。直接断连虽然也能用,但 micro:bit 那边会保留订阅记录, 下次连上可能收到重复推送。
四、排错表
| 现象 | 原因与处理 |
|---|---|
| 连上了但按键毫无反应 | ① 没调 RequestButtonAStateUpdates(最常见,这是订阅动作,不是可选项);② 固件里没加「蓝牙按钮服务」;③ Microbit_Button1 的 BluetoothDevice 没设 |
| 按一下小球走两格 | 没判断 Button_State_Value > 0,松开那次(值 0)也被算成了一次移动 |
| 小球跑出屏幕不见了 | 图像精灵的「允许离开边界」没取消勾选 |
| 小球看不见 | 没设图片时精灵默认宽高是 0。设成 30×30 或指定一张图片 |
| 长按没反应 | 长按状态值是 2,判断写成了 = 1 |
| 一会儿就断线 | micro:bit 供电不足;离手机太远(BLE 约 10 米,怕遮挡) |
五、下一步
- 实验03:温度看板 —— 同样是订阅套路,数据从开关量变成连续数值
- 实验04:指南针 —— 磁力计三轴数据
- 实验05:外接按钮 —— 用 P0 引脚读一个自己接的按钮
相关文档
- Microbit_Button 组件参考
- 官方原版教程(英文,已标注过时):MIT_App_Inventor_Microbit_Button.pdf
扫码添加客服咨询