SDU棋界精灵——ESP32点亮一颗LED

ESP32 点亮 LED 的实现主要通过 SingleLed 类完成,该类用于控制单个 WS2812 类型的 LED(通常为板载 LED)。实现了 ESP32 对单颗 LED 的控制,支持颜色设置、状态驱动点亮及闪烁等功能。 类方法

 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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信