即墨开展平台业务培训 推进教师管理数字化
2026-06-15
2026-06-19 0
版本信息:v1.0 | 更新日期:2026-02-10
适用模组:SU-03T、CI-03T、CI-33T、CI-73T、SU-32T 等支持 GPIO/PWM 输出的 SmartPi 模组
素材来源:技术交流群真实用户提问 + SmartPi 官方文档
流水灯效果是语音交互产品中常用的视觉反馈方式,能够让用户直观地感受到设备的工作状态。然而,许多开发者在尝试实现流水灯或渐变效果时会遇到各种问题。

用户真实提问(智能公元12群,2026-02-07):
"请问想通过3路PWM实现流水灯效果应该如何设置,我参考了B站上的呼吸灯设置方法但是频率闪烁不对"官方解答:
"用定时器和IO输出的延时反转功能去试试"
本文将系统讲解在 SmartPi 平台上实现流水灯效果的多种方案,包括基础的 GPIO 翻转、PWM 调光、定时器控制等,帮助开发者选择最适合自己项目的方案。
| 效果类型 | 视觉表现 | 技术难度 | 典型应用 |
|---|---|---|---|
| 开关闪烁 | LED 亮灭交替 | ★☆☆ | 状态指示、报警提示 |
| 渐变呼吸 | 亮度缓慢变化 | ★★☆ | 等待提示、氛围灯 |
| 流水跑马 | 多个LED依次点亮 | ★★★ | 装饰灯、展示效果 |
| 彩虹渐变 | RGB颜色渐变 | ★★★ | 氛围灯、彩灯 |
| 方案 | 硬件要求 | PWM数量 | 定时器 | 效果质量 |
|---|---|---|---|---|
| GPIO延时翻转 | 仅需GPIO | 不需要 | 可选 | 基础闪烁 |
| PWM占空比控制 | 支持PWM的GPIO | 需要 | 可选 | 亮度可调 |
| 定时器+GPIO | 仅需GPIO | 不需要 | 必须 | 精确时序 |
| 软件模拟PWM | 仅需GPIO | 不需要 | 必须 | 渐变效果 |
步骤1:GPIO 延时翻转配置
在智能公元平台的 GPIO 配置页面:
配置示例:
GPIO引脚:A0
初始状态:高电平(点亮LED)
延时时长:500ms(0.5秒后自动翻转)步骤2:语音命令配置
| 命令词 | 执行动作 |
|---|---|
| "开始闪烁" | GPIO A0 输出高电平 |
| "停止闪烁" | GPIO A0 输出低电平 |
启动时序:
t=0ms: GPIO输出高电平 → LED点亮
t=500ms: 延时翻转 → GPIO变低 → LED熄灭
t=1000ms: 延时翻转 → GPIO变高 → LED点亮
...循环往复用户常见问题(智能公元16群,2026-02-07):
"占空比这里要设置2.5ms就写2.5吗?"
重要:PWM 占空比参数必须填写整数,不能使用小数点。
占空比参数 = (目标时间 / PWM周期) × 100计算示例:
| 目标占空比时间 | PWM频率 | PWM周期 | 占空比参数 |
|---|---|---|---|
| 2.5ms | 100Hz (10ms周期) | 10ms | 25 |
| 5.0ms | 100Hz (10ms周期) | 10ms | 50 |
| 1.0ms | 1kHz (1ms周期) | 1ms | 100 |
配置示例:
假设PWM频率100Hz(周期10ms),要实现25%占空比:
1. 目标时间 = 2.5ms
2. PWM周期 = 10ms
3. 占空比参数 = (2.5 / 10) × 100 = 25方法一:使用多个固定占空比命令
| 命令词 | PWM占空比 | 效果 |
|---|---|---|
| "最亮" | 100 | 全亮 |
| "较亮" | 75 | 75%亮度 |
| "中等" | 50 | 50%亮度 |
| "较暗" | 25 | 25%亮度 |
| "最暗" | 10 | 10%亮度 |
方法二:使用变量动态控制
定义亮度变量:
brightnessint50PWM 配置:
brightness语音命令:
brightness = brightness + 10brightness = brightness - 10| 模组型号 | PWM数量 | PWM引脚 | 说明 |
|---|---|---|---|
| SU-03T | 2路 | 可配置引脚 | 基础款 |
| CI-03T | 4路 | 可配置引脚 | 标准款 |
| CI-33T | 4路 | 可配置引脚 | 双麦克风款 |
| CI-73T | 多路 | 可配置引脚 | 高性价比 |
| SU-32T | 多路 | 可配置引脚 | 双麦降噪款 |
步骤1:定义定时器
在"定时器"配置页面:
led_timer200ms(每个LED点亮时长)步骤2:定义变量
变量名:led_index
类型:int
默认值:0
说明:记录当前点亮的LED编号(0-2,共3个LED)步骤3:配置定时器超时动作
触发方式:定时器超时
关联定时器:led_timer
控制动作:
1. 关闭所有LED(GPIO A0/A1/A2 输出低电平)
2. 根据led_index点亮对应LED:
- led_index=0 → GPIO A0输出高电平
- led_index=1 → GPIO A1输出高电平
- led_index=2 → GPIO A2输出高电平
3. led_index自增:
- led_index = (led_index + 1) % 3
4. 重新启动定时器步骤4:语音控制
| 命令词 | 执行动作 |
|---|---|
| "开始流水灯" | led_index=0,启动定时器 |
| "停止流水灯" | 停止定时器,关闭所有LED |
上电/启动 → [A0亮] → 200ms → [A1亮] → 200ms → [A2亮] → 200ms → [A0亮] → 循环...// 定时器超时事件处理
void on_led_timer_expired() {
// 步骤1:关闭所有LED
set_gpio(A0, LOW);
set_gpio(A1, LOW);
set_gpio(A2, LOW);
// 步骤2:根据索引点亮对应LED
switch(led_index) {
case 0: set_gpio(A0, HIGH); break;
case 1: set_gpio(A1, HIGH); break;
case 2: set_gpio(A2, HIGH); break;
}
// 步骤3:更新索引(循环)
led_index = (led_index + 1) % 3;
// 步骤4:重新启动定时器
start_timer("led_timer", 200);
}通过快速切换 GPIO 的高低电平来模拟 PWM 效果:
渐变升亮过程:
t=0: [亮1ms, 灭9ms] → 10%亮度
t=100ms: [亮2ms, 灭8ms] → 20%亮度
t=200ms: [亮3ms, 灭7ms] → 30%亮度
...
t=900ms: [亮10ms, 灭0ms] → 100%亮度方法:使用定时器 + GPIO 延时翻转
创建渐变定时器:
fade_timer100ms(渐变步进时间)定义渐变变量:
fade_level:当前亮度等级(0-10)fade_direction:渐变方向(0=变亮,1=变暗)void on_fade_timer_expired() {
// 根据方向调整亮度等级
if (fade_direction == 0) {
fade_level++;
if (fade_level >= 10) fade_direction = 1;
} else {
fade_level--;
if (fade_level <= 0) fade_direction = 0;
}
// 根据亮度等级设置延时翻转时长
// 亮度越高,高电平保持时间越长
int high_time = fade_level * 10; // 0-100ms
int low_time = 100 - high_time; // 100-0ms
// 输出高电平
set_gpio(LED_PIN, HIGH);
delay_ms(high_time);
// 输出低电平
set_gpio(LED_PIN, LOW);
delay_ms(low_time);
// 继续定时器
start_timer("fade_timer", 100);
}针对用户问题:"通过3路PWM实现流水灯效果"
用户提到"参考了B站上的呼吸灯设置方法但是频率闪烁不对",这通常是因为:
步骤1:配置 3 路 PWM
| PWM通道 | GPIO引脚 | 初始占空比 |
|---|---|---|
| PWM0 | A0 | 0(关闭) |
| PWM1 | A1 | 0(关闭) |
| PWM2 | A2 | 0(关闭) |
步骤2:定义变量
变量名:pwm_index
类型:int
默认值:0
说明:当前激活的PWM通道(0-2)步骤3:配置流水定时器
flow_timer1000ms(每个LED渐变时长)步骤4:定时器超时逻辑
// 流水灯定时器处理
void on_flow_timer_expired() {
// 步骤1:将当前PWM渐变到0(淡出)
set_pwm_duty(pwm_index, 0);
// 步骤2:切换到下一个PWM
pwm_index = (pwm_index + 1) % 3;
// 步骤3:将新PWM渐变到100(淡入)
set_pwm_duty(pwm_index, 100);
// 步骤4:继续定时器
start_timer("flow_timer", 1000);
}SmartPi 模组 LED电路
GPIO A0 (PWM0) → LED1 + 限流电阻 → GND
GPIO A1 (PWM1) → LED2 + 限流电阻 → GND
GPIO A2 (PWM2) → LED3 + 限流电阻 → GND限流电阻计算:
假设:
- Vcc = 3.3V
- LED正向压降 Vf = 2.0V
- LED电流 If = 10mA
电阻值 = (3.3V - 2.0V) / 0.01A = 130Ω
推荐使用:150Ω 或 220Ω问题:"参考了呼吸灯设置方法但是频率闪烁不对"
可能原因:
| 原因 | 解决方法 |
|---|---|
| PWM频率过低 | 将频率提高到50Hz以上 |
| 占空比设置错误 | 使用整数,参考计算公式 |
| 多路PWM时序冲突 | 使用定时器同步控制 |
推荐 PWM 频率:
| 应用场景 | 推荐频率 |
|---|---|
| LED闪烁 | 50-100Hz |
| 呼吸灯效果 | 100-200Hz |
| 舵机控制 | 50Hz |
| 电机调速 | 10-20kHz |
问题:需要多个定时器但模组资源有限
解决方案:
合并相似功能:
使用变量替代部分定时器:
模组定时器限制:
注意:SmartPi 模组的 GPIO 直接驱动 LED 能力有限,建议:
推荐驱动方式:
GPIO → 限流电阻(220Ω-1kΩ) → LED → GND
高亮LED驱动:
GPIO → 三极管/MOSFET → LED → 电源完成流水灯配置后,请使用以下清单验证:
| 需求 | 推荐方案 | 复杂度 |
|---|---|---|
| 简单闪烁 | GPIO延时翻转 | ★☆☆ |
| 亮度调节 | PWM占空比 | ★★☆ |
| 流水跑马 | 定时器+GPIO/PWM | ★★★ |
| 平滑渐变 | 软件模拟PWM | ★★★ |
关键词:流水灯、呼吸灯、PWM、占空比、定时器、GPIO翻转、LED控制、渐变效果、SmartPi、SU-03T、CI-03T
最后更新:2026-02-10 v1.0
数据来源说明: