ESP32-S3 IDF框架 控制 WS2812 灯条:实现多种灯效

ESP32-S3 IDF框架 控制 WS2812 灯条:实现多种灯效

在这篇博客中,我们将介绍如何使用 ESP32-S3 开发板和 RMT 驱动程序来控制 WS2812 LED 灯条。我们会展示如何编写一个 ws2812_control.c 文件,该文件包含多种 LED 控制效果,包括常亮、呼吸、渐入、闪烁和彩虹效果。

环境准备

此项目我们会使用以下工具和库:

  • RMT (Remote Control):ESP32 的硬件外设,用于生成准确的时序信号来控制 WS2812。
  • LED Strip 库:ESP-IDF 中用于操作 LED 灯条的库。

代码实现

ws2812_control.h

头文件定义了 LED 颜色的结构体 led_color_t 和 LED 效果的枚举类型 led_effect_t,并声明了各种 LED 控制函数。

c 复制代码
#ifndef WS2812_CONTROL_H
#define WS2812_CONTROL_H

#include <stdint.h>
#include "led_strip.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef struct {
    uint32_t red;
    uint32_t green;
    uint32_t blue;
} led_color_t;

typedef enum {
    LED_EFFECT_OFF,
    LED_EFFECT_ON,
    LED_EFFECT_BREATH,
    LED_EFFECT_FADE_IN,
    LED_EFFECT_BLINK_SLOW,
    LED_EFFECT_BLINK_FAST,
    LED_EFFECT_RAINBOW
} led_effect_t;

void ws2812_control_task(void *arg);
void led_set_on(led_strip_t *strip, led_color_t color);
void led_set_off(led_strip_t *strip);
void led_set_breath(led_strip_t *strip, led_color_t color);
void led_set_fade_in(led_strip_t *strip, led_color_t color);
void led_set_blink_slow(led_strip_t *strip, led_color_t color);
void led_set_blink_fast(led_strip_t *strip, led_color_t color);
void led_set_rainbow(led_strip_t *strip);

#ifdef __cplusplus
}
#endif

#endif // WS2812_CONTROL_H

ws2812_control.c

.c文件中实现了所有的 LED 效果函数。辅助函数 led_strip_hsv2rgb()是乐鑫官方的代码,用于将 HSV 颜色空间转换为 RGB 颜色空间,这是因为 WS2812 灯条使用 RGB 颜色模式。

核心功能函数
  • led_set_on():设置 LED 常亮。
  • led_set_off():关闭 LED。
  • led_set_breath():实现呼吸效果。
  • led_set_fade_in():实现缓缓亮起的效果。
  • led_set_blink_slow():实现慢速闪烁。
  • led_set_blink_fast():实现快速闪烁。
  • led_set_rainbow():实现彩虹效果。
任务函数

ws2812_control_task() 是WS2812任务函数,负责根据不同的 LED 效果类型调用相应的控制函数。

c 复制代码
void ws2812_control_task(void* arg) {
    rmt_config_t config = RMT_DEFAULT_CONFIG_TX(CONFIG_EXAMPLE_RMT_TX_GPIO, RMT_TX_CHANNEL);
    config.clk_div = 2;

    ESP_ERROR_CHECK(rmt_config(&config));
    ESP_ERROR_CHECK(rmt_driver_install(config.channel, 0, 0));

    led_strip_config_t strip_config = LED_STRIP_DEFAULT_CONFIG(CONFIG_EXAMPLE_STRIP_LED_NUMBER, (led_strip_dev_t)config.channel);
    led_strip_t *strip = led_strip_new_rmt_ws2812(&strip_config);
    if (!strip) {
        ESP_LOGE(TAG, "install WS2812 driver failed");
    }
    ESP_ERROR_CHECK(strip->clear(strip, 100));

    led_color_t color = {255, 0, 0}; // 设置颜色为红色
    led_effect_t effect = LED_EFFECT_BREATH; // 选择呼吸效果

    while (true) {
        switch (effect) {
            case LED_EFFECT_ON:
                led_set_on(strip, color);
                break;
            case LED_EFFECT_OFF:
                led_set_off(strip);
                break;
            case LED_EFFECT_BREATH:
                led_set_breath(strip, color);
                break;
            case LED_EFFECT_FADE_IN:
                led_set_fade_in(strip, color);
                break;
            case LED_EFFECT_BLINK_SLOW:
                led_set_blink_slow(strip, color);
                break;
            case LED_EFFECT_BLINK_FAST:
                led_set_blink_fast(strip, color);
                break;
            case LED_EFFECT_RAINBOW:
                led_set_rainbow(strip);
                break;
        }
        vTaskDelay(pdMS_TO_TICKS(10));
    }
}

完整项目代码拉取

https://github.com/1589326497/ws2812_control.git

相关推荐
乄夜16 分钟前
嵌入式面试高频(5)!!!C++语言(嵌入式八股文,嵌入式面经)
c语言·c++·单片机·嵌入式硬件·物联网·面试·职场和发展
程序员的世界你不懂17 分钟前
Appium+python自动化(十)- 元素定位
python·appium·自动化
CryptoPP1 小时前
使用WebSocket实时获取印度股票数据源(无调用次数限制)实战
后端·python·websocket·网络协议·区块链
树叶@1 小时前
Python数据分析7
开发语言·python
老胖闲聊2 小时前
Python Rio 【图像处理】库简介
开发语言·图像处理·python
c7_ln2 小时前
STM32 低功耗设计全攻略:PWR 模块原理 + 睡眠 / 停止 / 待机模式实战(串口 + 红外 + RTC 应用全解析)
stm32·单片机·实时音视频·江协科技
码界奇点2 小时前
Python Flask文件处理与异常处理实战指南
开发语言·python·自然语言处理·flask·python3.11
浠寒AI2 小时前
智能体模式篇(上)- 深入 ReAct:LangGraph构建能自主思考与行动的 AI
人工智能·python
待什么青丝3 小时前
【TMS570LC4357】之相关驱动开发学习记录2
c语言·arm开发·驱动开发·单片机·学习
小柯博客3 小时前
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
c语言·stm32·单片机·嵌入式硬件·物联网