Untitled
unknown
c_cpp
10 months ago
7.2 kB
5
Indexable
#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);
}*/
}Editor is loading...
Leave a Comment