micro:bit 实验07 - 手机调色,点亮一颗 RGB LED

« 返回 micro:bit 平台  IoT 专题

实验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 蓝(蓝线)

RGB LED 接 P0/P1/P2 的接线

共阴还是共阳:本文按共阴(最长脚接 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 的旋钮和这一篇合起来:拧旋钮直接调色,不用手机滑动条

相关文档

文档反馈