实验07:手机调色,点亮一颗 RGB LED
这个实验做完你会得到什么
手机上拖三根滑动条(红/绿/蓝),面包板上的 RGB LED 实时变成对应的颜色。
前两篇引脚都是读,这一篇是写 —— 而且是用 PWM 写出连续亮度,不只是亮/灭两档。 学会这个,接舵机、调速电机、控制灯带都是同一套。
| 项目 | 说明 |
|---|---|
| 难度 | ★★★☆☆ |
| 用时 | 约 50 分钟 |
| 前置 | 实验05、实验06 |
改编自 MIT 官方教程 Control RGB LED with Micro:bit I/O pins,扩展改用本站本地文件。
一、器材清单
| 器材 | 数量 | 说明 |
|---|---|---|
| BBC micro:bit | 1 | |
| 面包板 | 1 | |
| 杜邦线 | 4 | |
| RGB LED(共阴) | 1 | 四个脚,最长的那个是负极 |
| 220Ω 电阻 | 3 | 强烈建议,三个颜色各串一个 |
二、接线
| micro:bit | RGB LED(共阴) |
|---|---|
| GND | GND(最长的那个脚,灰线) |
| P0 | R 红(红线) |
| P1 | G 绿(绿线) |
| P2 | B 蓝(蓝线) |

共阴还是共阳:本文按共阴(最长脚接 GND,给高电平就亮)。买到共阳的话, 最长脚要接 3V,而且数值要反过来(0 最亮、255 最灭),代码里用
255 - 值。 分不清就先只接红色那一路,给个 255 看看亮不亮。电阻别省:LED 直连引脚长期使用会烧管子,也可能拉垮 micro:bit 的引脚。 三个颜色各串一个 220Ω。
固件:同实验05,MakeCode 里加 Bluetooth 扩展 + 蓝牙IO引脚服务。
三、界面组件
| 组件 | 命名 | 关键属性 |
|---|---|---|
| 滑动条 | 滑动条_红 |
最小值 0、最大值 255、初始 0 |
| 滑动条 | 滑动条_绿 |
同上 |
| 滑动条 | 滑动条_蓝 |
同上 |
| 标签 | 标签_颜色 |
高度 80、宽度充满,用背景色预览当前颜色 |
| Microbit_Io_Pin_Simple | Microbit_Io_Pin_Simple1 |
不可见,BluetoothDevice = BluetoothLE1 |
四、分步搭代码块
第 1 步:把 P0/P1/P2 配成输出
when BluetoothLE1.Connected() {
Microbit_Io_Pin_Simple1.ConfigurePin(0, true, false)
Microbit_Io_Pin_Simple1.ConfigurePin(1, true, false)
Microbit_Io_Pin_Simple1.ConfigurePin(2, true, false)
标签_状态.Text = "三个引脚已配置为模拟输出"
}
中途验证:状态标签更新,LED 此时不亮(三路都是 0)。
第 3 个参数
false= 输出(前两篇是true输入)。第 2 个true= 模拟, 这样才能用 PWM 调出中间亮度;填false就只有全亮/全灭。
第 2 步:一根滑动条控制一路
procedure 刷新数值() {
标签_颜色.Text = join("R ", round(滑动条_红.ThumbPosition), " G ", round(滑动条_绿.ThumbPosition), " B ", round(滑动条_蓝.ThumbPosition))
}
when 滑动条_红.PositionChanged(thumbPosition) {
Microbit_Io_Pin_Simple1.WritePWMControl(0, round(thumbPosition), 20000)
刷新数值()
}
when 滑动条_绿.PositionChanged(thumbPosition) {
Microbit_Io_Pin_Simple1.WritePWMControl(1, round(thumbPosition), 20000)
刷新数值()
}
when 滑动条_蓝.PositionChanged(thumbPosition) {
Microbit_Io_Pin_Simple1.WritePWMControl(2, round(thumbPosition), 20000)
刷新数值()
}
中途验证:拖红色滑动条,LED 由灭慢慢变红,标签上的 R 数值同步变化。 三根都拖到 255,LED 应该接近白色。
手机上想同步显示一个颜色预览方块的话,得用「合成颜色」积木(取一个 RGB 列表)。 那个块在设计器的「颜色」抽屉里,本文的伪代码只写数值,避免把重点从硬件带偏。
WritePWMControl(引脚号, 占空比, 周期):
- 占空比 0~255,就是亮度;
- 周期单位是微秒,20000 微秒 = 20 毫秒 = 50Hz。低于 50Hz 肉眼能看出闪烁, 调太高(比如 100 微秒)某些 LED 会发暗。50Hz~1kHz 之间都合适。
第 3 步:加几个预设色
global 预设 = list(list(255, 0, 0), list(0, 255, 0), list(0, 0, 255), list(255, 180, 0), list(255, 0, 255))
when 列表显示框_预设.AfterPicking() {
var 色 = 预设[列表显示框_预设.SelectionIndex]
滑动条_红.ThumbPosition = 色[1]
滑动条_绿.ThumbPosition = 色[2]
滑动条_蓝.ThumbPosition = 色[3]
Microbit_Io_Pin_Simple1.WritePWMControl(0, 色[1], 20000)
Microbit_Io_Pin_Simple1.WritePWMControl(1, 色[2], 20000)
Microbit_Io_Pin_Simple1.WritePWMControl(2, 色[3], 20000)
标签_颜色.Text = join("R ", 色[1], " G ", 色[2], " B ", 色[3])
}
加一个 列表显示框_预设,元素字符串填「红,绿,蓝,橙,品红」即可。
中途验证:点「橙」,LED 变橙色,三根滑动条自动跳到对应位置。
改滑动条的值不会触发
PositionChanged(那个事件只响应用户拖动),所以这里必须 手动再调一次WritePWMControl。这是很多人以为”设了值就该生效”却发现没反应的原因。
五、排错表
| 现象 | 原因与处理 |
|---|---|
| LED 完全不亮 | ① 共阳接成了共阴(最长脚该接 3V),或反之;② ConfigurePin 第 3 个参数没写 false(输出);③ 最长脚没接稳 |
| 数值 0 最亮、255 最灭 | 买到的是共阳 LED。代码里改成 255 - 值,或把最长脚改接 3V |
| 只有全亮/全灭两档 | ConfigurePin 第 2 个参数写成了 false(数字量),PWM 需要 true |
| LED 明显闪烁 | PWM 周期太大(频率太低)。20000 微秒是 50Hz,再大就闪了 |
| 某一路颜色偏暗 | 正常,三色芯片效率不同(蓝绿通常比红暗)。想均衡就给三路配不同的电阻值,或代码里乘个系数 |
| 点预设色没反应 | 只改了滑动条的值。改值不会触发 PositionChanged,必须手动再写一次引脚 |
| LED 越用越暗 / 烧了 | 没串限流电阻 |
六、下一步
- 实验08:摇一摇 —— 回到板载传感器,加速度计做姿态判断
- 把实验06 的旋钮和这一篇合起来:拧旋钮直接调色,不用手机滑动条
相关文档
- Microbit_Io_Pin_Simple 组件参考
- 官方原版教程(英文,已标注过时):MIT_App_Inventor_Microbit_IOpin_RGBLED.pdf
扫码添加客服咨询