micro:bit 实验02 - 按 A/B 键让屏幕上的小球跑起来

« 返回 micro:bit 平台  IoT 专题

实验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_Button1BluetoothDevice 没设
按一下小球走两格 没判断 Button_State_Value > 0,松开那次(值 0)也被算成了一次移动
小球跑出屏幕不见了 图像精灵的「允许离开边界」没取消勾选
小球看不见 没设图片时精灵默认宽高是 0。设成 30×30 或指定一张图片
长按没反应 长按状态值是 2,判断写成了 = 1
一会儿就断线 micro:bit 供电不足;离手机太远(BLE 约 10 米,怕遮挡)

五、下一步

  • 实验03:温度看板 —— 同样是订阅套路,数据从开关量变成连续数值
  • 实验04:指南针 —— 磁力计三轴数据
  • 实验05:外接按钮 —— 用 P0 引脚读一个自己接的按钮

相关文档

文档反馈