readme

LED Strip Driver

Component Registry

This driver is designed for addressable LEDs like WS2812, where each LED is controlled by a single data line.

Backend Controllers

The RMT Peripheral

This is the most economical way to drive the LEDs because it only consumes one RMT channel, leaving other channels free to use. However, the memory usage increases dramatically with the number of LEDs. If the RMT hardware can't be assist by DMA, the driver will going into interrupt very frequently, thus result in a high CPU usage. What's worse, if the RMT interrupt is delayed or not serviced in time (e.g. if Wi-Fi interrupt happens on the same CPU core), the RMT transaction will be corrupted and the LEDs will display incorrect colors. If you want to use RMT to drive a large number of LEDs, you'd better to enable the DMA feature if possible [^1].

Allocate LED Strip Object with RMT Backend

C

#define BLINK_GPIO 0

/// LED strip common configuration
led_strip_config_t strip_config = {
    .strip_gpio_num = BLINK_GPIO,  // The GPIO that connected to the LED strip's data line
    .max_leds = 1,                 // The number of LEDs in the strip,
    .led_model = LED_MODEL_WS2812, // LED strip model, it determines the bit timing
    .color_component_format = LED_STRIP_COLOR_COMPONENT_FMT_GRB, // The color component format is G-R-B
    .flags = {
        .invert_out = false, // don't invert the output signal
    }
};

/// RMT backend specific configuration
led_strip_rmt_config_t rmt_config = {
    .clk_src = RMT_CLK_SRC_DEFAULT,    // different clock source can lead to different power consumption
    .resolution_hz = 10 * 1000 * 1000, // RMT counter clock frequency: 10MHz
    .mem_block_symbols = 64,           // the memory size of each RMT channel, in words (4 bytes)
    .flags = {
        .with_dma = false, // DMA feature is available on chips like ESP32-S3/P4
    }
};

/// Create the LED strip object
led_strip_handle_t led_strip;
ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip));

You can create multiple LED strip objects with different GPIOs and pixel numbers. The backend driver will automatically allocate the RMT channel for you if there is more available.

The SPI Peripheral

SPI peripheral can also be used to generate the timing required by the LED strip. However this backend is not as economical as the RMT one, because it will take up the whole bus, unlike the RMT just takes one channel. You CANT connect other devices to the same SPI bus if it's been used by the led_strip, because the led_strip doesn't have the concept of "Chip Select".

Please note, the SPI backend has a dependency of ESP-IDF >= 5.1

Allocate LED Strip Object with SPI Backend

C

#define BLINK_GPIO 0

/// LED strip common configuration
led_strip_config_t strip_config = {
    .strip_gpio_num = BLINK_GPIO,  // The GPIO that connected to the LED strip's data line
    .max_leds = 1,                 // The number of LEDs in the strip,
    .led_model = LED_MODEL_WS2812, // LED strip model, it determines the bit timing
    .color_component_format = LED_STRIP_COLOR_COMPONENT_FMT_GRB, // The color component format is G-R-B
    .flags = {
        .invert_out = false, // don't invert the output signal
    }
};

/// SPI backend specific configuration
led_strip_spi_config_t spi_config = {
    .clk_src = SPI_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption
    .spi_bus = SPI2_HOST,           // SPI bus ID
    .flags = {
        .with_dma = true, // Using DMA can improve performance and help drive more LEDs
    }
};

/// Create the LED strip object
led_strip_handle_t led_strip;
ESP_ERROR_CHECK(led_strip_new_spi_device(&strip_config, &spi_config, &led_strip));

The number of LED strip objects can be created depends on how many free SPI buses are free to use in your project.

FAQ

  • Which led_strip backend should I choose?

    • It depends on your application requirement and target chip's ability.

      Mermaid

  • How to set the brightness of the LED strip?

    • You can tune the brightness by scaling the value of each R-G-B element with a same factor. But pay attention to the overflow of the value.

[^1]: The RMT DMA feature is not available on all ESP chips. Please check the data sheet before using it.

api

API Reference

Header files

File include/led_strip.h

Functions

Type Name
esp_err_t led_strip_clear (led_strip_handle_t strip)
Clear LED strip (turn off all LEDs)
esp_err_t led_strip_del (led_strip_handle_t strip)
Free LED strip resources.
esp_err_t led_strip_refresh (led_strip_handle_t strip)
Refresh memory colors to LEDs.
esp_err_t led_strip_set_pixel (led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue)
Set RGB for a specific pixel.
esp_err_t led_strip_set_pixel_hsv (led_strip_handle_t strip, uint32_t index, uint16_t hue, uint8_t saturation, uint8_t value)
Set HSV for a specific pixel.
esp_err_t led_strip_set_pixel_rgbw (led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white)
Set RGBW for a specific pixel.

Functions Documentation

function led_strip_clear

Clear LED strip (turn off all LEDs)

C

esp_err_t led_strip_clear (
    led_strip_handle_t strip
)

Parameters:

  • strip LED strip

Returns:

  • ESP_OK: Clear LEDs successfully
  • ESP_FAIL: Clear LEDs failed because some other error occurred

function led_strip_del

Free LED strip resources.

C

esp_err_t led_strip_del (
    led_strip_handle_t strip
)

Parameters:

  • strip LED strip

Returns:

  • ESP_OK: Free resources successfully
  • ESP_FAIL: Free resources failed because error occurred

function led_strip_refresh

Refresh memory colors to LEDs.

C

esp_err_t led_strip_refresh (
    led_strip_handle_t strip
)

Parameters:

  • strip LED strip

Returns:

  • ESP_OK: Refresh successfully
  • ESP_FAIL: Refresh failed because some other error occurred

Note:

: After updating the LED colors in the memory, a following invocation of this API is needed to flush colors to strip.

function led_strip_set_pixel

Set RGB for a specific pixel.

C

esp_err_t led_strip_set_pixel (
    led_strip_handle_t strip,
    uint32_t index,
    uint32_t red,
    uint32_t green,
    uint32_t blue
)

Parameters:

  • strip LED strip
  • index index of pixel to set
  • red red part of color
  • green green part of color
  • blue blue part of color

Returns:

  • ESP_OK: Set RGB for a specific pixel successfully
  • ESP_ERR_INVALID_ARG: Set RGB for a specific pixel failed because of invalid parameters
  • ESP_FAIL: Set RGB for a specific pixel failed because other error occurred

function led_strip_set_pixel_hsv

Set HSV for a specific pixel.

C

esp_err_t led_strip_set_pixel_hsv (
    led_strip_handle_t strip,
    uint32_t index,
    uint16_t hue,
    uint8_t saturation,
    uint8_t value
)

Parameters:

  • strip LED strip
  • index index of pixel to set
  • hue hue part of color (0 - 360)
  • saturation saturation part of color (0 - 255, rescaled from 0 - 1. e.g. saturation = 0.5, rescaled to 127)
  • value value part of color (0 - 255, rescaled from 0 - 1. e.g. value = 0.5, rescaled to 127)

Returns:

  • ESP_OK: Set HSV color for a specific pixel successfully
  • ESP_ERR_INVALID_ARG: Set HSV color for a specific pixel failed because of an invalid argument
  • ESP_FAIL: Set HSV color for a specific pixel failed because other error occurred

function led_strip_set_pixel_rgbw

Set RGBW for a specific pixel.

C

esp_err_t led_strip_set_pixel_rgbw (
    led_strip_handle_t strip,
    uint32_t index,
    uint32_t red,
    uint32_t green,
    uint32_t blue,
    uint32_t white
)

Note:

Only call this function if your led strip does have the white component (e.g. SK6812-RGBW)

Note:

Also see led_strip_set_pixel if you only want to specify the RGB part of the color and bypass the white component

Parameters:

  • strip LED strip
  • index index of pixel to set
  • red red part of color
  • green green part of color
  • blue blue part of color
  • white separate white component

Returns:

  • ESP_OK: Set RGBW color for a specific pixel successfully
  • ESP_ERR_INVALID_ARG: Set RGBW color for a specific pixel failed because of an invalid argument
  • ESP_FAIL: Set RGBW color for a specific pixel failed because other error occurred

File include/led_strip_rmt.h

Structures and Types

Type Name
struct led_strip_rmt_config_t
LED Strip RMT specific configuration.
struct led_strip_rmt_extra_config

Functions

Type Name
esp_err_t led_strip_new_rmt_device (const led_strip_config_t *led_config, const led_strip_rmt_config_t *rmt_config, led_strip_handle_t *ret_strip)
Create LED strip based on RMT TX channel.

Structures and Types Documentation

struct led_strip_rmt_config_t

LED Strip RMT specific configuration.

Variables:

  • rmt_clock_source_t clk_src
    RMT clock source

  • struct led_strip_rmt_config_t::led_strip_rmt_extra_config flags
    Extra driver flags

  • size_t mem_block_symbols
    How many RMT symbols can one RMT channel hold at one time. Set to 0 will fallback to use the default size. Extra RMT specific driver flags

  • uint32_t resolution_hz
    RMT tick resolution, if set to zero, a default resolution (10MHz) will be applied

struct led_strip_rmt_config_t::led_strip_rmt_extra_config

Variables:

  • uint32_t with_dma
    Use DMA to transmit data

Functions Documentation

function led_strip_new_rmt_device

Create LED strip based on RMT TX channel.

C

esp_err_t led_strip_new_rmt_device (
    const led_strip_config_t *led_config,
    const led_strip_rmt_config_t *rmt_config,
    led_strip_handle_t *ret_strip
)

Parameters:

  • led_config LED strip configuration
  • rmt_config RMT specific configuration
  • ret_strip Returned LED strip handle

Returns:

  • ESP_OK: create LED strip handle successfully
  • ESP_ERR_INVALID_ARG: create LED strip handle failed because of invalid argument
  • ESP_ERR_NO_MEM: create LED strip handle failed because of out of memory
  • ESP_FAIL: create LED strip handle failed because some other error

File include/led_strip_spi.h

Structures and Types

Type Name
struct led_strip_spi_config_t
LED Strip SPI specific configuration.

Functions

Type Name
esp_err_t led_strip_new_spi_device (const led_strip_config_t *led_config, const led_strip_spi_config_t *spi_config, led_strip_handle_t *ret_strip)
Create LED strip based on SPI MOSI channel.

Structures and Types Documentation

struct led_strip_spi_config_t

LED Strip SPI specific configuration.

Variables:

  • spi_clock_source_t clk_src
    SPI clock source

  • struct led_strip_spi_config_t flags
    Extra driver flags

  • spi_host_device_t spi_bus
    SPI bus ID. Which buses are available depends on the specific chip

  • uint32_t with_dma
    Use DMA to transmit data

Functions Documentation

function led_strip_new_spi_device

Create LED strip based on SPI MOSI channel.

C

esp_err_t led_strip_new_spi_device (
    const led_strip_config_t *led_config,
    const led_strip_spi_config_t *spi_config,
    led_strip_handle_t *ret_strip
)

Note:

Although only the MOSI line is used for generating the signal, the whole SPI bus can't be used for other purposes.

Parameters:

  • led_config LED strip configuration
  • spi_config SPI specific configuration
  • ret_strip Returned LED strip handle

Returns:

  • ESP_OK: create LED strip handle successfully
  • ESP_ERR_INVALID_ARG: create LED strip handle failed because of invalid argument
  • ESP_ERR_NOT_SUPPORTED: create LED strip handle failed because of unsupported configuration
  • ESP_ERR_NO_MEM: create LED strip handle failed because of out of memory
  • ESP_FAIL: create LED strip handle failed because some other error

File include/led_strip_types.h

Structures and Types

Type Name
union led_color_component_format_t
LED color component format.
struct format_layout
enum led_model_t
LED strip model.
struct led_strip_config_t
LED Strip common configurations The common configurations are not specific to any backend peripheral.
struct led_strip_extra_flags
typedef struct led_strip_t * led_strip_handle_t
Type of LED strip handle.

Macros

Type Name
define LED_STRIP_COLOR_COMPONENT_FMT_GRB (led_color_component_format_t){.format = {.r_pos = 1, .g_pos = 0, .b_pos = 2, .w_pos = 3, .reserved = 0, .num_components = 3}}
Helper macros to set the color component format.
define LED_STRIP_COLOR_COMPONENT_FMT_GRBW (led_color_component_format_t){.format = {.r_pos = 1, .g_pos = 0, .b_pos = 2, .w_pos = 3, .reserved = 0, .num_components = 4}}
define LED_STRIP_COLOR_COMPONENT_FMT_RGB (led_color_component_format_t){.format = {.r_pos = 0, .g_pos = 1, .b_pos = 2, .w_pos = 3, .reserved = 0, .num_components = 3}}
define LED_STRIP_COLOR_COMPONENT_FMT_RGBW (led_color_component_format_t){.format = {.r_pos = 0, .g_pos = 1, .b_pos = 2, .w_pos = 3, .reserved = 0, .num_components = 4}}

Structures and Types Documentation

union led_color_component_format_t

LED color component format.

Note:

The format is used to specify the order of color components in each pixel, also the number of color components.

Variables:

struct led_color_component_format_t::format_layout

Variables:

  • uint32_t b_pos
    Position of the blue channel in the color order: 0~3

  • uint32_t g_pos
    Position of the green channel in the color order: 0~3

  • uint32_t num_components
    Number of color components per pixel: 3 or 4. If set to 0, it will fallback to 3

  • uint32_t r_pos
    Position of the red channel in the color order: 0~3

  • uint32_t reserved
    Reserved

  • uint32_t w_pos
    Position of the white channel in the color order: 0~3

enum led_model_t

LED strip model.

C

enum led_model_t {
    LED_MODEL_WS2812,
    LED_MODEL_SK6812,
    LED_MODEL_INVALID
};

Note:

Different led model may have different timing parameters, so we need to distinguish them.

struct led_strip_config_t

LED Strip common configurations The common configurations are not specific to any backend peripheral.

Variables:

  • led_color_component_format_t color_component_format
    Specifies the order of color components in each pixel. Use helper macros like LED_STRIP_COLOR_COMPONENT_FMT_GRB to set the format LED strip extra driver flags

  • struct led_strip_config_t::led_strip_extra_flags flags
    Extra driver flags

  • led_model_t led_model
    Specifies the LED strip model (e.g., WS2812, SK6812)

  • uint32_t max_leds
    Maximum number of LEDs that can be controlled in a single strip

  • int strip_gpio_num
    GPIO number that used by LED strip

struct led_strip_config_t::led_strip_extra_flags

Variables:

  • uint32_t invert_out
    Invert output signal

typedef led_strip_handle_t

Type of LED strip handle.

C

typedef struct led_strip_t* led_strip_handle_t;

Macros Documentation

define LED_STRIP_COLOR_COMPONENT_FMT_GRB

Helper macros to set the color component format.

C

#define LED_STRIP_COLOR_COMPONENT_FMT_GRB ( led_color_component_format_t ){.format = {.r_pos = 1, .g_pos = 0, .b_pos = 2, .w_pos = 3, .reserved = 0, .num_components = 3}}

define LED_STRIP_COLOR_COMPONENT_FMT_GRBW

C

#define LED_STRIP_COLOR_COMPONENT_FMT_GRBW ( led_color_component_format_t ){.format = {.r_pos = 1, .g_pos = 0, .b_pos = 2, .w_pos = 3, .reserved = 0, .num_components = 4}}

define LED_STRIP_COLOR_COMPONENT_FMT_RGB

C

#define LED_STRIP_COLOR_COMPONENT_FMT_RGB ( led_color_component_format_t ){.format = {.r_pos = 0, .g_pos = 1, .b_pos = 2, .w_pos = 3, .reserved = 0, .num_components = 3}}

define LED_STRIP_COLOR_COMPONENT_FMT_RGBW

C

#define LED_STRIP_COLOR_COMPONENT_FMT_RGBW ( led_color_component_format_t ){.format = {.r_pos = 0, .g_pos = 1, .b_pos = 2, .w_pos = 3, .reserved = 0, .num_components = 4}}

File interface/led_strip_interface.h

Structures and Types

Type Name
struct led_strip_t
LED strip interface definition.
typedef struct led_strip_t led_strip_t

Structures and Types Documentation

struct led_strip_t

LED strip interface definition.

Variables:

  • esp_err_t(* clear
    Clear LED strip (turn off all LEDs)
    Parameters:

  • strip LED strip

  • timeout_ms timeout value for clearing task

Returns:

  • ESP_OK: Clear LEDs successfully

  • ESP_FAIL: Clear LEDs failed because some other error occurred

  • esp_err_t(* del
    Free LED strip resources.
    Parameters:

  • strip LED strip

Returns:

  • ESP_OK: Free resources successfully

  • ESP_FAIL: Free resources failed because error occurred

  • esp_err_t(* refresh
    Refresh memory colors to LEDs.
    Parameters:

  • strip LED strip

  • timeout_ms timeout value for refreshing task

Returns:

  • ESP_OK: Refresh successfully
  • ESP_FAIL: Refresh failed because some other error occurred

Note:

: After updating the LED colors in the memory, a following invocation of this API is needed to flush colors to strip.

  • esp_err_t(* set_pixel
    Set RGB for a specific pixel.
    Parameters:

  • strip LED strip

  • index index of pixel to set

  • red red part of color

  • green green part of color

  • blue blue part of color

Returns:

  • ESP_OK: Set RGB for a specific pixel successfully

  • ESP_ERR_INVALID_ARG: Set RGB for a specific pixel failed because of invalid parameters

  • ESP_FAIL: Set RGB for a specific pixel failed because other error occurred

  • esp_err_t(* set_pixel_rgbw
    Set RGBW for a specific pixel. Similar to set_pixelbut also set the white component.
    Parameters:

  • strip LED strip

  • index index of pixel to set

  • red red part of color

  • green green part of color

  • blue blue part of color

  • white separate white component

Returns:

  • ESP_OK: Set RGBW color for a specific pixel successfully
  • ESP_ERR_INVALID_ARG: Set RGBW color for a specific pixel failed because of an invalid argument
  • ESP_FAIL: Set RGBW color for a specific pixel failed because other error occurred

typedef led_strip_t

C

typedef struct led_strip_t led_strip_t;

Type of LED strip

Links

Supports all targets

License: Apache-2.0

To add this component to your project, run:

idf.py add-dependency "espressif/led_strip^3.0.1"

or download archive

Stats

  • Archive size
    Archive size ~ 30.28 KB
  • Downloaded in total
    Downloaded in total 942.8k times
  • Downloaded this version
    This version: 9.0k times

Badge

espressif/led_strip version: 3.0.1
|