added fade animations

This commit is contained in:
Adrian Baumgart 2023-11-13 20:38:22 +01:00
parent 85eeb2b835
commit 98f7689d8f
No known key found for this signature in database

View File

@ -7,7 +7,8 @@
#include <Arduino.h> #include <Arduino.h>
#include <FastLED.h> #include <FastLED.h>
void set_all_leds(CRGB leds[], int size, CRGB color); void set_all_leds(CRGB color, int brightness, int fade);
void set_strip(CRGB leds[], int size, CRGB color);
// Color when interior lights are on (e.g. door is open) // Color when interior lights are on (e.g. door is open)
// Color Temperature RGB values from: https://andi-siess.de/rgb-to-color-temperature/ // Color Temperature RGB values from: https://andi-siess.de/rgb-to-color-temperature/
@ -22,8 +23,8 @@ CRGB driving_rgb = CRGB(240, 17, 17);
#define RELAY_1 3 #define RELAY_1 3
// Input config // Input config
#define IGNITION_POWER 7 #define IGNITION_POWER A0
#define LIGHTING_POWER 8 #define LIGHTING_POWER A1
bool ignition_on = false; bool ignition_on = false;
bool lighting_on = false; bool lighting_on = false;
@ -41,6 +42,13 @@ CRGB fl_leds[LED_FL_NUM];
#define LED_FR_NUM 20 #define LED_FR_NUM 20
CRGB fr_leds[LED_FR_NUM]; CRGB fr_leds[LED_FR_NUM];
// Animation settings
#define FADE_ITERATIONS 50
#define INTERIOR_FADE 1
#define DRIVING_FADE 2
int current_brightness = 0;
CRGB current_color = CRGB(0,0,0);
void setup() { void setup() {
// Add front-left LEDs // Add front-left LEDs
@ -52,14 +60,16 @@ void setup() {
pinMode(RELAY_1, OUTPUT); pinMode(RELAY_1, OUTPUT);
pinMode(IGNITION_POWER, INPUT_PULLUP); pinMode(IGNITION_POWER, INPUT_PULLUP);
pinMode(LIGHTING_POWER, INPUT_PULLUP); pinMode(LIGHTING_POWER, INPUT_PULLUP);
digitalWrite(RELAY_1, LOW);
Serial.begin(9600);
} }
void loop() { void loop() {
ignition_on = digitalRead(IGNITION_POWER); ignition_on = analogRead(IGNITION_POWER) > 1000;
lighting_on = digitalRead(LIGHTING_POWER); lighting_on = analogRead(LIGHTING_POWER) > 1000;
if (!ignition_on && !lighting_on) { if (!ignition_on && !lighting_on) {
// Turn off LED Strip power // Turn off LED Strip power
set_all_leds(CRGB(0,0,0), 0, 0);
digitalWrite(RELAY_1, LOW); digitalWrite(RELAY_1, LOW);
} }
else { else {
@ -68,18 +78,54 @@ void loop() {
// Interior light has priority // Interior light has priority
if (lighting_on) { if (lighting_on) {
FastLED.setBrightness(INTERIOR_BRIGHTNESS);
set_all_leds(fl_leds, LED_FL_NUM, interior_rgb); set_all_leds(interior_rgb, INTERIOR_BRIGHTNESS, INTERIOR_FADE);
set_all_leds(fr_leds, LED_FR_NUM, interior_rgb);
} }
else if (ignition_on) { else if (ignition_on) {
FastLED.setBrightness(DRIVING_BRIGHTNESS); set_all_leds(driving_rgb, DRIVING_BRIGHTNESS, DRIVING_FADE);
set_all_leds(fl_leds, LED_FL_NUM, driving_rgb);
set_all_leds(fr_leds, LED_FR_NUM, driving_rgb);
} }
} }
void set_all_leds(CRGB leds[], int size, CRGB color) { void set_all_leds(CRGB color, int brightness, int fade) {
// Calculate the difference between the new value and the current value.
// The order is important to have the right prefix.
// e.g. 200 -> 50 => 50-200 => -150
// 50 -> 200 => 200-50 = 150
int delta_brightness = brightness - current_brightness;
int delta_r = color.red - current_color.red;
int delta_g = color.green - current_color.green;
int delta_b = color.blue - current_color.blue;
for(int i = 1; i<=FADE_ITERATIONS;i++) {
// Calculate the new rgb and brightness value for each iteration.
// The delta is divided by the amount of fade iterations to get the required delta for each iteration
// Then we multiply this by the current iteration count, so it goes towards the total delta value from above
int brightness_step_value = current_brightness + ((delta_brightness / FADE_ITERATIONS)*i);
int red_step_value = current_color.red + ((delta_r / FADE_ITERATIONS)*i);
int green_step_value = current_color.green + ((delta_g / FADE_ITERATIONS)*i);
int blue_step_value = current_color.blue + ((delta_b / FADE_ITERATIONS)*i);
// to account for any rounding issues in the step value calculations, the right brightness and color is manually set on the last iteration
if (i == FADE_ITERATIONS) {
brightness_step_value = brightness;
red_step_value = color.red;
green_step_value = color.green;
blue_step_value = color.blue;
}
CRGB step_color = CRGB(red_step_value, green_step_value, blue_step_value);
FastLED.setBrightness(brightness_step_value);
set_strip(fl_leds, LED_FL_NUM, step_color);
set_strip(fr_leds, LED_FR_NUM, step_color);
delay(fade/FADE_ITERATIONS);
}
current_brightness = brightness;
current_color = color;
}
void set_strip(CRGB leds[], int size, CRGB color) {
for(int i = 0;i<size;i++) { for(int i = 0;i<size;i++) {
leds[i] = color; leds[i] = color;
} }