Nach Tastendruck Drehschalter auswerten

OK. ich Teile den Code auf 2 Teile auf.
Teil 1 - >

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 6

Adafruit_NeoPixel strip = Adafruit_NeoPixel(36, PIN, NEO_GRB + NEO_KHZ800);

const int dsIPin[5] = {8,9,10,11,12}; // drehschalterInputPins
byte lichtEffekt = 0;                 // kein Lichteffekt gewählt 
byte Dir = 0;                         // Dir = die Bewegungsrichtung des Lauflichts. (-1 = links; 0 = stop; +1 = rechts)
byte Step = 1;                        // Schrittweite, zeigt an um wieviele pixel das Lauflicht in einem Schritt wandert               
bool Init = true;                     // Init aktiviert die initialisierung des jeweiligen Lichteffektes
bool keyRelease = true;               // ist true,wenn Taste wieder losgelassen wurde
bool llichtRun = false;               // wird benutzt um zu unterscheiden ob Richtungstaste das Erste oder Zweite mal gderueckt
int Interval = 0;                     /* Verzögerung beim Lauflicht in Millisekunden Von einem Pixel zum nächsten. 
                                         (0=kein lauflicht) je kleiner der Wert, desto schneller läuft das Lauflicht. */
unsigned long IntervalStart;  
                                   
void setup() {
 IntervalStart = millis(); 
  strip.begin();
  strip.show();

  pinMode(3,INPUT_PULLUP);          // Taste LINKS, mit internem pullup Widerstand
  pinMode(4,INPUT_PULLUP);          // Taste STOP,  mit internem pullup Widerstand
  pinMode(5,INPUT_PULLUP);          // Taste RECHTS, mit internem pullup Widerstand
  for (int i=0; i<5; i++){
    pinMode(dsIPin[i],INPUT_PULLUP);   // Pins an denen der Drehschalter hängt auf Input und Pullup-Widerstand einschalten
  }
}

void loop() {
  if(readButton(3)) {
    if (llichtRun == false && keyRelease == true) {         // Taste das erste mal gedrückt 
        lichtEffekt = readDSwitch();  // lichtEffekt erhält die Position des Drehschalters. (1-5) 
        Init = true;                  // bei 'true' wird der Lichteffekt Initialisiert und gestartet.
        Dir = 1;                      // "Links"
        callLichtEffekt(lichtEffekt); // Lichteffekt ausführen
        llichtRun = true;             // merken dass lichteffekt gestartet
        keyRelease = false;           // Taste noch nicht wieder losgelassen
    }
    else if (llichtRun == true && keyRelease == true) {      // Taste das 2. mal gedrückt
      Interval = 0;                   // Interval aussschalten , Lauflicht anhalten
      Dir = 0;                        // Richtung auf 0 ( keine Laufrichtung)
      clearStrip();                   // Strip löschen
      lichtEffekt = 0;                // Kein LichtEffekt gewählt
      llichtRun = false;              // Taste für erneuten start vorbereiten
    }
  }
  
  if(readButton(4) && keyRelease == true) {   // "Stop" - Taste gedrückt
    Interval = 0;                     // Interval aussschalten , Lauflicht anhalten
    Dir = 0;                          // Richtung auf 0 ( keine Laufrichtung)
    stop();                           // 'Stopp'-Band anzeigen
    keyRelease = false;               // Taste noch nicht wieder losgelassen
    llichtRun = false;                // Richtungstasten für erneuten Start vorbereiten
    lichtEffekt = 0;                  // Kein LichtEffekt gewählt
  }
  
  if(readButton(5)) {
    if (llichtRun == false && keyRelease == true) {         // Taste das erste mal gedrückt 
        lichtEffekt = readDSwitch();   // lichtEffekt erhält die Position des Drehschalters. (1-5) 
        Init = true;                   // bei 'true' wird der Lichteffekt Initialisiert und gestartet.
        Dir = -1;                      // "Links"
        callLichtEffekt(lichtEffekt);  // Lichteffekt ausführen
        llichtRun = true;              // merken dass lichteffekt gestartet
        keyRelease = false;            // Taste noch nicht wieder losgelassen
    }
    else if (llichtRun == true && keyRelease == true) {      // Taste das 2. mal gedrückt
      Interval = 0;                    // Interval aussschalten , Lauflicht anhalten
      Dir = 0;                         // Richtung auf 0 ( keine Laufrichtung)
      clearStrip();                    // Strip löschen
      lichtEffekt = 0;                 // Kein LichtEffekt gewählt
      llichtRun = false;               // Taste für erneuten start vorbereiten
    } 
  }

  if ((readButton(3) + readButton(4) + readButton(5) == 0) && keyRelease == false) keyRelease = true; /* gedrückte Taste 
                                                                                                        wurde losgelassen */
  
  if (Interval && (millis() - IntervalStart >= Interval)) callLichtEffekt(lichtEffekt);     /* bei laufenden Lichtern 
                                                                                              nächsten Schritt ausführen */
}
//Ende der Schleife (loop)

//
byte readDSwitch() {                       // Fragt den Drehschalter ab
  byte dsp=0;                              // hilfsvariable DrehSchalterPosition
  for(int n=0; n<5; n++) {
    if(digitalRead(dsIPin[n]) == LOW) {    // DrehSchalterInputs nacheinander abfragen, wenn LOW, Schalterposition gefunden
      dsp = n+1;                           // dsp bekommt nun den Positionswert (1-5)  
      break;                               // Schleife verlassen, weil Pos gefunden
    }
  }
  return dsp;                              //Positionswert zurückgeben
}

//
int readButton(int pin) {        // Taste einlesen
  if(digitalRead(pin) == LOW) {  // Analog Eingang abfragen
    delay(150);                  // Wartezeit zum erneut abfragen
    if(digitalRead(pin) == LOW)  // Analog Eingang erneut abfragen
      return 1;                  // war gedrückt
  }
      return 0;                  // war nicht gedrückt
}


// Strip löschen (all LED's off)
void clearStrip() {
   for(int i=0; i<strip.numPixels(); i++) {        // Schleife in der Länge des NeoPixel-Strip
    strip.setPixelColor(i,strip.Color(0,0,0));     // Pixel Ausschalten
    strip.show();
   }  
}
//

// Funktion STOP
// zuerst alle Pixel aus, dann die mittleren 6 auf Rot
void stop() {
  clearStrip();                     // Habe das löschen des Strip's in eine eigene Funktion gepackt, da mehrfach benötigt.
 
  for(int i=0; i<6; i++) {
    strip.setPixelColor(15+i,strip.Color(150,0,0));
    strip.show();
   }
}

void callLichtEffekt(byte LiEf) {    // LiEf enthält die Nummer der auszuführenden Funktion
  switch(LiEf){
    case 1:
    run3Points();
    break;

    case 2:
    // Lichteffekt 2 ausführen
    lichtEffekt2();
    break;

    case 3:
    // Lichteffekt 3 ausführen
    lichtEffekt3();
    break;

    case 4:
    // Lichteffekt 4 ausführen
    lichtEffekt4();
    break;

    case 5:
    richtung();
    break; 
  }
  IntervalStart = millis();
}
//

-> ende Teil 1