Untitled
#include "driver/gpio.h" #include "driver/twai.h" #include "driver/ledc.h" #include "esp_timer.h" #include "driver/gptimer.h" uint16_t r,g,b,ww,cw,tr; bool on = true; #define NUM_CHANNELS 5 static uint16_t start_values_LED1[NUM_CHANNELS]; static uint16_t target_values_LED1[NUM_CHANNELS]; static int16_t step_values_LED1[NUM_CHANNELS]; static uint16_t start_values_LED2[NUM_CHANNELS]; static uint16_t target_values_LED2[NUM_CHANNELS]; static int16_t step_values_LED2[NUM_CHANNELS]; static uint16_t start_values_LED3[NUM_CHANNELS]; static uint16_t target_values_LED3[NUM_CHANNELS]; static int16_t step_values_LED3[NUM_CHANNELS]; static bool fade_active_LED1 = false; static bool fade_active_LED2 = false; static bool fade_active_LED3 = false; static uint16_t steps_remaining_LED1 = 0; static uint16_t steps_remaining_LED2 = 0; static uint16_t steps_remaining_LED3 = 0; hw_timer_t *LEDtimer = NULL; portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED; void IRAM_ATTR onLEDTimer(){ static int ch = 1; if(ch == 1 && fade_active_LED1){ ch = 2; if (steps_remaining_LED1 > 0) { for (int i = 0; i < NUM_CHANNELS; i++) { start_values_LED1[i] = start_values_LED1[i] + step_values_LED1[i]; ledc_set_duty(LEDC_LOW_SPEED_MODE, (ledc_channel_t)i, (start_values_LED1[i])); ledc_update_duty(LEDC_LOW_SPEED_MODE, (ledc_channel_t)i); } steps_remaining_LED1--; if (steps_remaining_LED1 == 0){ for (int i = 0; i < NUM_CHANNELS; i++) { start_values_LED1[i] = target_values_LED1[i]; ledc_set_duty(LEDC_LOW_SPEED_MODE, (ledc_channel_t)i, (target_values_LED1[i])); ledc_update_duty(LEDC_LOW_SPEED_MODE, (ledc_channel_t)i); } } } else { fade_active_LED1 = false; } } else if(ch == 2 && fade_active_LED2){ ch = 3; if (steps_remaining_LED2 > 0) { for (int i = 0; i < NUM_CHANNELS; i++) { start_values_LED2[i] = start_values_LED2[i] + step_values_LED2[i]; ledc_set_duty(LEDC_LOW_SPEED_MODE, (ledc_channel_t)(i+5), (start_values_LED2[i])); ledc_update_duty(LEDC_LOW_SPEED_MODE, (ledc_channel_t)(i+5)); } steps_remaining_LED2--; if (steps_remaining_LED2 == 0){ for (int i = 0; i < NUM_CHANNELS; i++) { fade_active_LED2 = false; start_values_LED2[i] = target_values_LED2[i]; ledc_set_duty(LEDC_LOW_SPEED_MODE, (ledc_channel_t)(i+5), (target_values_LED2[i])); ledc_update_duty(LEDC_LOW_SPEED_MODE, (ledc_channel_t)(i+5)); } } } else { fade_active_LED2 = false; } } else if(ch == 3 && fade_active_LED3){ ch = 4; if (steps_remaining_LED3 > 0) { for (int i = 0; i < NUM_CHANNELS; i++) { start_values_LED3[i] = start_values_LED3[i] + step_values_LED3[i]; ledc_set_duty(LEDC_LOW_SPEED_MODE, (ledc_channel_t)(i+10), (start_values_LED3[i])); ledc_update_duty(LEDC_LOW_SPEED_MODE, (ledc_channel_t)(i+10)); } steps_remaining_LED3--; if (steps_remaining_LED3 == 0){ for (int i = 0; i < NUM_CHANNELS; i++) { start_values_LED3[i] = target_values_LED3[i]; ledc_set_duty(LEDC_LOW_SPEED_MODE, (ledc_channel_t)(i+10), (target_values_LED3[i])); ledc_update_duty(LEDC_LOW_SPEED_MODE, (ledc_channel_t)(i+10)); } } } else { fade_active_LED3 = false; } } else if(ch != 1 && ch != 2 && ch != 3 ){ ch = 1; } } void setup(){ Serial.begin(115200); LEDtimer = timerBegin(10000); // Timer 10kHz timerAttachInterrupt(LEDtimer, &onLEDTimer); timerAlarm(LEDtimer, 10, true, 0); timerStop(LEDtimer); } void loop(){ uint16_t current_values[NUM_CHANNELS] = {0, 0, 65535, 0, 0}; uint16_t target_values[NUM_CHANNELS] = {65535, 0, 0, 0, 0}; fade(1, current_values, target_values, 250); // 1000ms transition delay(1000); uint16_t current_values1[NUM_CHANNELS] = {65535, 0, 0, 0, 0}; uint16_t target_values1[NUM_CHANNELS] = {0, 65535, 0, 0, 0}; fade(1, current_values1, target_values1, 250); // 1000ms transition delay(1000); uint16_t current_values2[NUM_CHANNELS] = {0, 65535, 0, 0, 0}; uint16_t target_values2[NUM_CHANNELS] = {0, 0, 65535, 0, 0}; fade(1, current_values2, target_values2, 250); // 1000ms transition delay(1000); } void fade(uint8_t channel, uint16_t *current_values, uint16_t *new_values, uint16_t transition_ms) { //if(channel == 1){ // Stop any ongoing fade if (fade_active_LED1) { fade_active_LED1 = false; } // Initialize fade variables //transition_ms = transition_ms/4; steps_remaining_LED1 = transition_ms; for (int i = 0; i < NUM_CHANNELS; i++) { start_values_LED1[i] = current_values[i]; target_values_LED1[i] = new_values[i]; step_values_LED1[i] = (target_values_LED1[i] - start_values_LED1[i]) / (int16_t)transition_ms; } fade_active_LED1 = true; // Start the timer interrupt timerStart(LEDtimer); /*} else if(channel == 2){ if (fade_active_LED2) { timerStop(LEDtimer); } // Initialize fade variables steps_remaining_LED2 = transition_ms; for (int i = 0; i < NUM_CHANNELS; i++) { start_values_LED2[i] = current_values[i]; target_values_LED2[i] = new_values[i]; step_values_LED2[i] = (target_values_LED2[i] - start_values_LED2[i]) / (int16_t)transition_ms; } fade_active_LED2 = true; // Start the timer interrupt timerStart(LEDtimer); } else if(channel == 3){ if (fade_active_LED3) { timerStop(LEDtimer); } // Initialize fade variables steps_remaining_LED3 = transition_ms; for (int i = 0; i < NUM_CHANNELS; i++) { start_values_LED3[i] = current_values[i]; target_values_LED3[i] = new_values[i]; step_values_LED3[i] = (target_values_LED3[i] - start_values_LED3[i]) / (int16_t)transition_ms; } fade_active_LED3 = true; // Start the timer interrupt timerStart(LEDtimer); } else if(channel == 4){ if (fade_active_LED1) { fade_active_LED1 = false; } if (fade_active_LED2) { fade_active_LED2 = false; } if (fade_active_LED3) { fade_active_LED3 = false; } // Initialize fade variables steps_remaining_LED1 = transition_ms; for (int i = 0; i < NUM_CHANNELS; i++) { start_values_LED3[i] = start_values_LED2[i] = start_values_LED1[i] = current_values[i]; target_values_LED3[i] = target_values_LED2[i] = target_values_LED1[i] = new_values[i]; step_values_LED3[i] = step_values_LED2[i] = step_values_LED1[i] = (target_values_LED1[i] - start_values_LED1[i]) / (int16_t)transition_ms; } fade_active_LED1 = true; fade_active_LED2 = true; fade_active_LED3 = true; // Start the timer interrupt timerStart(LEDtimer); }*/ }
Leave a Comment