mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-31 11:17:20 +02:00
led_strip: use component manager in the example
This commit is contained in:
@@ -1,9 +0,0 @@
|
|||||||
set(srcs "src/led_strip_api.c")
|
|
||||||
|
|
||||||
if(CONFIG_SOC_RMT_SUPPORTED)
|
|
||||||
list(APPEND srcs "src/led_strip_rmt_dev.c" "src/led_strip_rmt_encoder.c")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
idf_component_register(SRCS ${srcs}
|
|
||||||
INCLUDE_DIRS "include" "interface"
|
|
||||||
PRIV_REQUIRES "driver")
|
|
@@ -1,15 +0,0 @@
|
|||||||
# LED Strip Component
|
|
||||||
|
|
||||||
This directory contains an implementation for addressable LEDs by different peripherals. Currently only RMT is supported as the led strip backend.
|
|
||||||
|
|
||||||
It's compatible with:
|
|
||||||
|
|
||||||
* [WS2812](http://www.world-semi.com/Certifications/WS2812B.html)
|
|
||||||
* SK68XX
|
|
||||||
|
|
||||||
This component is used as part of the following ESP-IDF examples:
|
|
||||||
- [Blink Example](../../get-started/blink).
|
|
||||||
|
|
||||||
To learn more about how to use this component, please check API Documentation from header file [led_strip.h](./include/led_strip.h).
|
|
||||||
|
|
||||||
Please note that this component is not considered to be a part of ESP-IDF stable API. It may change and it may be removed in the future releases.
|
|
@@ -1,95 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: 2019-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "esp_err.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief LED strip handle
|
|
||||||
*/
|
|
||||||
typedef struct led_strip_t *led_strip_handle_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Set RGB for a specific pixel
|
|
||||||
*
|
|
||||||
* @param strip: LED strip
|
|
||||||
* @param index: index of pixel to set
|
|
||||||
* @param red: red part of color
|
|
||||||
* @param green: green part of color
|
|
||||||
* @param blue: blue part of color
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
* - 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 led_strip_set_pixel(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Refresh memory colors to LEDs
|
|
||||||
*
|
|
||||||
* @param strip: LED strip
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
* - 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 led_strip_refresh(led_strip_handle_t strip);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Clear LED strip (turn off all LEDs)
|
|
||||||
*
|
|
||||||
* @param strip: LED strip
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
* - ESP_OK: Clear LEDs successfully
|
|
||||||
* - ESP_FAIL: Clear LEDs failed because some other error occurred
|
|
||||||
*/
|
|
||||||
esp_err_t led_strip_clear(led_strip_handle_t strip);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Free LED strip resources
|
|
||||||
*
|
|
||||||
* @param strip: LED strip
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
* - ESP_OK: Free resources successfully
|
|
||||||
* - ESP_FAIL: Free resources failed because error occurred
|
|
||||||
*/
|
|
||||||
esp_err_t led_strip_del(led_strip_handle_t strip);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief LED Strip Configuration
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
uint32_t strip_gpio_num; /*!< GPIO number that used by LED strip */
|
|
||||||
uint32_t max_leds; /*!< Maximum LEDs in a single strip */
|
|
||||||
} led_strip_config_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Create LED strip based on RMT TX channel
|
|
||||||
*
|
|
||||||
* @param config LED strip specific configuration
|
|
||||||
* @param ret_strip Returned LED strip handle
|
|
||||||
* @return
|
|
||||||
* - 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
|
|
||||||
*/
|
|
||||||
esp_err_t led_strip_new_rmt_device(const led_strip_config_t *config, led_strip_handle_t *ret_strip);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
@@ -1,78 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "esp_err.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct led_strip_t led_strip_t; /*!< Type of LED strip */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief LED strip interface definition
|
|
||||||
*/
|
|
||||||
struct led_strip_t {
|
|
||||||
/**
|
|
||||||
* @brief Set RGB for a specific pixel
|
|
||||||
*
|
|
||||||
* @param strip: LED strip
|
|
||||||
* @param index: index of pixel to set
|
|
||||||
* @param red: red part of color
|
|
||||||
* @param green: green part of color
|
|
||||||
* @param blue: blue part of color
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
* - 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)(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Refresh memory colors to LEDs
|
|
||||||
*
|
|
||||||
* @param strip: LED strip
|
|
||||||
* @param timeout_ms: timeout value for refreshing task
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
* - 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 (*refresh)(led_strip_t *strip);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Clear LED strip (turn off all LEDs)
|
|
||||||
*
|
|
||||||
* @param strip: LED strip
|
|
||||||
* @param timeout_ms: timeout value for clearing task
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
* - ESP_OK: Clear LEDs successfully
|
|
||||||
* - ESP_FAIL: Clear LEDs failed because some other error occurred
|
|
||||||
*/
|
|
||||||
esp_err_t (*clear)(led_strip_t *strip);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Free LED strip resources
|
|
||||||
*
|
|
||||||
* @param strip: LED strip
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
* - ESP_OK: Free resources successfully
|
|
||||||
* - ESP_FAIL: Free resources failed because error occurred
|
|
||||||
*/
|
|
||||||
esp_err_t (*del)(led_strip_t *strip);
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
@@ -1,35 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
#include "esp_log.h"
|
|
||||||
#include "esp_check.h"
|
|
||||||
#include "led_strip.h"
|
|
||||||
#include "led_strip_interface.h"
|
|
||||||
|
|
||||||
static const char *TAG = "led_strip";
|
|
||||||
|
|
||||||
esp_err_t led_strip_set_pixel(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue)
|
|
||||||
{
|
|
||||||
ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument");
|
|
||||||
return strip->set_pixel(strip, index, red, green, blue);
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t led_strip_refresh(led_strip_handle_t strip)
|
|
||||||
{
|
|
||||||
ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument");
|
|
||||||
return strip->refresh(strip);
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t led_strip_clear(led_strip_handle_t strip)
|
|
||||||
{
|
|
||||||
ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument");
|
|
||||||
return strip->clear(strip);
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t led_strip_del(led_strip_handle_t strip)
|
|
||||||
{
|
|
||||||
ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, "invalid argument");
|
|
||||||
return strip->del(strip);
|
|
||||||
}
|
|
@@ -1,112 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: 2019-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
#include "esp_log.h"
|
|
||||||
#include "esp_check.h"
|
|
||||||
#include "driver/rmt_tx.h"
|
|
||||||
#include "led_strip.h"
|
|
||||||
#include "led_strip_interface.h"
|
|
||||||
#include "led_strip_rmt_encoder.h"
|
|
||||||
|
|
||||||
#define LED_SRIP_RMT_RESOLUTION 10000000 // 10MHz resolution
|
|
||||||
|
|
||||||
static const char *TAG = "led_strip_rmt";
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
led_strip_t base;
|
|
||||||
rmt_channel_handle_t rmt_chan;
|
|
||||||
rmt_encoder_handle_t strip_encoder;
|
|
||||||
uint32_t strip_len;
|
|
||||||
uint8_t pixel_buf[];
|
|
||||||
} led_strip_rmt_obj;
|
|
||||||
|
|
||||||
static esp_err_t led_strip_rmt_set_pixel(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue)
|
|
||||||
{
|
|
||||||
led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base);
|
|
||||||
ESP_RETURN_ON_FALSE(index < rmt_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, "index out of maximum number of LEDs");
|
|
||||||
uint32_t start = index * 3;
|
|
||||||
// In thr order of GRB, as LED strip like WS2812 sends out pixels in this order
|
|
||||||
rmt_strip->pixel_buf[start + 0] = green & 0xFF;
|
|
||||||
rmt_strip->pixel_buf[start + 1] = red & 0xFF;
|
|
||||||
rmt_strip->pixel_buf[start + 2] = blue & 0xFF;
|
|
||||||
return ESP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static esp_err_t led_strip_rmt_refresh(led_strip_t *strip)
|
|
||||||
{
|
|
||||||
led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base);
|
|
||||||
rmt_transmit_config_t tx_conf = {
|
|
||||||
.loop_count = 0,
|
|
||||||
};
|
|
||||||
ESP_RETURN_ON_ERROR(rmt_transmit(rmt_strip->rmt_chan, rmt_strip->strip_encoder, rmt_strip->pixel_buf,
|
|
||||||
rmt_strip->strip_len * 3, &tx_conf), TAG, "transmit pixels by RMT failed");
|
|
||||||
ESP_RETURN_ON_ERROR(rmt_tx_wait_all_done(rmt_strip->rmt_chan, -1), TAG, "flush RMT channel failed");
|
|
||||||
return ESP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static esp_err_t led_strip_rmt_clear(led_strip_t *strip)
|
|
||||||
{
|
|
||||||
led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base);
|
|
||||||
// Write zero to turn off all leds
|
|
||||||
memset(rmt_strip->pixel_buf, 0, rmt_strip->strip_len * 3);
|
|
||||||
return led_strip_rmt_refresh(strip);
|
|
||||||
}
|
|
||||||
|
|
||||||
static esp_err_t led_strip_rmt_del(led_strip_t *strip)
|
|
||||||
{
|
|
||||||
led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base);
|
|
||||||
ESP_RETURN_ON_ERROR(rmt_disable(rmt_strip->rmt_chan), TAG, "disable RMT channel failed");
|
|
||||||
ESP_RETURN_ON_ERROR(rmt_del_channel(rmt_strip->rmt_chan), TAG, "delete RMT channel failed");
|
|
||||||
ESP_RETURN_ON_ERROR(rmt_del_encoder(rmt_strip->strip_encoder), TAG, "delete strip encoder failed");
|
|
||||||
free(rmt_strip);
|
|
||||||
return ESP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t led_strip_new_rmt_device(const led_strip_config_t *config, led_strip_handle_t *ret_strip)
|
|
||||||
{
|
|
||||||
led_strip_rmt_obj *rmt_strip = NULL;
|
|
||||||
esp_err_t ret = ESP_OK;
|
|
||||||
ESP_GOTO_ON_FALSE(config && ret_strip, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument");
|
|
||||||
rmt_strip = calloc(1, sizeof(led_strip_rmt_obj) + config->max_leds * 3);
|
|
||||||
ESP_GOTO_ON_FALSE(rmt_strip, ESP_ERR_NO_MEM, err, TAG, "no mem for rmt strip");
|
|
||||||
rmt_tx_channel_config_t rmt_chan_config = {
|
|
||||||
.clk_src = RMT_CLK_SRC_DEFAULT,
|
|
||||||
.gpio_num = config->strip_gpio_num,
|
|
||||||
.mem_block_symbols = 64,
|
|
||||||
.resolution_hz = LED_SRIP_RMT_RESOLUTION,
|
|
||||||
.trans_queue_depth = 4,
|
|
||||||
};
|
|
||||||
ESP_GOTO_ON_ERROR(rmt_new_tx_channel(&rmt_chan_config, &rmt_strip->rmt_chan), err, TAG, "create RMT TX channel failed");
|
|
||||||
|
|
||||||
led_strip_encoder_config_t strip_encoder_conf = {
|
|
||||||
.resolution = LED_SRIP_RMT_RESOLUTION,
|
|
||||||
};
|
|
||||||
ESP_GOTO_ON_ERROR(rmt_new_led_strip_encoder(&strip_encoder_conf, &rmt_strip->strip_encoder), err, TAG, "create LED strip encoder failed");
|
|
||||||
|
|
||||||
ESP_GOTO_ON_ERROR(rmt_enable(rmt_strip->rmt_chan), err, TAG, "enable RMT channel failed");
|
|
||||||
|
|
||||||
rmt_strip->strip_len = config->max_leds;
|
|
||||||
rmt_strip->base.set_pixel = led_strip_rmt_set_pixel;
|
|
||||||
rmt_strip->base.refresh = led_strip_rmt_refresh;
|
|
||||||
rmt_strip->base.clear = led_strip_rmt_clear;
|
|
||||||
rmt_strip->base.del = led_strip_rmt_del;
|
|
||||||
|
|
||||||
*ret_strip = &rmt_strip->base;
|
|
||||||
return ESP_OK;
|
|
||||||
err:
|
|
||||||
if (rmt_strip) {
|
|
||||||
if (rmt_strip->rmt_chan) {
|
|
||||||
rmt_del_channel(rmt_strip->rmt_chan);
|
|
||||||
}
|
|
||||||
if (rmt_strip->strip_encoder) {
|
|
||||||
rmt_del_encoder(rmt_strip->strip_encoder);
|
|
||||||
}
|
|
||||||
free(rmt_strip);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
@@ -1,124 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "esp_check.h"
|
|
||||||
#include "led_strip_rmt_encoder.h"
|
|
||||||
|
|
||||||
static const char *TAG = "led_encoder";
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
rmt_encoder_t base;
|
|
||||||
rmt_encoder_t *bytes_encoder;
|
|
||||||
rmt_encoder_t *copy_encoder;
|
|
||||||
int state;
|
|
||||||
rmt_symbol_word_t reset_code;
|
|
||||||
} rmt_led_strip_encoder_t;
|
|
||||||
|
|
||||||
static size_t rmt_encode_led_strip(rmt_encoder_t *encoder, rmt_channel_handle_t channel, const void *primary_data, size_t data_size, rmt_encode_state_t *ret_state)
|
|
||||||
{
|
|
||||||
rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);
|
|
||||||
rmt_encoder_handle_t bytes_encoder = led_encoder->bytes_encoder;
|
|
||||||
rmt_encoder_handle_t copy_encoder = led_encoder->copy_encoder;
|
|
||||||
rmt_encode_state_t session_state = 0;
|
|
||||||
rmt_encode_state_t state = 0;
|
|
||||||
size_t encoded_symbols = 0;
|
|
||||||
switch (led_encoder->state) {
|
|
||||||
case 0: // send RGB data
|
|
||||||
encoded_symbols += bytes_encoder->encode(bytes_encoder, channel, primary_data, data_size, &session_state);
|
|
||||||
if (session_state & RMT_ENCODING_COMPLETE) {
|
|
||||||
led_encoder->state = 1; // switch to next state when current encoding session finished
|
|
||||||
}
|
|
||||||
if (session_state & RMT_ENCODING_MEM_FULL) {
|
|
||||||
state |= RMT_ENCODING_MEM_FULL;
|
|
||||||
goto out; // yield if there's no free space for encoding artifacts
|
|
||||||
}
|
|
||||||
// fall-through
|
|
||||||
case 1: // send reset code
|
|
||||||
encoded_symbols += copy_encoder->encode(copy_encoder, channel, &led_encoder->reset_code,
|
|
||||||
sizeof(led_encoder->reset_code), &session_state);
|
|
||||||
if (session_state & RMT_ENCODING_COMPLETE) {
|
|
||||||
led_encoder->state = 0; // back to the initial encoding session
|
|
||||||
state |= RMT_ENCODING_COMPLETE;
|
|
||||||
}
|
|
||||||
if (session_state & RMT_ENCODING_MEM_FULL) {
|
|
||||||
state |= RMT_ENCODING_MEM_FULL;
|
|
||||||
goto out; // yield if there's no free space for encoding artifacts
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out:
|
|
||||||
*ret_state = state;
|
|
||||||
return encoded_symbols;
|
|
||||||
}
|
|
||||||
|
|
||||||
static esp_err_t rmt_del_led_strip_encoder(rmt_encoder_t *encoder)
|
|
||||||
{
|
|
||||||
rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);
|
|
||||||
rmt_del_encoder(led_encoder->bytes_encoder);
|
|
||||||
rmt_del_encoder(led_encoder->copy_encoder);
|
|
||||||
free(led_encoder);
|
|
||||||
return ESP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static esp_err_t rmt_led_strip_encoder_reset(rmt_encoder_t *encoder)
|
|
||||||
{
|
|
||||||
rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);
|
|
||||||
rmt_encoder_reset(led_encoder->bytes_encoder);
|
|
||||||
rmt_encoder_reset(led_encoder->copy_encoder);
|
|
||||||
led_encoder->state = 0;
|
|
||||||
return ESP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t rmt_new_led_strip_encoder(const led_strip_encoder_config_t *config, rmt_encoder_handle_t *ret_encoder)
|
|
||||||
{
|
|
||||||
esp_err_t ret = ESP_OK;
|
|
||||||
rmt_led_strip_encoder_t *led_encoder = NULL;
|
|
||||||
ESP_GOTO_ON_FALSE(config && ret_encoder, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument");
|
|
||||||
led_encoder = calloc(1, sizeof(rmt_led_strip_encoder_t));
|
|
||||||
ESP_GOTO_ON_FALSE(led_encoder, ESP_ERR_NO_MEM, err, TAG, "no mem for led strip encoder");
|
|
||||||
led_encoder->base.encode = rmt_encode_led_strip;
|
|
||||||
led_encoder->base.del = rmt_del_led_strip_encoder;
|
|
||||||
led_encoder->base.reset = rmt_led_strip_encoder_reset;
|
|
||||||
// different led strip might have its own timing requirements, following parameter is for WS2812
|
|
||||||
rmt_bytes_encoder_config_t bytes_encoder_config = {
|
|
||||||
.bit0 = {
|
|
||||||
.level0 = 1,
|
|
||||||
.duration0 = 0.3 * config->resolution / 1000000, // T0H=0.3us
|
|
||||||
.level1 = 0,
|
|
||||||
.duration1 = 0.9 * config->resolution / 1000000, // T0L=0.9us
|
|
||||||
},
|
|
||||||
.bit1 = {
|
|
||||||
.level0 = 1,
|
|
||||||
.duration0 = 0.9 * config->resolution / 1000000, // T1H=0.9us
|
|
||||||
.level1 = 0,
|
|
||||||
.duration1 = 0.3 * config->resolution / 1000000, // T1L=0.3us
|
|
||||||
},
|
|
||||||
.flags.msb_first = 1 // WS2812 transfer bit order: G7...G0R7...R0B7...B0
|
|
||||||
};
|
|
||||||
ESP_GOTO_ON_ERROR(rmt_new_bytes_encoder(&bytes_encoder_config, &led_encoder->bytes_encoder), err, TAG, "create bytes encoder failed");
|
|
||||||
rmt_copy_encoder_config_t copy_encoder_config = {};
|
|
||||||
ESP_GOTO_ON_ERROR(rmt_new_copy_encoder(©_encoder_config, &led_encoder->copy_encoder), err, TAG, "create copy encoder failed");
|
|
||||||
|
|
||||||
uint32_t reset_ticks = config->resolution / 1000000 * 50 / 2; // reset code duration defaults to 50us
|
|
||||||
led_encoder->reset_code = (rmt_symbol_word_t) {
|
|
||||||
.level0 = 0,
|
|
||||||
.duration0 = reset_ticks,
|
|
||||||
.level1 = 0,
|
|
||||||
.duration1 = reset_ticks,
|
|
||||||
};
|
|
||||||
*ret_encoder = &led_encoder->base;
|
|
||||||
return ESP_OK;
|
|
||||||
err:
|
|
||||||
if (led_encoder) {
|
|
||||||
if (led_encoder->bytes_encoder) {
|
|
||||||
rmt_del_encoder(led_encoder->bytes_encoder);
|
|
||||||
}
|
|
||||||
if (led_encoder->copy_encoder) {
|
|
||||||
rmt_del_encoder(led_encoder->copy_encoder);
|
|
||||||
}
|
|
||||||
free(led_encoder);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
@@ -1,36 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include "driver/rmt_encoder.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Type of led strip encoder configuration
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
uint32_t resolution; /*!< Encoder resolution, in Hz */
|
|
||||||
} led_strip_encoder_config_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Create RMT encoder for encoding LED strip pixels into RMT symbols
|
|
||||||
*
|
|
||||||
* @param[in] config Encoder configuration
|
|
||||||
* @param[out] ret_encoder Returned encoder handle
|
|
||||||
* @return
|
|
||||||
* - ESP_ERR_INVALID_ARG for any invalid arguments
|
|
||||||
* - ESP_ERR_NO_MEM out of memory when creating led strip encoder
|
|
||||||
* - ESP_OK if creating encoder successfully
|
|
||||||
*/
|
|
||||||
esp_err_t rmt_new_led_strip_encoder(const led_strip_encoder_config_t *config, rmt_encoder_handle_t *ret_encoder);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
@@ -2,7 +2,5 @@
|
|||||||
# CMakeLists in this exact order for cmake to work correctly
|
# CMakeLists in this exact order for cmake to work correctly
|
||||||
cmake_minimum_required(VERSION 3.16)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/led_strip)
|
|
||||||
|
|
||||||
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
||||||
project(blink)
|
project(blink)
|
||||||
|
@@ -5,9 +5,9 @@
|
|||||||
|
|
||||||
(See the README.md file in the upper level 'examples' directory for more information about examples.)
|
(See the README.md file in the upper level 'examples' directory for more information about examples.)
|
||||||
|
|
||||||
This example demonstrates how to blink a LED using GPIO or RMT for the addressable LED, i.e. [WS2812](http://www.world-semi.com/Certifications/WS2812B.html).
|
This example demonstrates how to blink a LED using GPIO or using the [led_strip](https://components.espressif.com/component/espressif/led_strip) component for the addressable LED, i.e. [WS2812](http://www.world-semi.com/Certifications/WS2812B.html).
|
||||||
|
|
||||||
See the RMT examples in the [RMT Peripheral](../../peripherals/rmt) for more information about how to use it.
|
The `led_strip` is installed via [component manager](main/idf_component.yml).
|
||||||
|
|
||||||
## How to Use Example
|
## How to Use Example
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ Open the project configuration menu (`idf.py menuconfig`).
|
|||||||
In the `Example Configuration` menu:
|
In the `Example Configuration` menu:
|
||||||
|
|
||||||
* Select the LED type in the `Blink LED type` option.
|
* Select the LED type in the `Blink LED type` option.
|
||||||
* Use `GPIO` for regular LED blink.
|
* Use `GPIO` for regular LED blink.
|
||||||
* Set the GPIO number used for the signal in the `Blink GPIO number` option.
|
* Set the GPIO number used for the signal in the `Blink GPIO number` option.
|
||||||
* Set the blinking period in the `Blink period in ms` option.
|
* Set the blinking period in the `Blink period in ms` option.
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/l
|
|||||||
|
|
||||||
As you run the example, you will see the LED blinking, according to the previously defined period. For the addressable LED, you can also change the LED color by setting the `led_strip_set_pixel(led_strip, 0, 16, 16, 16);` (LED Strip, Pixel Number, Red, Green, Blue) with values from 0 to 255 in the [source file](main/blink_example_main.c).
|
As you run the example, you will see the LED blinking, according to the previously defined period. For the addressable LED, you can also change the LED color by setting the `led_strip_set_pixel(led_strip, 0, 16, 16, 16);` (LED Strip, Pixel Number, Red, Green, Blue) with values from 0 to 255 in the [source file](main/blink_example_main.c).
|
||||||
|
|
||||||
```
|
```text
|
||||||
I (315) example: Example configured to blink addressable LED!
|
I (315) example: Example configured to blink addressable LED!
|
||||||
I (325) example: Turning the LED OFF!
|
I (325) example: Turning the LED OFF!
|
||||||
I (1325) example: Turning the LED ON!
|
I (1325) example: Turning the LED ON!
|
||||||
|
@@ -49,7 +49,10 @@ static void configure_led(void)
|
|||||||
.strip_gpio_num = BLINK_GPIO,
|
.strip_gpio_num = BLINK_GPIO,
|
||||||
.max_leds = 1, // at least one LED on board
|
.max_leds = 1, // at least one LED on board
|
||||||
};
|
};
|
||||||
ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &led_strip));
|
led_strip_rmt_config_t rmt_config = {
|
||||||
|
.resolution_hz = 10 * 1000 * 1000, // 10MHz
|
||||||
|
};
|
||||||
|
ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip));
|
||||||
/* Set all LED off to clear all pixels */
|
/* Set all LED off to clear all pixels */
|
||||||
led_strip_clear(led_strip);
|
led_strip_clear(led_strip);
|
||||||
}
|
}
|
||||||
|
2
examples/get-started/blink/main/idf_component.yml
Normal file
2
examples/get-started/blink/main/idf_component.yml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
dependencies:
|
||||||
|
espressif/led_strip: "^2.0.0"
|
@@ -1,8 +1,6 @@
|
|||||||
# The following lines of boilerplate have to be in your project's CMakeLists
|
# The following lines of boilerplate have to be in your project's CMakeLists
|
||||||
# in this exact order for cmake to work correctly
|
# in this exact order for cmake to work correctly
|
||||||
cmake_minimum_required(VERSION 3.16)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
set(EXTRA_COMPONENT_DIRS
|
|
||||||
$ENV{IDF_PATH}/examples/common_components/led_strip
|
|
||||||
)
|
|
||||||
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
|
||||||
project(light_bulb)
|
project(light_bulb)
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
## IDF Component Manager Manifest File
|
## IDF Component Manager Manifest File
|
||||||
dependencies:
|
dependencies:
|
||||||
espressif/esp-zboss-lib: "~0.0.4"
|
espressif/esp-zboss-lib: "~0.0.4"
|
||||||
|
espressif/led_strip: "~2.0.0"
|
||||||
## Required IDF version
|
## Required IDF version
|
||||||
idf:
|
idf:
|
||||||
version: ">=5.0.0"
|
version: ">=5.0.0"
|
||||||
|
@@ -53,6 +53,9 @@ void light_driver_init(bool power)
|
|||||||
.max_leds = CONFIG_EXAMPLE_STRIP_LED_NUMBER,
|
.max_leds = CONFIG_EXAMPLE_STRIP_LED_NUMBER,
|
||||||
.strip_gpio_num = CONFIG_EXAMPLE_STRIP_LED_GPIO,
|
.strip_gpio_num = CONFIG_EXAMPLE_STRIP_LED_GPIO,
|
||||||
};
|
};
|
||||||
ESP_ERROR_CHECK(led_strip_new_rmt_device(&led_strip_conf, &s_led_strip));
|
led_strip_rmt_config_t rmt_conf = {
|
||||||
|
.resolution_hz = 10 * 1000 * 1000, // 10MHz
|
||||||
|
};
|
||||||
|
ESP_ERROR_CHECK(led_strip_new_rmt_device(&led_strip_conf, &rmt_conf, &s_led_strip));
|
||||||
light_driver_set_power(power);
|
light_driver_set_power(power);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user