3. PWM呼吸灯
任务目标
使用ESP32内置的LEDC(LED Control)PWM外设,驱动一个普通LED实现亮度从暗到亮、再从亮到暗的周期性渐变,即呼吸灯效果。通过本案例掌握ESP32模拟输出的核心配置方法:PWM通道分配、频率与分辨率设置、占空比更新方式。
所需硬件与接线
- ESP32开发板(如ESP32-DevKitC)
- LED一个(推荐蓝色或白色,正向压降约2.8~3.2V)
- 限流电阻一个(220Ω~330Ω)
- 面包板与跳线若干
接线方式:将LED阳极(长脚)串联限流电阻后连接至GPIO2,LED阴极(短脚)连接GND。GPIO2为ESP32板载LED常用引脚,也可换用其他空闲GPIO并在代码中同步修改。
完整代码
#include <Arduino.h>
// 引脚与PWM配置
const int ledPin = 2; // LED连接GPIO2
const int pwmChannel = 0; // LEDC通道0
const int pwmFreq = 5000; // PWM频率5kHz(高于人耳可闻范围,避免啸叫)
const int pwmResolution = 8; // 8位分辨率,占空比范围0~255
const int maxBrightness = 255;
const int stepDelay = 10; // 每级亮度间隔10ms,完整周期约5.1秒
void setup() {
// 配置LEDC通道:通道号、频率、分辨率
ledcSetup(pwmChannel, pwmFreq, pwmResolution);
// 将GPIO2绑定到该PWM通道
ledcAttachPin(ledPin, pwmChannel);
}
void loop() {
// 渐亮:占空比从0递增到255
for (int duty = 0; duty <= maxBrightness; duty++) {
ledcWrite(pwmChannel, duty);
delay(stepDelay);
}
// 渐暗:占空比从255递减到0
for (int duty = maxBrightness; duty >= 0; duty--) {
ledcWrite(pwmChannel, duty);
delay(stepDelay);
}
}
编译与烧录
- 在Arduino IDE中,选择开发板为“ESP32 Dev Module”(或对应具体型号)。
- 确认USB驱动已安装,并在“工具→端口”中选择正确的串口号。
- 将上述代码粘贴到编辑器,点击“上传”按钮完成编译与烧录。
验证方法
烧录成功后,观察LED亮度变化:应看到LED从完全熄灭状态平滑地逐渐变亮至最亮,再平滑地逐渐变暗至熄灭,如此循环往复。单个完整周期(亮→暗→亮)约5.1秒。若LED亮度跳变明显而非平滑过渡,可检查PWM频率是否设置过低(建议不低于1kHz)或分辨率是否过小(建议8位以上)。若LED完全不亮,请检查GPIO2接线极性及限流电阻是否接在阳极一侧。
关键说明
ESP32的LEDC外设支持16个独立通道(0~15),可自由分配给任意GPIO。本案例使用8位分辨率,占空比调节步长为1/256,肉眼观察到的亮度变化已足够平滑。若需更细腻的渐变效果,可将分辨率提高至10位或12位,同时将maxBrightness改为对应最大值(1023或4095),并相应减小stepDelay以保持周期时长不变。注意提高分辨率后,PWM频率上限会相应降低(ESP32的PWM时钟源频率固定为80MHz,分辨率每增加1位,最高频率减半)。