4. RGB LED颜色控制
任务目标
使用ESP32的PWM功能驱动共阴RGB LED,通过调节红、绿、蓝三通道的占空比实现颜色混合,并演示平滑渐变效果。本案例聚焦于PWM信号生成与颜色控制逻辑,不涉及Wi-Fi或蓝牙功能。
所需硬件与接线
- ESP32开发板(如ESP32-DevKitC)
- 共阴RGB LED(红、绿、蓝三个引脚)
- 3个220Ω限流电阻
- 面包板与跳线
| RGB LED引脚 | ESP32 GPIO |
|---|---|
| 红 (R) | GPIO 25 |
| 绿 (G) | GPIO 26 |
| 蓝 (B) | GPIO 27 |
| 阴极 (GND) | GND |
实现原理
ESP32的LEDC(LED Control)外设可生成硬件PWM信号。本案例将三个通道分别绑定到RGB引脚,通过设置占空比(0~255)控制各通道亮度。颜色混合基于RGB加色模型:例如红色(255,0,0)、白色(255,255,255)。渐变效果通过循环递增/递减各通道值实现。
完整代码
#include <Arduino.h>
// PWM配置
const int ledR = 25;
const int ledG = 26;
const int ledB = 27;
const int freq = 5000; // PWM频率 5kHz
const int resolution = 8; // 8位分辨率 (0-255)
const int channelR = 0;
const int channelG = 1;
const int channelB = 2;
void setup() {
// 配置LEDC通道
ledcSetup(channelR, freq, resolution);
ledcSetup(channelG, freq, resolution);
ledcSetup(channelB, freq, resolution);
// 绑定GPIO到通道
ledcAttachPin(ledR, channelR);
ledcAttachPin(ledG, channelG);
ledcAttachPin(ledB, channelB);
}
void setColor(int r, int g, int b) {
ledcWrite(channelR, r);
ledcWrite(channelG, g);
ledcWrite(channelB, b);
}
void loop() {
// 演示1:固定颜色切换
setColor(255, 0, 0); // 红色
delay(1000);
setColor(0, 255, 0); // 绿色
delay(1000);
setColor(0, 0, 255); // 蓝色
delay(1000);
setColor(255, 255, 0); // 黄色
delay(1000);
setColor(0, 255, 255); // 青色
delay(1000);
setColor(255, 0, 255); // 品红
delay(1000);
setColor(255, 255, 255); // 白色
delay(1000);
// 演示2:平滑渐变(红→绿→蓝→红)
for (int i = 0; i < 255; i++) {
setColor(255 - i, i, 0); // 红→绿
delay(10);
}
for (int i = 0; i < 255; i++) {
setColor(0, 255 - i, i); // 绿→蓝
delay(10);
}
for (int i = 0; i < 255; i++) {
setColor(i, 0, 255 - i); // 蓝→红
delay(10);
}
}
编译与烧录
- 安装Arduino IDE并添加ESP32开发板支持(开发板管理器搜索“esp32”安装)。
- 选择开发板:
工具 → 开发板 → ESP32 Dev Module。 - 选择正确的串口端口。
- 将上述代码粘贴到IDE,点击上传。
验证方法
烧录成功后,观察RGB LED行为:
- 阶段1(固定颜色):LED应依次显示红、绿、蓝、黄、青、品红、白,每种颜色持续1秒。若颜色顺序或亮度异常,检查GPIO接线是否正确、限流电阻是否接入。
- 阶段2(渐变):LED应从红色平滑过渡到绿色,再到蓝色,最后回到红色,循环进行。若渐变出现跳变,检查PWM频率是否设置过低(建议保持5kHz以上)。
通过条件:两种演示均按预期执行,且颜色过渡平滑无闪烁,即判定案例通过。
常见问题
- LED不亮:确认共阴引脚已接GND;检查GPIO编号是否与代码一致。
- 颜色偏色:不同批次LED亮度差异较大,可调整各通道的占空比上限(如红色改为200)来平衡视觉亮度。
- 渐变闪烁:降低delay值会加快过渡但可能引起视觉闪烁,建议保持10ms以上。
上图展示了GPIO25/26/27通过限流电阻连接RGB LED三个阳极的接线方式。共阴引脚直接接GND,无需串联电阻。