#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "led_strip.h" #include "esp_log.h" #include "esp_err.h" #define LED_STRIP_BLINK_GPIO 11 #define LED_STRIP_LED_NUMBERS 120 #define LED_STRIP_RMT_RES_HZ (10 * 1000 * 1000) static const char *TAG = "ledstrip"; led_strip_handle_t configure_led(void) { // LED strip general initialization, according to your led board design led_strip_config_t strip_config = { .strip_gpio_num = LED_STRIP_BLINK_GPIO, // The GPIO that connected to the LED strip's data line .max_leds = LED_STRIP_LED_NUMBERS, // The number of LEDs in the strip, .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip .led_model = LED_MODEL_WS2812, // LED strip model .flags.invert_out = false, // whether to invert the output signal }; // LED strip backend configuration: RMT led_strip_rmt_config_t rmt_config = { #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0) .rmt_channel = 0, #else .clk_src = RMT_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption .resolution_hz = LED_STRIP_RMT_RES_HZ, // RMT counter clock frequency .flags.with_dma = false, // DMA feature is available on ESP target like ESP32-S3 #endif }; // LED Strip object handle led_strip_handle_t led_strip; ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip)); ESP_LOGI(TAG, "Created LED strip object with RMT backend"); return led_strip; } led_strip_handle_t led_strip; void ledstrip_init(void) { led_strip = configure_led(); bool led_on_off = false; } static float modifier = 0.0; void ledstrip_set_modifier(float frac) { modifier = frac; } void ledstrip_set(uint32_t r, uint32_t g, uint32_t b) { ESP_LOGI(TAG, "Led set!"); for (int i = 0; i < LED_STRIP_LED_NUMBERS; i++) { ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, i, r, g, b)); } led_strip_refresh(led_strip); } uint8_t effect = -1; uint8_t effects = 120; uint16_t effStep; unsigned long effStart; void __reset(void) { effStep = 0; effect = (effect + 1) % effects; effStart = xTaskGetTickCount() * portTICK_PERIOD_MS; } typedef struct Loop { uint8_t currentChild; uint8_t childs; bool timeBased; uint16_t cycles; uint16_t currentTime; //Loop(uint8_t totchilds, bool timebased, uint16_t tottime) // {currentTime=0;currentChild=0;childs=totchilds;timeBased=timebased;cycles=tottime;} } loop_t; loop_t strip0loop0 = { .currentTime = 0, .currentChild = 0, .childs = 1, .timeBased = false, .cycles = 1, }; //proto uint8_t strip0_loop0func(); uint8_t strip0_loop0_eff0(); void ledstrip_refresh(void) { if(strip0_loop0func() & 0x01) led_strip_refresh(led_strip); } uint8_t strip0_loop0func() { uint8_t ret = 0x00; switch(strip0loop0.currentChild) { case 0: ret = strip0_loop0_eff0();break; } if(ret & 0x02) { ret &= 0xfd; if(strip0loop0.currentChild + 1 >= strip0loop0.childs) { strip0loop0.currentChild = 0; if(++strip0loop0.currentTime >= strip0loop0.cycles) {strip0loop0.currentTime = 0; ret |= 0x02;} } else { strip0loop0.currentChild++; } }; return ret; } uint8_t strip0_loop0_eff0() { // Strip ID: 0 - Effect: Rainbow - LEDS: 120 // Steps: 60 - Delay: 20 // Colors: 3 (255.0.0, 0.255.0, 0.0.255) // Options: rainbowlen=60, toLeft=true, if((xTaskGetTickCount() * portTICK_PERIOD_MS) - effStart < 20 * (effStep)) return 0x00; float factor1, factor2; uint16_t ind; for(uint16_t j=0;j<120;j++) { ind = effStep + j * 1; switch((int)((ind % 60) / 20)) { case 0: factor1 = 1.0 - ((float)(ind % 60 - 0 * 20) / 20); factor2 = (float)((int)(ind - 0) % 60) / 20; // strip_0.strip.setPixelColor(j, 255 * factor1 + 0 * factor2, 0 * factor1 + 255 * factor2, 0 * factor1 + 0 * factor2); ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, j, modifier * 255 * factor1 + 0 * factor2, modifier * 0 * factor1 + 255 * factor2, modifier * 0 * factor1 + 0 * factor2)); break; case 1: factor1 = 1.0 - ((float)(ind % 60 - 1 * 20) / 20); factor2 = (float)((int)(ind - 20) % 60) / 20; ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, j, modifier * 0 * factor1 + 0 * factor2, modifier * 255 * factor1 + 0 * factor2, modifier * 0 * factor1 + 255 * factor2)); break; case 2: factor1 = 1.0 - ((float)(ind % 60 - 2 * 20) / 20); factor2 = (float)((int)(ind - 40) % 60) / 20; ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, j, modifier * 0 * factor1 + 255 * factor2, modifier * 0 * factor1 + 0 * factor2, modifier * 255 * factor1 + 0 * factor2)); break; } } if(effStep >= 60) {__reset(); return 0x03; } else effStep++; return 0x01; }