Example 11: PWM breathing light
About 3 min
Example 11: PWM breathing light
Synchronized Device Documentation
This page corresponds to the synchronized Chinese source. Commands, JSON examples, API paths, field names, and screenshots are kept aligned with the Chinese device-side source documentation.
What This Page Covers
- Overview
- Wiring
- JSON Configuration Example
- PeriphExec Linkage
- Notes
Source Reference
The detailed operational source is preserved below so implementation details stay exact while the English navigation, titles, and reading path remain available.
示例11:PWM呼吸灯
实验概述
通过 PWM(脉宽调制)输出控制 LED 亮度,实现从暗到亮再从亮到暗的呼吸灯效果。PWM 通过调节占空比来模拟模拟电压输出。
硬件接线
| 开发板标识 | GPIO引脚 | 连接设备 |
|---|---|---|
| D1 | GPIO15 | LED(PWM调光) |
ESP32 拥有 16 个 PWM 通道,几乎所有 GPIO 都可输出 PWM 信号。
JSON 配置示例
{
"peripherals": [
{
"id": "pwm_breath",
"name": "呼吸灯-PWM",
"type": 17,
"enabled": false,
"pins": [15],
"params": {
"pwmChannel": 0,
"pwmFrequency": 5000,
"pwmResolution": 8,
"defaultDuty": 0
}
}
]
}参数说明
| 参数 | 说明 | 推荐值 |
|---|---|---|
| pwmChannel | PWM通道号(0-15) | 0 |
| pwmFrequency | 频率(Hz),高频无闪烁 | 5000 |
| pwmResolution | 分辨率(位),8位=0~255 | 8 |
| defaultDuty | 初始占空比 | 0 |
外设执行联动
场景1:远程调节亮度(平台触发)
功能:通过云平台下发指令(0-255)控制LED亮度
Web界面配置步骤
步骤1:创建规则
- 点击左侧菜单 外设配置 → 切换到 外设执行管理 标签
- 点击 新增规则 按钮
- 填写基础配置:
- 规则名称:
远程调节亮度 - 上报数据:✅ 启用
- 启用:✅ 启用
- 规则名称:
步骤2:配置触发器
点击 添加触发 按钮
填写触发器配置:
字段 填写内容 说明 触发类型 选择 平台触发 接收云平台指令 操作符 选择 设置模式 接收数据作为动作参数
步骤3:配置动作
点击 添加动作 按钮
填写:
- 动作类型:选择 设置PWM
- 目标外设:选择
pwm_breath
点击 保存 按钮
测试方法:
通过云平台发送:
0→ 最亮(共阳LED)128→ 50%亮度255→ 最暗(熄灭)
场景2:自动呼吸效果(定时触发+脚本)
功能:使用脚本实现LED自动呼吸效果(渐亮→渐暗循环)
Web界面配置步骤
步骤1:创建规则
- 点击 新增规则
- 填写基础配置:
- 规则名称:
LED呼吸灯 - 上报数据:✅ 启用
- 启用:✅ 启用
- 规则名称:
步骤2:配置触发器
点击 添加触发 按钮
填写触发器配置:
字段 填写内容 说明 触发类型 选择 定时触发 定时执行脚本 定时模式 选择 固定间隔 快速刷新 间隔时间 2020ms(呼吸效果平滑)
步骤3:配置动作(脚本)
点击 添加动作 按钮
填写:
- 动作类型:选择 命令脚本
- 动作参数:
var d=getVar('breath_duty',0); var dir=getVar('breath_dir',1); d+=dir*5; if(d>=255){d=255;dir=-1;} if(d<=0){d=0;dir=1;} pwmWrite('pwm_breath',d); setVar('breath_duty',d); setVar('breath_dir',dir);点击 保存 按钮
脚本说明:
| 代码 | 说明 |
|---|---|
getVar('breath_duty',0) | 获取当前占空比,默认0 |
getVar('breath_dir',1) | 获取方向,1=渐亮,-1=渐暗 |
d+=dir*5 | 每次变化5级 |
pwmWrite('pwm_breath',d) | 设置PWM占空比 |
setVar(...) | 保存变量供下次使用 |
⚠️ 注意:脚本每20ms执行一次,占用系统资源,不建议同时运行多个脚本
注意事项
- 频率选择:LED 调光建议 1kHz 以上避免闪烁,5kHz 是常用值
- 分辨率:8位(256级)足够LED调光,12位(4096级)用于精细控制
- 通道冲突:不同引脚可以共享同一 PWM 通道(同频率同占空比)
- 低电平点亮:普中开发板LED共阳,duty=0最亮,duty=255最暗
- 多路PWM:ESP32 支持同时输出 16 路独立 PWM
