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);
  }
}

编译与烧录

  1. 安装Arduino IDE并添加ESP32开发板支持(开发板管理器搜索“esp32”安装)。
  2. 选择开发板:工具 → 开发板 → ESP32 Dev Module。
  3. 选择正确的串口端口。
  4. 将上述代码粘贴到IDE,点击上传。

验证方法

烧录成功后,观察RGB LED行为:

  • 阶段1(固定颜色):LED应依次显示红、绿、蓝、黄、青、品红、白,每种颜色持续1秒。若颜色顺序或亮度异常,检查GPIO接线是否正确、限流电阻是否接入。
  • 阶段2(渐变):LED应从红色平滑过渡到绿色,再到蓝色,最后回到红色,循环进行。若渐变出现跳变,检查PWM频率是否设置过低(建议保持5kHz以上)。

通过条件:两种演示均按预期执行,且颜色过渡平滑无闪烁,即判定案例通过。

常见问题

  • LED不亮:确认共阴引脚已接GND;检查GPIO编号是否与代码一致。
  • 颜色偏色:不同批次LED亮度差异较大,可调整各通道的占空比上限(如红色改为200)来平衡视觉亮度。
  • 渐变闪烁:降低delay值会加快过渡但可能引起视觉闪烁,建议保持10ms以上。
ESP32 GPIO25 GPIO26 GPIO27 220Ω 220Ω 220Ω RGB LED (共阴) GND R G B

上图展示了GPIO25/26/27通过限流电阻连接RGB LED三个阳极的接线方式。共阴引脚直接接GND,无需串联电阻。