Neopixel Treppenlicht mit Taster

agmue:
Alternativ könnte man das auch mit einem Merker machen, der von der Schrittkette gesetzt wird, die Schrittkette geht gleich zum nächsten Schritt. Wegen des Merkers wird die Treppenbeleuchtung geändert, bis diese Aktion abgeschlossen ist und der Merker zurückgesetzt werden kann.

Du meinst also in etwa so (hab das noch nicht ausprobiert, aber für mich wäre das vom Verständnis einfacher):

case NACH_OBEN_AN:
 merker = 1
 schritt = AN;
    break;

if merker = 1{
for (int oben = LED_ANZAHL; oben >= 0; oben--) {

        strip.setPixelColor(oben, strip.Color(0, 0, 0, 0));
        strip.show();
        delay(GESCHWINDIGKEIT);
      }
      merker = 0;

agmue:
Mit rauf(true) wird die Funktion rauf mit dem Parameter true aufgerufen. Die Funktion übernimmt den Parameter true in die Variable an, die den Typ bool hat. Ist die Animation noch aktiv, liefert sie mittels return false; ein false zurück, ist sie fertig mittels return true; ein true.

Die Bedingung if wertet den Rückgabewert aus und macht bei false nichts, bleibt also in dem Schritt, während bei true zum nächsten Schritt gewechselt wird.

Vielen Dank, das ist wirklich eine sehr gute Erklärung, ich denke jetzt habe ich es verstanden (Oder naja, ich kann den Code jetzt so lesen, wenn ich so etwas selber aus dem Kopf schreiben müsste hätte ich keine Chance) Aber immerhin schon einmal lesen und verstehen ;D Ich Versuche jetzt noch ein bisschen deine Version zum laufen zu bringen. Mittlerweile habe ich es schon einmal so zum laufen gebracht:

 switch (schritt) {
    case AUS:
      if (digitalRead(taster_unten)) schritt = NACH_OBEN_AN;
      if (digitalRead(taster_oben)) schritt = NACH_UNTEN_AN;
      break;
      
  case NACH_OBEN_AN:
      for (int unten = 0; unten < LED_ANZAHL; unten++) {

        strip.setPixelColor(unten, strip.Color(0, 0, 0, HELLIGKEIT));
        strip.show();
        delay(GESCHWINDIGKEIT);
      }
      schritt = AN;
      break;
    case NACH_UNTEN_AN:
      for (int oben = LED_ANZAHL; oben >= 0; oben--) {

        strip.setPixelColor(oben, strip.Color(0, 0, 0, HELLIGKEIT));
        strip.show();
        delay(GESCHWINDIGKEIT);
      } schritt = AN;
      break;
    case AN:
      if (digitalRead(taster_unten)) schritt = NACH_UNTEN_AUS;
      if (digitalRead(taster_oben)) schritt = NACH_OBEN_AUS;
      break;
    case NACH_OBEN_AUS:
      for (int unten = 0; unten < LED_ANZAHL; unten++) {

        strip.setPixelColor(unten, strip.Color(0, 0, 0, 0));
        strip.show();
        delay(GESCHWINDIGKEIT);
      }
      schritt = AUS;
      break;
    case NACH_UNTEN_AUS:
      for (int oben = LED_ANZAHL; oben >= 0; oben--) {

        strip.setPixelColor(oben, strip.Color(0, 0, 0, 0));
        strip.show();
        delay(GESCHWINDIGKEIT);
      }
      schritt = AUS;
      break;
  }

}

Ich experimentiere jetzt noch etwas herum, ob ich es schaffe delay mit millis zu ersetzen, so dass das Lauflicht auch abgebrochen werden könnte.

Hast du mir noch einen Rat zum Thema Taster entprellen? Wenn ich mit delay arbeite brauche ich das (wenn ich das richtig verstanden habe) nicht, da Tastereingaben sowieso ignoriert werden solange das Lauflicht läuft. Aber wenn ich dann mit millis arbeite werde ich mich da wohl auch noch besser einarbeiten müssen (wobei es ein wollen ist und nicht müssen).
Stimmt das so?

Noch einmal vielen Dank an alle für die Tipps und besonders an agume für deine Zeit :slight_smile:

Stromer:
Du meinst also in etwa so

case NACH_OBEN_AN:

merker = 1
schritt = AN;
    break;

if merker = 1{
for (int oben = LED_ANZAHL; oben >= 0; oben--) {

strip.setPixelColor(oben, strip.Color(0, 0, 0, 0));
        strip.show();
        delay(GESCHWINDIGKEIT);
      }
      merker = 0;

Ja fast, denn es bedarf noch einer Bedingung, wenn am Ende des Streifens angekommen, dann merker = 0;.

Stromer:
Ich experimentiere jetzt noch etwas herum, ob ich es schaffe delay mit millis zu ersetzen, so dass das Lauflicht auch abgebrochen werden könnte.

In meinem Programm in #13 findest Du kein delay und es ist auch nicht notwendig. Die Geschwindigkeit wird mit const uint32_t intervall = 20; eingestellt.

Stromer:
Hast du mir noch einen Rat zum Thema Taster entprellen?

Wenn Du auf eine Taste drückst, damit die Animation startet, dann brauchst Du keine Entprellung, weil die Animation viel länger als die Prellzeit ist.

Stromer:
Noch einmal vielen Dank an alle für die Tipps und besonders an agume für deine Zeit :slight_smile:

Bitte gerne :slight_smile:

Bleibe gelassen, kreativ und gesund!