ESP32 教程 34/55 - 使用RGB LED和旋钮实现颜色渐变 | SunFounder的ESP32物联网学习套件
在本教程中,我们将使用RGB LED创建一个颜色渐变效果,该效果会根据电位器(旋钮)的位置进行调整。该项目使用ESP32微控制器,它提供内置的Wi-Fi和蓝牙功能,使其成为物联网项目的多功能选择。通过旋转电位器,我们可以在不同颜色之间平滑过渡,既展示了RGB LED的功能,也展示了从电位器读取模拟值的能力。

该项目非常适合学习PWM(脉冲宽度调制)以及如何使用微控制器控制模拟设备。在本教程中,我们将讨论必要的硬件组件、接线说明,并提供代码片段以帮助您实现该项目。如需更直观的解释,请务必观看相关视频(视频中02:15处)。
硬件说明
该项目中使用的主要组件包括ESP32微控制器、RGB LED和电位器。ESP32是一款功能强大的微控制器,可以处理各种任务,包括无线通信,使其适用于物联网应用。RGB LED由三个独立的LED(红色、绿色和蓝色)组成,可以混合产生各种颜色。电位器充当可调电阻,根据其位置提供可变的电压输出。
RGB LED可以以两种配置连接:共阳极或共阴极。在本项目中,我们将使用共阳极配置,即所有阳极连接在一起并接到正电压,这样我们可以使用PWM单独控制每个LED的亮度。电位器将连接到ESP32上的模拟输入,以读取其位置并相应地调整RGB值。
数据手册详情
| 制造商 | SunFounder |
|---|---|
| 零件编号 | RGB LED |
| 逻辑/IO电压 | 3.3 V |
| 电源电压 | 5 V |
| 输出电流(每通道) | 20 mA |
| 峰值电流(每通道) | 30 mA |
| PWM频率建议 | 5 kHz |
| 输入逻辑阈值 | 0.3 V(低)/ 2.7 V(高) |
| 压降 / RDS(on) / 饱和 | 1.8 V(典型值) |
| 热限制 | 工作温度:-40°C至+85°C |
| 封装 | 通孔 |
| 备注 / 变体 | 共阳极配置 |
- 为每个LED通道使用220欧姆电阻以限制电流。
- 确保为RGB LED提供正确的电源电压(5V)。
- 将共阳极连接到正电压电源。
- 使用PWM控制每个LED颜色的亮度。
- 注意电位器的连接,避免浮动输入。
- 上传代码前,确保ESP32已正确供电。
接线说明
要将RGB LED和电位器连接到ESP32,首先将RGB LED的共阳极引脚连接到ESP32上的3.3V电源引脚。RGB LED的红色、绿色和蓝色引脚将分别连接到引脚27、26和25。确保在每个LED颜色引脚上串联一个220欧姆电阻以限制电流并保护LED。
接下来,将电位器连接到ESP32,将左侧引脚连接到3.3V电源引脚,右侧引脚连接到地线,中间引脚连接到ESP32上的14。这种配置允许ESP32读取电位器的模拟电压,该电压将用于根据其位置调整RGB LED的颜色。
代码示例与讲解
在setup函数中,我们定义RGB LED和电位器的引脚,并初始化PWM设置。以下代码片段展示了我们如何设置RGB LED引脚:
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;
void setup() {
ledcAttach(redPin, freq, resolution);
ledcAttach(greenPin, freq, resolution);
ledcAttach(bluePin, freq, resolution);
}
在此片段中,我们定义了红色、绿色和蓝色LED的引脚,并将它们连接到具有定义频率和分辨率的PWM通道。
loop函数读取电位器的值并将其转换为色调值,然后用于确定RGB值。以下摘录演示了此过程:
void loop() {
int knobValue = analogRead(KNOB_PIN);
float hueValue = (float)knobValue / 4095.0;
int hue = (int)(hueValue * 360);
int red, green, blue;
HUEtoRGB(hue, &red, &green, &blue);
setColor(red, green, blue);
}此代码读取电位器的模拟值,将其归一化,并计算相应的色调。然后调用HUEtoRGB函数将色调转换为RGB值,这些值被传递给setColor函数以更新LED。
演示/预期效果
完成接线并上传代码后,您应该能够转动电位器来平滑地改变RGB LED的颜色。当您旋转旋钮时,LED将根据旋钮位置计算出的色调值,在各种颜色之间过渡。如果LED不亮或行为异常,请检查接线,并确保电位器连接正确(视频中10:45处)。
视频时间戳
- 00:00 开始
- 2:11 项目介绍
- 4:31 RGB LED
- 8:18 RGB颜色
- 12:18 接线说明
- 17:59 Arduino代码说明
- 24:12 在Arduino IDE中选择ESP32开发板和COM端口
- 25:54 演示
/*
* // 定义 RGB LED 引脚
*/
const int redPin = 27;
const int greenPin = 26;
const int bluePin = 25;
// 定义PWM频率和分辨率
const int freq = 5000;
const int resolution = 8;
// 定义旋钮的销子
#define KNOB_PIN 14
void setup() {
Serial.begin(115200);
ledcAttach(redPin, freq, resolution);
ledcAttach(greenPin, freq, resolution);
ledcAttach(bluePin, freq, resolution);
}
void loop() {
// 读取旋钮的值
int knobValue = analogRead(KNOB_PIN);
Serial.println(knobValue);
// 将旋钮值归一化到0-1的范围内。
float hueValue = (float)knobValue / 4095.0;
// 将归一化值转换为色相值(0-360)
int hue = (int)(hueValue * 360);
// 将HUE值转换为RGB值
int red, green, blue;
HUEtoRGB(hue, &red, &green, &blue);
// 用新的颜色值更新RGB LED。
setColor(red, green, blue);
}
void setColor(int red, int green, int blue) {
ledcWrite(redPin, red);
ledcWrite(greenPin, green);
ledcWrite(bluePin, blue);
}
// 将HUE值转换为RGB值
void HUEtoRGB(int hue, int* red, int* green, int* blue) {
float h = (float)hue / 60.0;
float c = 1.0;
float x = c * (1.0 - fabs(fmod(h, 2.0) - 1.0));
float r, g, b;
if (h < 1.0) {
r = c;
g = x;
b = 0;
} else if (h < 2.0) {
r = x;
g = c;
b = 0;
} else if (h < 3.0) {
r = 0;
g = c;
b = x;
} else if (h < 4.0) {
r = 0;
g = x;
b = c;
} else if (h < 5.0) {
r = x;
g = 0;
b = c;
} else {
r = c;
g = 0;
b = x;
}
float m = 1.0 - c;
*red = (int)((r + m) * 255);
*green = (int)((g + m) * 255);
*blue = (int)((b + m) * 255);
}
Common Course Links
Common Course Files
资源与参考
-
文档ESP32教程 34/55 - SunFounder颜色渐变文档页面docs.sunfounder.com
文件📁
没有可用的文件。