Untitled

 avatar
unknown
c_cpp
a month ago
7.2 kB
3
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);
  }*/
}
Leave a Comment