#include #include #include "sdkconfig.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/event_groups.h" #include "driver/ledc.h" #define LED_R_PIN (4) #define LED_G_PIN (3) #define LED_B_PIN (5) #define LED_R_CHANNEL LEDC_CHANNEL_0 #define LED_G_CHANNEL LEDC_CHANNEL_1 #define LED_B_CHANNEL LEDC_CHANNEL_2 #define FADE_MS 250 TaskHandle_t xTaskDiscoLEDHandle = NULL; void vTaskDiscoLED(void *pvParameters) { ledc_timer_config_t ledc_timer = { .duty_resolution = LEDC_TIMER_13_BIT, .freq_hz = 7500, .speed_mode = LEDC_LOW_SPEED_MODE, .timer_num = LEDC_TIMER_0, .clk_cfg = LEDC_AUTO_CLK }; ledc_timer_config(&ledc_timer); ledc_channel_config_t ledc_channels[3] = { { .channel = LED_R_CHANNEL, .duty = 0, .gpio_num = LED_R_PIN, .speed_mode = LEDC_LOW_SPEED_MODE, .hpoint = 0, .timer_sel = LEDC_TIMER_0, .flags.output_invert = 0 }, { .channel = LED_G_CHANNEL, .duty = 0, .gpio_num = LED_G_PIN, .speed_mode = LEDC_LOW_SPEED_MODE, .hpoint = 0, .timer_sel = LEDC_TIMER_0, .flags.output_invert = 0 }, { .channel = LED_B_CHANNEL, .duty = 0, .gpio_num = LED_B_PIN, .speed_mode = LEDC_LOW_SPEED_MODE, .hpoint = 0, .timer_sel = LEDC_TIMER_0, .flags.output_invert = 0 } }; for(uint8_t i = 0; i < 3; i++) { ledc_channel_config(&ledc_channels[i]); } ledc_fade_func_install(0); uint32_t pwm_data[3]; for(;;) { for(uint8_t i = 0; i < 3; i++) { uint32_t pwm_new; uint32_t delta; do { pwm_new = esp_random() / 0x80000; // 0-8191 if(pwm_new > pwm_data[i]) delta = pwm_new - pwm_data[i]; else delta = pwm_data[i] - pwm_new; } while(delta < 2 * FADE_MS); pwm_data[i] = pwm_new; } for(uint8_t i = 0; i < 3; i++) { ledc_set_fade_with_time(ledc_channels[i].speed_mode, ledc_channels[i].channel, pwm_data[i], FADE_MS); ledc_fade_start(ledc_channels[i].speed_mode, ledc_channels[i].channel, LEDC_FADE_NO_WAIT); } vTaskDelay(pdMS_TO_TICKS(FADE_MS)); } }