Das ist aber auch ziemlich speziell nix-mehr-frei ^^
Ich habe es jedenfalls hinbekommen.
Das Ganze blockiert zwar während des Effektes alles andere (die Funktion wird nur einmal durchlaufen und arbeitet mit delay() weil eh nichts anderes ausgeführt werden kann, in dieser Funktion) aber für mehr reicht es bei mir gerade einfach nicht.
Für alle die es interessiert:
#include <FastLED.h>
#define NUM_LEDS 19 //hab nur 19 LEDs zum testen
#define DATA_PIN 13
struct CRGB leds[NUM_LEDS];
byte HSV255[] = {227,221,230};
static int pause = 25;
static byte width = 15;
static byte LEDsDieAnGehenSollen = 19;
// Alle LEDs mit einer RBG-Farbe leuchten lassen
void one_color_all(int red, int grn, int blu)
{
for(int i = 0 ; i < NUM_LEDS; i++ )
{
leds[i].setRGB(red, grn, blu);
}
LEDS.show();
}
void led_swipe_on(byte hue, byte sat, byte val)
{
// die ersten LEDs heller werden lassen, bis die erste LED (led[0]) eine Stufe vor voller helligkeit ist
for(int i = 0 ; ( i < (width - 1) ) ; i++ )
{
for(int j = 0 ; (i - j) >= 0 ; j++ )
{
leds[i - j] = CHSV( hue, sat, val / width * (j + 1) );
}
LEDS.show();
delay (pause);
}
// nacheinander die leds mit voller helligkeit (bis LEDsDieAnGehenSollen - width) leuchten lassen und die nachfolgenden "width"-leds jeweils abgestuft leuchten lassen
for(int i = 0 ; i + width <= LEDsDieAnGehenSollen ; i++ )
{
for(int j = 0 ; j < width ; j++ )
{
leds[i + j] = CHSV( hue, sat, val / width * (width - j) );
}
LEDS.show();
delay (pause);
}
// zum Schluss noch die letzten verbleibenden LEDs heller werden lassen
for(int i = (width - 1) ; i >= 0 ; i-- )
{
for(int j = 0 ; (i - j) > 0 ; j++ )
{
leds[ LEDsDieAnGehenSollen - (i - j) ] = CHSV( hue, sat, val / width * (width - j) );
}
LEDS.show();
delay (pause);
}
}
void setup()
{
LEDS.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
one_color_all(0,0,0); // Alle LEDs ausschalten
LEDS.show(); // Alle LEDs ausschalten
delay(2); // kurz warten
}
void loop()
{
static boolean einmalausfuehren = true;
if ( einmalausfuehren)
{
led_swipe_on(HSV255[0], HSV255[1], HSV255[2]);
einmalausfuehren = false;
}
}
Falls jemand eine Idee hat, wie ich das zyklisch durchlaufen lassen kann und das Arduino somit auch während des Effekts ansprechbar machen kann, dann immer her damit ^^.
Vor allem müssen dann eben die pausen weg und gegen "if (millis() - lastMillis >= duration)" ersetzt werden und die Funktion muss nachdem alle LEDs komplett eingeschaltete sind nichts mehr tun.
Das ist eigentlich aber noch die kleinste Aufgabe.
Ich weiß einfach nicht, wie ich die for-schleifen so ersetzen kann, dass immer nur ein Teil verarbeitet wird.