实验06:拧旋钮控制屏幕,读模拟量
这个实验做完你会得到什么
拧动面包板上的电位器旋钮,手机屏幕上的小蜜蜂跟着左右滑动,下面还有一根进度条 显示当前百分比。
实验05 读的是开关量(0 或 1),这一篇读的是连续变化的模拟量 —— 光敏电阻、 土壤湿度、压力传感器全都是这个套路,换个元件就能复用。
| 项目 | 说明 |
|---|---|
| 难度 | ★★★☆☆ |
| 用时 | 约 50 分钟 |
| 前置 | 实验05:引脚读按钮 |
改编自 MIT 官方教程 read knob status with Micro:bit I/O pins,扩展改用本站本地文件。
一、器材清单
| 器材 | 数量 | 说明 |
|---|---|---|
| BBC micro:bit | 1 | |
| 面包板 | 1 | |
| 杜邦线 | 3 | |
| 电位器 | 1 | 10kΩ 旋钮式,三个脚 |
二、接线
| micro:bit | 电位器 |
|---|---|
| 3V | 左脚(红线) |
| P0 | 中间脚(绿线) |
| GND | 右脚(灰线) |

中间脚一定是信号脚,这个不能错。左右两个脚接电源和地 —— 电位器是无极性元件, 左右对调不会烧,只是旋转方向反过来(顺时针变小)。觉得方向别扭就把红灰两根线对调。
固件:同实验05,MakeCode 里加 Bluetooth 扩展 + 蓝牙IO引脚服务。
三、界面组件
| 组件 | 命名 | 关键属性 |
|---|---|---|
| 画布 | 画布1 |
宽度充满、高度 200 |
| 图像精灵 | 图像精灵_蜜蜂 |
30×30 |
| 标签 | 标签_原始值 |
文本「原始值:–」 |
| 滑动条 | 滑动条_显示 |
最小值 0、最大值 100,仅用来显示百分比 |
| Microbit_Io_Pin_Simple | Microbit_Io_Pin_Simple1 |
不可见,BluetoothDevice = BluetoothLE1 |
四、分步搭代码块
第 1 步:把 P0 配成模拟输入
when BluetoothLE1.Connected() {
Microbit_Io_Pin_Simple1.ConfigurePin(0, true, true)
Microbit_Io_Pin_Simple1.RequestPinDataUpdates()
标签_状态.Text = "P0 已配置为模拟输入"
}
中途验证:状态标签更新。
和实验05 唯一的差别是第 2 个参数从
false变成true(模拟)。 官方教程特意强调过:必须在第 1 步把引脚配成模拟输入,读到的数据才是对的。 配成数字量的话,旋钮转到一半时值会在 0 和 1 之间乱跳。
第 2 步:把读数映射成位置和百分比
when Microbit_Io_Pin_Simple1.InputPinDataReceived(IO_Pin_Data) {
var 百分比 = round(IO_Pin_Data / 255 * 100)
标签_原始值.Text = join("原始值:", IO_Pin_Data, " → ", 百分比, "%")
滑动条_显示.ThumbPosition = 百分比
图像精灵_蜜蜂.X = 百分比 / 100 * (画布1.Width - 30)
}
中途验证:慢慢拧旋钮,原始值从 0 变到 255(或接近),百分比同步变化, 蜜蜂从画布左边滑到右边。
模拟量的量程是 0~255 —— 官方教程原文:”the data range of micro:bit analog input pin is from 0 to 255”。不是 Arduino 那种 0~1023,别照抄。
映射到坐标时要减掉精灵自身宽度,否则拧到底时蜜蜂有一半在屏幕外。
第 3 步:读数太抖就滤一下
模拟量天生带噪声,静止不动时末位也会跳。取最近几次的平均:
global 平滑值 = 0
when Microbit_Io_Pin_Simple1.InputPinDataReceived(IO_Pin_Data) {
global 平滑值 = 平滑值 * 0.7 + IO_Pin_Data * 0.3
标签_原始值.Text = join("原始 ", IO_Pin_Data, " 平滑后 ", round(平滑值))
图像精灵_蜜蜂.X = 平滑值 / 255 * (画布1.Width - 30)
}
中途验证:手不动的时候蜜蜂也不再微微抖动;拧动时响应略微”跟手慢一点”,这是滤波的正常代价。
这叫一阶低通滤波:新值只占 30%,旧值留 70%,突变被摊平。 比”存最近 5 个求平均”省事得多 —— 不用列表、不用循环,一行搞定。
两个系数加起来必须等于 1。想更稳就把 0.3 调小(如 0.1),想更跟手就调大(如 0.5)。
五、排错表
| 现象 | 原因与处理 |
|---|---|
| 值只在 0 和 1 之间跳 | ConfigurePin 第 2 个参数写成了 false(数字量),模拟要填 true |
| 旋钮转到底也不到 255 | 正常,实际元件常在 250 左右;用 min(255, 值) 夹一下,或按实测最大值换算 |
| 转到一半就不变了 | 中间脚没接对 —— 信号必须取中间脚 |
| 顺时针数值反而变小 | 左右两个脚接反了,把红线和灰线对调,或在代码里用 255 - 值 |
| 数值一直是 0 | 3V 那根线没接上;或电位器坏了(万用表量中间脚对两端阻值应随旋转变化) |
| 读数疯狂抖动 | 加第 3 步的滑动平均;另外检查杜邦线是否插牢,接触不良比噪声更常见 |
六、下一步
- 实验07:RGB LED —— 引脚当输出用,把旋钮的值直接映射成灯的颜色
- 实验08:摇一摇 —— 回到板载传感器,做姿态判断
扫码添加客服咨询