ESP32 点亮 LED 的实现主要通过 SingleLed
类完成,该类用于控制单个 WS2812 类型的 LED(通常为板载 LED)。实现了 ESP32 对单颗 LED 的控制,支持颜色设置、状态驱动点亮及闪烁等功能。
类 / 方法 | 功能描述 |
---|---|
SingleLed |
封装单颗 WS2812 LED 的控制逻辑,支持颜色设置、开关、闪烁等功能。 |
TurnOn() |
点亮 LED,根据 r_ , g_ , b_ 的值设置颜色并刷新显示。 |
SetColor(r, g, b) |
设置 LED 的 RGB 颜色值(0-255)。 |
led_strip_set_pixel |
底层函数,设置指定 LED 像素的颜色(用于 WS2812 等灯带驱动)。 |
led_strip_refresh |
刷新 LED 显示,使颜色设置生效。 |
一、LED 硬件配置与驱动初始化
LED 硬件配置与驱动初始化的核心是根据 LED 类型选择合适的外设(RMT 或 LEDC),并正确配置引脚、时序、颜色格式等参数。SingleLed
和 GpioLed
类分别封装了数字灯带和普通 LED 的驱动逻辑,通过继承 Led
基类实现统一的状态控制接口,确保硬件无关性和代码可复用性。
1.WS2812 类型 LED(数字灯带,如板载 RGB 灯)
(1)硬件配置
- GPIO 选择:使用
BUILTIN_LED_GPIO
(通常为 GPIO5 或自定义引脚)作为数据引脚,仅需一根 GPIO 即可控制单颗或多颗 WS2812 灯珠。 - 电路连接:
- VCC:连接 5V 或 3.3V 电源(根据 LED 型号)。
- GND:接地。
- DATA:连接 ESP32 的指定 GPIO(如
DISPLAY_MOSI_PIN
或自定义引脚)。
(2)驱动初始化(SingleLed
类)
核心通过 RMT(Remote Control)外设 驱动 WS2812,利用 led_strip
库实现:
// single_led 构造函数
SingleLed::SingleLed(gpio_num_t gpio) {
assert(gpio != GPIO_NUM_NC);
// 1. LED 灯带基础配置
led_strip_config_t strip_config = {};
strip_config.strip_gpio_num = gpio; // 数据引脚 GPIO
strip_config.max_leds = 1; // 单颗 LED
strip_config.led_pixel_format = LED_PIXEL_FORMAT_GRB; // GRB 颜色格式(WS2812 常用)
strip_config.led_model = LED_MODEL_WS2812; // 指定 LED 型号
// 2. RMT 驱动配置(控制信号时序)
led_strip_rmt_config_t rmt_config = {};
rmt_config.resolution_hz = 10 * 1000 * 1000; // 10MHz 分辨率,确保信号精度
// 3. 创建 LED 设备
ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip_));
led_strip_clear(led_strip_); // 初始化时关闭 LED
// 4. 初始化闪烁定时器(可选,用于状态提示)
esp_timer_create_args_t blink_timer_args = {
.callback = [](void *arg) { static_cast<SingleLed*>(arg)->OnBlinkTimer(); },
.arg = this,
.dispatch_method = ESP_TIMER_TASK,
.name = "blink_timer",
};
ESP_ERROR_CHECK(esp_timer_create(&blink_timer_args, &blink_timer_));
}
LED_PIXEL_FORMAT_GRB
:WS2812 通常使用 GRB 顺序,需与实际硬件一致。LED_MODEL_WS2812
:指定驱动模型,确保时序匹配。rmt_config.resolution_hz
:高分辨率保证信号准确,避免颜色显示异常。
2.普通 GPIO 控制 LED(通过 PWM 调节亮度)
(1)硬件配置
- GPIO 选择:任意 GPIO(如
DISPLAY_BACKLIGHT_PIN
),需连接一个限流电阻(约 220Ω)到 LED 阳极,阴极接地。 - 电路连接:
- VCC:连接 3.3V 电源。
- GND:接地。
- GPIO:通过 PWM 输出控制亮度(需支持 LEDC 外设)。
(2)驱动初始化(GpioLed
类)
使用 LEDC(LED 控制器)外设 实现 PWM 控制,支持亮度调节和闪烁:
// gpio_led 构造函数
GpioLed::GpioLed(gpio_num_t gpio, int output_invert) {
// 1. 配置 LEDC 定时器
ledc_timer_config_t timer_config = {
.speed_mode = LEDC_LOW_SPEED_MODE, // 低速模式(适合背光等非高频场景)
.duty_resolution = LEDC_TIMER_10_BIT, // 10 位分辨率(0-1023 亮度等级)
.timer_num = LEDC_TIMER_0, // 选择定时器 0
.freq_hz = 20000, // 20kHz 频率(避免人眼可见闪烁)
.clk_cfg = LEDC_AUTO_CLK, // 自动选择时钟源
};
ESP_ERROR_CHECK(ledc_timer_config(&timer_config));
// 2. 配置 LEDC 通道
ledc_channel_config_t channel_config = {
.gpio_num = gpio, // LED 连接的 GPIO
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_0, // 通道 0
.intr_type = LEDC_INTR_DISABLE, // 禁用中断
.timer_sel = LEDC_TIMER_0,
.duty = 0, // 初始占空比(0% 关闭)
.hpoint = 0,
.flags = {
.output_invert = output_invert // 是否反转输出(根据电路设计)
}
};
ESP_ERROR_CHECK(ledc_channel_config(&channel_config));
ledc_initialized_ = true;
duty_ = 0;
}
duty_resolution
:分辨率越高,亮度调节越细腻(10 位对应 1024 级)。freq_hz
:20kHz 以上避免人眼感知到闪烁,适合背光等场景。output_invert
:若 LED 阳极接 GPIO,阴极接地,通常无需反转;反之需设置为1
。
3.核心驱动差异对比
特性 | WS2812(数字灯带,SingleLed ) |
普通 LED(PWM 控制,GpioLed ) |
---|---|---|
控制方式 | 单总线数字信号(RMT 驱动) | PWM 模拟电压(LEDC 驱动) |
颜色支持 | 真彩色(RGB 独立控制)< |
发布者:admin,转转请注明出处:http://www.yc00.com/web/1754949233a5219673.html
评论列表(0条)