GK-ken:
... eine Lösung ...
Eher drei, die mir spontan einfallen:
- Tastenabfrage mittels Interrupt; anfängerunfreundlich, unnötig.
- Tastenabfrage in die Schleifen integrieren; anfängerfreundlich, wenn es "irgendwie" funktionieren soll

- Schleifen blockadearm zu loop, "der" Schleife, öffnen; aufwendig zu ändern aber gut.
Dein Programm habe ich mal, weil es schnell geht und Spaß macht, entsprechend 2 geändert. Ich verwende einen Nano mit APA102 (DotStar) LEDs an SPI, weil die besser sind als WS2812 (NeoPixel). Daher ist die Initalisierung anders, die kannst Du einfach durch Deine ersetzen:
#include "FastLED.h"
FASTLED_USING_NAMESPACE
//#define DATA_PIN 4 // MOSI Pin11
//#define CLK_PIN 5 // ACK Pin13
#define LED_TYPE APA102
#define COLOR_ORDER BGR
#define BRIGHTNESS 25
#define NUM_LEDS 120
CRGB leds[NUM_LEDS];
const int tasterPin = 2; // Taster an Pin 2 angeschlossen
// Variablen
byte lmode = 0; // Variable für die verschiedenen festgelegten Farben
bool tasterStatus = LOW; // Variable zu speichern des Tasterstatus
void setup() {
FastLED.addLeds<LED_TYPE, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
LEDS.showColor(CRGB(0, 0, 0));
Serial.begin(9600);
Serial.println(F("Anfang"));
pinMode(tasterPin, INPUT_PULLUP); // Setzt den TasterPin als Eingang
}
void taster()
{
// Abfrage ob der Taster gedrückt ist
tasterStatus = digitalRead(tasterPin);
// Wenn Taster gedrückt ist...
if (tasterStatus == HIGH)
{
lmode++; // Lichtmodus +1
Serial.println(lmode);
delay(300); // 300ms warten
}
}
void loop()
{
//+++++++++++++++ LEUCHTPROGRAMME +++++++++++++++++
// Modus 0 = Licht aus
if (lmode == 0)
{
taster();
{
EVERY_N_MILLISECONDS(20)
{
FastLED.show();
}
}
}
// Modus 1 = Blau
else if (lmode == 1)
{
taster();
{
EVERY_N_MILLISECONDS(20)
{
fade2();
FastLED.show();
}
}
}
// Modus 2 = Rot
else if (lmode == 2)
{
{
EVERY_N_MILLISECONDS(20)
{
FadeInOut(0xff, 0x00, 0x00);
FastLED.show();
}
}
}
// Anzahl der Leuchtmodi auf 3 begrenzen. (0 bis 2)
else
{
lmode = 0;
}
}
void fade2()
{
fadeToBlackBy( leds, NUM_LEDS, 10);
byte pos = (beat8(10) * NUM_LEDS) / 255;
leds[pos] = CHSV( 160, 255, 255);
}
void FadeInOut(byte red, byte green, byte blue) {
float r, g, b;
for (int k = 0; k < 256; k = k + 1) {
r = (k / 256.0) * red;
g = (k / 256.0) * green;
b = (k / 256.0) * blue;
setAll(r, g, b);
FastLED.show();
}
for (int k = 255; k >= 0; k = k - 2) {
r = (k / 256.0) * red;
g = (k / 256.0) * green;
b = (k / 256.0) * blue;
setAll(r, g, b);
FastLED.show();
}
}
void setAll(byte red, byte green, byte blue) {
for (int i = 0; i < NUM_LEDS; i++ ) {
setPixel(i, red, green, blue);
}
FastLED.show();
}
void setPixel(int Pixel, byte red, byte green, byte blue) {
taster();
// FastLED
leds[Pixel].r = red;
leds[Pixel].g = green;
leds[Pixel].b = blue;
}