WS2812B zwei Programme mit Taster umschalten

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 :smiling_imp:
  • 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;
}