搜索代码

ESP32 教程 34/55 - 使用RGB LED和旋钮实现颜色渐变 | SunFounder的ESP32物联网学习套件

ESP32 教程 34/55 - 使用RGB LED和旋钮实现颜色渐变 | SunFounder的ESP32物联网学习套件

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

ESO32-34_-Color-Gradient-main

该项目非常适合学习PWM(脉冲宽度调制)以及如何使用微控制器控制模拟设备。在本教程中,我们将讨论必要的硬件组件、接线说明,并提供代码片段以帮助您实现该项目。如需更直观的解释,请务必观看相关视频(视频中02:15处)。

硬件说明

ESO32-34_-Color-Gradient-schematic

该项目中使用的主要组件包括ESP32微控制器、RGB LED和电位器。ESP32是一款功能强大的微控制器,可以处理各种任务,包括无线通信,使其适用于物联网应用。RGB LED由三个独立的LED(红色、绿色和蓝色)组成,可以混合产生各种颜色。电位器充当可调电阻,根据其位置提供可变的电压输出。

ESP32_rgb_pin

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的红色、绿色和蓝色引脚将分别连接到引脚272625。确保在每个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 演示

图像

ESP32_rgb_pin
ESP32_rgb_pin
ESP32_RGB_led_wires
ESP32_RGB_led_wires
potentiometer
potentiometer
ESO32-34_-Color-Gradient-wiring
ESO32-34_-Color-Gradient-wiring
ESO32-34_-Color-Gradient-schematic
ESO32-34_-Color-Gradient-schematic
ESO32-34_-Color-Gradient-main
ESO32-34_-Color-Gradient-main
835-ESP32 Tutorial 34/55- Arduino code for color gradient
语言: C++
/*
 * // 定义 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);
}

资源与参考

文件📁

没有可用的文件。