Files
ESPC3-wireless/app/drivers/led_strip/led_strip.c
2025-08-20 11:31:55 +08:00

103 lines
3.0 KiB
C

#include "led_strip.h"
rmt_channel_handle_t led_chan = NULL;
rmt_encoder_handle_t led_encoder = NULL;
rmt_transmit_config_t tx_config = {
.loop_count = 0, // no transfer loop
};
static uint8_t led_strip_pixels[EXAMPLE_LED_NUMBERS * 3];
uint16_t toggle_cycle = 1000;
static uint8_t rgb_color_index = RGB_COLOR_RAD;
rgb_color_t rgb_color_rad = {0,255,0,0,0};
rgb_color_t rgb_color_green = {0,0,255,0,0};
rgb_color_t rgb_color_blue = {0,0,0,255,0};
void led_strip_init(void)
{
// ESP_LOGI(TAG, "Create RMT TX channel");
rmt_tx_channel_config_t tx_chan_config = {
.clk_src = RMT_CLK_SRC_DEFAULT, // select source clock
.gpio_num = RMT_LED_STRIP_GPIO_NUM,
.mem_block_symbols = 64, // increase the block size can make the LED less flickering
.resolution_hz = RMT_LED_STRIP_RESOLUTION_HZ,
.trans_queue_depth = 4, // set the number of transactions that can be pending in the background
};
ESP_ERROR_CHECK(rmt_new_tx_channel(&tx_chan_config, &led_chan));
// ESP_LOGI(TAG, "Install led strip encoder");
led_strip_encoder_config_t encoder_config = {
.resolution = RMT_LED_STRIP_RESOLUTION_HZ,
};
ESP_ERROR_CHECK(rmt_new_led_strip_encoder(&encoder_config, &led_encoder));
// ESP_LOGI(TAG, "Enable RMT TX channel");
ESP_ERROR_CHECK(rmt_enable(led_chan));
// ESP_LOGI(TAG, "Start LED rainbow chase");
}
void led_strip_set_pixel(uint8_t pin, uint8_t index, uint8_t green, uint8_t blue, uint8_t red)
{
led_strip_pixels[0 + index * 3] = green;
led_strip_pixels[1 + index * 3] = red;
led_strip_pixels[2 + index * 3] = blue;
ESP_ERROR_CHECK(rmt_transmit(led_chan, led_encoder, led_strip_pixels, sizeof(led_strip_pixels), &tx_config));
ESP_ERROR_CHECK(rmt_tx_wait_all_done(led_chan, portMAX_DELAY));
}
void work_rgb_led_start(void)
{
led_strip_init();
/* 创建 shell 的接收任务 _work_sh() */
static os_work_t work_handler_rgb_led;
os_work_create(&work_handler_rgb_led, "work-rgb-led", _work_rgb_led, NULL, OS_PRIORITY_NORMAL);
os_work_submit(default_os_work_q_hdl, &work_handler_rgb_led, toggle_cycle * 0.5);
}
void _work_rgb_led(void *arg)
{
static rgb_color_t* expression;
switch (rgb_color_index)
{
case RGB_COLOR_RAD:
expression = &rgb_color_rad;
break;
case RGB_COLOR_GREEN:
expression = &rgb_color_green;
break;
case RGB_COLOR_BLUE:
expression = &rgb_color_blue;
break;
default:
break;
}
rgb_toggle(expression);
os_work_later(toggle_cycle * 0.5);
}
void rgb_update_cyle(uint16_t cyle)
{
toggle_cycle = cyle;
}
void rgb_toggle(rgb_color_t* rgb_color)
{
if(rgb_color->toggle_flag == 0)
led_strip_set_pixel(0,rgb_color->index,rgb_color->green,rgb_color->blue,rgb_color->red);
else
led_strip_set_pixel(0,rgb_color->index,0,0,0);
rgb_color->toggle_flag = !rgb_color->toggle_flag;
}
void rgb_color_change(uint8_t index, uint8_t color)
{
rgb_color_index = color;
}