micro:bit 实验06 - 拧旋钮控制屏幕,读模拟量

« 返回 micro:bit 平台  IoT 专题

实验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 右脚(灰线)

电位器接 P0 的接线

中间脚一定是信号脚,这个不能错。左右两个脚接电源和地 —— 电位器是无极性元件, 左右对调不会烧,只是旋转方向反过来(顺时针变小)。觉得方向别扭就把红灰两根线对调。

固件:同实验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:摇一摇 —— 回到板载传感器,做姿态判断

相关文档

文档反馈