Das hatte ich übersehen, denn dann brauchen die Taster nicht entprellt zu werden, es muß nur die Flanke ausgewertet werden:
// https://forum.arduino.cc/t/led-programmierbar-lauflicht/917480/30?u=agmue
// LED Programmierbar Lauflicht
#include <FastLED.h>
// LED Stripes
const byte LEDs_Anzahl_1 = 20; // Anzahl von LEDs auf dem Stripe
const byte LEDs_Anzahl_2 = 20; // Anzahl von LEDs auf dem Stripe
const byte LEDs_Anzahl_3 = 20; // Anzahl von LEDs auf dem Stripe
const byte LEDs_Anzahl_4 = 20; // Anzahl von LEDs auf dem Stripe
const byte LEDs_Anzahl_5 = 20; // Anzahl von LEDs auf dem Stripe
const byte LEDs_Anzahl_6 = 20; // Anzahl von LEDs auf dem Stripe
const byte LEDs_Anzahl_7 = 20; // Anzahl von LEDs auf dem Stripe
// Taster
const byte Taster1 = 22; // Taster1 auf Pin22
const byte Taster2 = 23; // Taster2 auf Pin23
const byte Taster3 = 24; // Taster3 auf Pin24
const byte Taster4 = 25; // Taster4 auf Pin25
const byte Taster5 = 26; // Taster5 auf Pin26
const byte Taster6 = 27; // Taster6 auf Pin27
const byte Taster7 = 28; // Taster7 auf Pin28
bool akttaster1; // aktueller Tasterzustand
bool akttaster2;
bool akttaster3;
bool akttaster4;
bool akttaster5;
bool akttaster6;
bool akttaster7;
bool alttaster1; // alter Tasterzustand
bool alttaster2;
bool alttaster3;
bool alttaster4;
bool alttaster5;
bool alttaster6;
bool alttaster7;
// LED Stripes
const byte LED_Stripe1 = 30; // LED_Stripe1 auf Pin 30
const byte LED_Stripe2 = 31; // LED_Stripe2 auf Pin 31
const byte LED_Stripe3 = 32; // LED_Stripe3 auf Pin 32
const byte LED_Stripe4 = 33; // LED_Stripe4 auf Pin 33
const byte LED_Stripe5 = 34; // LED_Stripe5 auf Pin 34
const byte LED_Stripe6 = 35; // LED_Stripe6 auf Pin 35
const byte LED_Stripe7 = 36; // LED_Stripe7 auf Pin 36
CRGB leds1[LEDs_Anzahl_1];
CRGB leds2[LEDs_Anzahl_2];
CRGB leds3[LEDs_Anzahl_3];
CRGB leds4[LEDs_Anzahl_4];
CRGB leds5[LEDs_Anzahl_5];
CRGB leds6[LEDs_Anzahl_6];
CRGB leds7[LEDs_Anzahl_7];
byte schritt1;
byte schritt2;
byte schritt3;
byte schritt4;
byte schritt5;
byte schritt6;
byte schritt7;
byte lauflicht1;
byte lauflicht2;
byte lauflicht3;
byte lauflicht4;
byte lauflicht5;
byte lauflicht6;
byte lauflicht7;
const uint32_t Bew_Intervall1 = 100;
const uint32_t Bew_Intervall2 = 100;
const uint32_t Bew_Intervall3 = 100;
const uint32_t Bew_Intervall4 = 100;
const uint32_t Bew_Intervall5 = 100;
const uint32_t Bew_Intervall6 = 100;
const uint32_t Bew_Intervall7 = 100;
uint32_t bewegung1;
uint32_t bewegung2;
uint32_t bewegung3;
uint32_t bewegung4;
uint32_t bewegung5;
uint32_t bewegung6;
uint32_t bewegung7;
uint32_t dauer1;
uint32_t dauer2;
uint32_t dauer3;
uint32_t dauer4;
uint32_t dauer5;
uint32_t dauer6;
uint32_t dauer7;
const uint32_t Dauer_Int1 = 10000; // 10 Sekunden Animation
const uint32_t Dauer_Int2 = 10000;
const uint32_t Dauer_Int3 = 10000;
const uint32_t Dauer_Int4 = 10000;
const uint32_t Dauer_Int5 = 10000;
const uint32_t Dauer_Int6 = 10000;
const uint32_t Dauer_Int7 = 10000;
void setup()
{
//Zuweisung Taster auf Pins des Arduinos
pinMode( Taster1, INPUT_PULLUP);
pinMode( Taster2, INPUT_PULLUP);
pinMode( Taster3, INPUT_PULLUP);
pinMode( Taster4, INPUT_PULLUP);
pinMode( Taster5, INPUT_PULLUP);
pinMode( Taster6, INPUT_PULLUP);
pinMode( Taster7, INPUT_PULLUP);
alttaster1 = !digitalRead(Taster1); // alten Tasterzustand aktualisieren
alttaster2 = !digitalRead(Taster2);
alttaster3 = !digitalRead(Taster3);
alttaster4 = !digitalRead(Taster4);
alttaster5 = !digitalRead(Taster5);
alttaster6 = !digitalRead(Taster6);
alttaster7 = !digitalRead(Taster7);
FastLED.addLeds<WS2812B, LED_Stripe1 , GRB>(leds1, LEDs_Anzahl_1);
FastLED.addLeds<WS2812B, LED_Stripe2 , GRB>(leds2, LEDs_Anzahl_2);
FastLED.addLeds<WS2812B, LED_Stripe3 , GRB>(leds3, LEDs_Anzahl_3);
FastLED.addLeds<WS2812B, LED_Stripe4 , GRB>(leds4, LEDs_Anzahl_4);
FastLED.addLeds<WS2812B, LED_Stripe5 , GRB>(leds5, LEDs_Anzahl_5);
FastLED.addLeds<WS2812B, LED_Stripe6 , GRB>(leds6, LEDs_Anzahl_6);
FastLED.addLeds<WS2812B, LED_Stripe7 , GRB>(leds7, LEDs_Anzahl_7);
FastLED.show(); // Anzeige löschen
}
void loop()
{
uint32_t jetzt = millis();
bool neu = false;
alttaster1 = akttaster1; // alten Tasterzustand aktualisieren
alttaster2 = akttaster2;
alttaster3 = akttaster3;
alttaster4 = akttaster4;
alttaster5 = akttaster5;
alttaster6 = akttaster6;
alttaster7 = akttaster7;
akttaster1 = !digitalRead(Taster1); // aktueller Tasterzustand
akttaster2 = !digitalRead(Taster2);
akttaster3 = !digitalRead(Taster3);
akttaster4 = !digitalRead(Taster4);
akttaster5 = !digitalRead(Taster5);
akttaster6 = !digitalRead(Taster6);
akttaster7 = !digitalRead(Taster7);
// Streifen 1
switch (schritt1)
{
case 0:
if (akttaster1 && !alttaster1)
{
dauer1 = jetzt;
schritt1++;
}
break;
case 1:
if (jetzt - bewegung1 >= Bew_Intervall1)
{
bewegung1 = jetzt;
neu = true;
leds1[lauflicht1] = CRGB::Black;
leds1[LEDs_Anzahl_1 - lauflicht1 - 1] = CRGB::Black;
if (jetzt - dauer1 >= Dauer_Int1)
{
lauflicht1 = 0;
schritt1 = 0;
} else {
lauflicht1++;
if (lauflicht1 >= LEDs_Anzahl_1) lauflicht1 = 0;
leds1[lauflicht1] = CRGB::Green;
leds1[LEDs_Anzahl_1 - lauflicht1 - 1] = CRGB::Red;
}
}
break;
default:
schritt1 = 0;
}
// Streifen 2
switch (schritt2)
{
case 0:
if (akttaster2 && !alttaster2)
{
dauer2 = jetzt;
schritt2++;
}
break;
case 1:
if (jetzt - bewegung2 >= Bew_Intervall2)
{
bewegung2 = jetzt;
neu = true;
leds2[lauflicht2] = CRGB::Black;
leds2[LEDs_Anzahl_2 - lauflicht2 - 1] = CRGB::Black;
if (jetzt - dauer2 >= Dauer_Int2)
{
lauflicht2 = 0;
schritt2 = 0;
} else {
lauflicht2++;
if (lauflicht2 >= LEDs_Anzahl_2) lauflicht2 = 0;
leds2[lauflicht2] = CRGB::Green;
leds2[LEDs_Anzahl_2 - lauflicht2 - 1] = CRGB::Red;
}
}
break;
default:
schritt2 = 0;
}
if (neu) FastLED.show();
}
Zum Testen habe ich auch mal einen zweiten Streifen drangehängt, damit die sich nicht gegenseitig beeinflussen.