Weihnachtslichterkette Verbessungsvorschläge?

Guten Tag,
ich habe ein Programm für eine Weihnachtslichterkette geschrieben und wollte fragen wie ihr ihn findet bzw. Verbessungsvorschläge für mich habt (bitte mit Erklärung :cold_sweat: :zipper_mouth_face: ). Kann man im Programm1 bis Programm3 irgendwie die Anweisung verkürzen?

Programm 1: Die LEDs leuchten abwechseln hintereinander jeweils für 1 Sekunde.

Programm 2: Die LEDs einer Farbe leuchten zusammen jeweils für 2 Sekunden. Dabei wechseln sich die Farben hintereinander ab.

Programm 3: Die gelben LEDs leuchten die ganze Zeit über. Die roten (alle) und die blauen (alle) LEDs leuchten jeweils abwechselnd für 1 Sekunde.

Hier der Code:

#define LEDrot        1
#define LEDgelb       2
#define LEDblau       3

#define LEDrot2       4
#define LEDgelb2      5
#define LEDblau2      6

#define LEDrot3       7
#define LEDgelb3      8
#define LEDblau3      9

const int Taster =    11;
const int Taster2 =   12;
const int Taster3 =   13;

int Zeahler =   1;

void setup()
{
  pinMode(LEDrot, OUTPUT);
  pinMode(LEDrot2, OUTPUT);
  pinMode(LEDrot3, OUTPUT);

  pinMode(LEDgelb, OUTPUT);
  pinMode(LEDgelb2, OUTPUT);
  pinMode(LEDgelb3, OUTPUT);

  pinMode(LEDblau, OUTPUT);
  pinMode(LEDblau2, OUTPUT);
  pinMode(LEDblau3, OUTPUT);

  pinMode(Taster, INPUT_PULLUP);
  pinMode(Taster2, INPUT_PULLUP);
  pinMode(Taster3, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(Taster)==LOW) 
  {
    Zeahler = 1;
  }

  if (digitalRead(Taster2)==LOW) 
  {
    Zeahler = 2;
  }

  if (digitalRead(Taster3)==LOW) 
  {
    Zeahler = 3;
  }

  if (Zeahler == 1)
  {
    Programm1();
  }

  if (Zeahler == 2)
  {
    Programm2();
  }

    if (Zeahler == 3)
  {
    Programm3();
  }
}


void Programm1()
{
  digitalWrite(LEDrot, HIGH);
  delay(1000);
  digitalWrite(LEDrot, LOW);

  digitalWrite(LEDgelb, HIGH);
  delay(1000);
  digitalWrite(LEDgelb, LOW);

  digitalWrite(LEDblau, HIGH);
  delay(1000);
  digitalWrite(LEDblau, LOW);

  digitalWrite(LEDrot2, HIGH);
  delay(1000);
  digitalWrite(LEDrot2, LOW);

  digitalWrite(LEDgelb2, HIGH);
  delay(1000);
  digitalWrite(LEDgelb2, LOW);

  digitalWrite(LEDblau2, HIGH);
  delay(1000);
  digitalWrite(LEDblau2, LOW);

  digitalWrite(LEDrot3, HIGH);
  delay(1000);
  digitalWrite(LEDrot3, LOW);

  digitalWrite(LEDgelb3, HIGH);
  delay(1000);
  digitalWrite(LEDgelb3, LOW);

  digitalWrite(LEDblau3, HIGH);
  delay(1000);
  digitalWrite(LEDblau3, LOW);
}

void Programm2()
{
  digitalWrite(LEDrot, HIGH);
  digitalWrite(LEDrot2, HIGH);
  digitalWrite(LEDrot3, HIGH);
  delay(2000);
  digitalWrite(LEDrot, LOW);
  digitalWrite(LEDrot2, LOW);
  digitalWrite(LEDrot3, LOW);

  digitalWrite(LEDgelb, LOW);
  digitalWrite(LEDgelb2, LOW);
  digitalWrite(LEDgelb3, LOW);
  delay(2000);
  digitalWrite(LEDgelb, HIGH);
  digitalWrite(LEDgelb2, HIGH);
  digitalWrite(LEDgelb3, HIGH);

  digitalWrite(LEDblau, LOW);
  digitalWrite(LEDblau2, LOW);
  digitalWrite(LEDblau3, LOW);
  delay(2000);
  digitalWrite(LEDblau, HIGH);
  digitalWrite(LEDblau2, HIGH);
  digitalWrite(LEDblau3, HIGH);
}

void Programm3()
{
  digitalWrite(LEDgelb, HIGH);
  digitalWrite(LEDgelb2, HIGH);
  digitalWrite(LEDgelb3, HIGH);

  digitalWrite(LEDrot, HIGH);
  delay(1000);
  digitalWrite(LEDrot, LOW);

  digitalWrite(LEDrot2, HIGH);
  delay(1000);
  digitalWrite(LEDrot2, LOW);

  digitalWrite(LEDrot3, HIGH);
  delay(1000);
  digitalWrite(LEDrot3, LOW);

  digitalWrite(LEDblau, HIGH);
  delay(1000);
  digitalWrite(LEDblau, LOW);

  digitalWrite(LEDblau2, HIGH);
  delay(1000);
  digitalWrite(LEDblau2, LOW);

  digitalWrite(LEDblau3, HIGH);
  delay(1000);
  digitalWrite(LEDblau3, LOW);
}

Später möchte ich statt drei Taster nur noch einen Taster verwenden, wenn dies möglich ist kann mir jemand da helfen?

Ein paar spontane Anmerkungen:

  • Welche Hardware verwendest Du? Beim Uno sind die Pins 0 und 1 für USB reserviert, da LEDs dranzuhängen, ist keine gute Idee.
  • Das blockierende delay() zusammen mit Tastendrücken ist auch keine gute Idee. Verwende besser millis().

Beim Übergang zu einem Taster mußt Du diesen entprellen und eine Ablaufsteuerung (endlicher Automat, finite state machine) anlegen.

agmue:
Ein paar spontane Anmerkungen:

  • Welche Hardware verwendest Du? Beim Uno sind die Pins 0 und 1 für USB reserviert, da LEDs dranzuhängen, ist keine gute Idee.
  • Das blockierende delay() zusammen mit Tastendrücken ist auch keine gute Idee. Verwende besser millis().

Beim Übergang zu einem Taster mußt Du diesen entprellen und eine Ablaufsteuerung (endlicher Automat, finite state machine) anlegen.

  1. Ich verwende den Arduino Mega 2560, muss ich dort auch die Pin's beachten oder nicht?

  2. Wie genau benutze ich in meinem Code "millis()"? Ich habe etwas von "unsigfned long Variablen" gelesen, da ich aber noch ein Anfänger bin, verstehe ich vieles noch nicht.... Könnte mir vllt. noch jemand in einfachen und Verständlichen worten erklären, worin genau der Unterschied zwischen "delay()" und "millis()" liegt?

" Beim Übergang zu einem Taster mußt Du diesen entprellen und eine Ablaufsteuerung (endlicher Automat, finite state machine) anlegen" - Zitatende
Es tut mir Leid, aber ich verstehe nicht genau, was das genau Bedeutet?

Barthalo:

  1. Ich verwende den Arduino Mega 2560, muss ich dort auch die Pin's beachten oder nicht?

  2. OK, vielen Dank! Die Einheit "millis" ist die selbe wie beim "delay", also 1000 Millisekunden = 1 Sekunden, oder gibt es dort eine andere Messeinheit?

" Beim Übergang zu einem Taster mußt Du diesen entprellen und eine Ablaufsteuerung (endlicher Automat, finite state machine) anlegen" - Zitatende
Es tut mir Leid, aber ich verstehe nicht genau, was das genau Bedeutet?

1)Ja, auch beim MEGA werden 0 und 1 für die USB-Verbindung bzw Hochladen gebraucht. Du hast aber noch 50 andere Pins Die Du verwenden könntest.
2) ja ist immer Millisekunden.

Entprellen damit ein Tastendruck nicht öfters erkannt wird.

Endlicher Automat: versuch mal etwas zu suchen.

Grüße Uwe

Ich habe die LEDs mal alle einen Pin weiterbewegt.

Für die Taste würde ich aus Bequemlichkeit eine Library verwenden.

Auf delay solltest du vollständig verzichten.

Ich hoffe ich habe deine Programme nicht zu sehr verwürfelt, hier einen 1-Tasten Version.

#include <Bounce2.h>

const byte LEDrot = 2;
const byte LEDgelb = 3;
const byte LEDblau = 4;
const byte LEDrot2 = 5;
const byte LEDgelb2 = 6;
const byte LEDblau2 = 7;
const byte LEDrot3 = 8;
const byte LEDgelb3 = 9;
const byte LEDblau3 = 10;

const byte Taster = 11;

Bounce Taste;
byte ausgewaehltesProgramm = 1;
byte Phase;
unsigned long PhaseGestartet;
unsigned long PhasenLaenge;

void setup() {
  for (byte i = LEDrot; i <= LEDblau3; i++) {
    pinMode(i, OUTPUT);
  }
  Taste.attach(Taster, INPUT_PULLUP);
}

void loop() {
  unsigned long topLoop = millis();
  if (Taste.update() && Taste.fell()) {
    if (++ausgewaehltesProgramm > 3) {
      ausgewaehltesProgramm = 1;
    }
    Phase = 0;
    PhaseGestartet = millis();
    alleAus();
  }
  if (ausgewaehltesProgramm == 1) {
    Programm1(topLoop);
  } else if (ausgewaehltesProgramm == 2) {
    Programm2(topLoop);
  } else if (ausgewaehltesProgramm == 3)  {
    Programm3(topLoop);
  }
}

void Programm1(unsigned long topLoop) {
  if (Phase == 0) {
    digitalWrite(LEDrot, HIGH);
    Phase = 1;
    PhasenLaenge = 1000;
  } else if (topLoop - PhaseGestartet >= PhasenLaenge) {
    PhaseGestartet = topLoop;
    if (++Phase > 9) {
      Phase = 1;
    }
    switch (Phase) {
      case 1:
        digitalWrite(LEDrot, LOW);
        digitalWrite(LEDgelb, HIGH);
        break;
      case 2:
        digitalWrite(LEDgelb, LOW);
        digitalWrite(LEDblau, HIGH);
        break;
      case 3:
        digitalWrite(LEDblau, LOW);
        digitalWrite(LEDrot2, HIGH);
        break;
      case 4:
        digitalWrite(LEDrot2, LOW);
        digitalWrite(LEDgelb2, HIGH);
        break;
      case 5:
        digitalWrite(LEDgelb2, LOW);
        digitalWrite(LEDblau2, HIGH);
        break;
      case 6:
        digitalWrite(LEDblau2, LOW);
        digitalWrite(LEDrot3, HIGH);
        break;
      case 7:
        digitalWrite(LEDrot3, LOW);
        digitalWrite(LEDgelb3, HIGH);
      case 8:
        digitalWrite(LEDgelb3, LOW);
        digitalWrite(LEDblau3, HIGH);
        break;
      case 9:
        digitalWrite(LEDblau3, LOW);
        digitalWrite(LEDrot, HIGH);
        break;
    }
  }
}

void Programm2(unsigned long topLoop) {
  if (Phase == 0) {
    alleRoten(HIGH);
    Phase = 1;
    PhasenLaenge = 2000;
  } else if (topLoop - PhaseGestartet >= PhasenLaenge) {
    PhaseGestartet = topLoop;
    if (++Phase > 3) {
      Phase = 1;
    }
    switch (Phase) {
      case 1:
        alleRoten(LOW);
        alleGelben(LOW);
        break;
      case 2:
        alleGelben(HIGH);
        alleBlauen(LOW);
        break;
      case 3:
        alleBlauen(HIGH);
        alleRoten(HIGH);
        break;
    }
  }
}

void Programm3(unsigned long topLoop) {
  if (Phase == 0) {
    digitalWrite(LEDgelb, HIGH);
    digitalWrite(LEDgelb2, HIGH);
    digitalWrite(LEDgelb3, HIGH);
    digitalWrite(LEDrot, HIGH);
    Phase = 1;
    PhasenLaenge = 1000;
  } else if (topLoop - PhaseGestartet >= PhasenLaenge) {
    PhaseGestartet = topLoop;
    if (++Phase > 7) {
      Phase = 1;
    }
    switch (Phase) {
      case 1:
        digitalWrite(LEDrot, LOW);
        digitalWrite(LEDrot2, HIGH);
        break;
      case 2:
        digitalWrite(LEDrot2, LOW);
        digitalWrite(LEDrot3, HIGH);
        break;
      case 3:
        digitalWrite(LEDrot2, LOW);
        digitalWrite(LEDrot3, HIGH);
        break;
      case 4:
        digitalWrite(LEDrot3, LOW);
        digitalWrite(LEDblau, HIGH);
        break;
      case 5:
        digitalWrite(LEDblau, LOW);
        digitalWrite(LEDblau2, HIGH);
        break;
      case 6:
        digitalWrite(LEDblau2, LOW);
        digitalWrite(LEDblau3, HIGH);
        break;
      case 7:
        digitalWrite(LEDblau3, LOW);
        digitalWrite(LEDrot, HIGH);
        break;
    }
  }
}

void alleAus() {
  alleRoten(LOW);
  alleGelben(LOW);
  alleBlauen(LOW);
}

void alleRoten(byte aufWas) {
  digitalWrite(LEDrot, aufWas);
  digitalWrite(LEDrot2, aufWas);
  digitalWrite(LEDrot3, aufWas);
}

void alleGelben(byte aufWas) {
  digitalWrite(LEDgelb, aufWas);
  digitalWrite(LEDgelb2, aufWas);
  digitalWrite(LEDgelb3, aufWas);
}

void alleBlauen(byte aufWas) {
  digitalWrite(LEDblau, aufWas);
  digitalWrite(LEDblau2, aufWas);
  digitalWrite(LEDblau3, aufWas);
}

Whandall:
Ich habe mal die LEDs mal alle einen Pin weiterbewegt.

Für die Taste würde ich aus Bequemlichkeit eine Library verwenden.

Auf delay solltest du vollständig verzichten.

Ich hoffe ich habe deine Programme nicht zu sehr verwürfelt, hier einen 1-Tasten Version.

#include <Bounce2.h>

const byte LEDrot = 2;
const byte LEDgelb = 3;
const byte LEDblau = 4;
const byte LEDrot2 = 5;
const byte LEDgelb2 = 6;
const byte LEDblau2 = 7;
const byte LEDrot3 = 8;
const byte LEDgelb3 = 9;
const byte LEDblau3 = 10;

const byte Taster = 11;

Bounce Taste;
byte ausgewaehltesProgramm = 1;
byte Phase;
unsigned long PhaseGestartet;
unsigned long PhasenLaenge;

void setup() {
  for (byte i = LEDrot; i <= LEDblau3; i++) {
    pinMode(i, OUTPUT);
  }
  Taste.attach(Taster, INPUT_PULLUP);
}

void loop() {
  unsigned long topLoop = millis();
  if (Taste.update() && Taste.fell()) {
    if (++ausgewaehltesProgramm > 3) {
      ausgewaehltesProgramm = 1;
    }
    Phase = 0;
    PhaseGestartet = millis();
    alleAus();
  }
  if (ausgewaehltesProgramm == 1) {
    Programm1(topLoop);
  } else if (ausgewaehltesProgramm == 2) {
    Programm2(topLoop);
  } else if (ausgewaehltesProgramm == 3)  {
    Programm3(topLoop);
  }
}

void Programm1(unsigned long topLoop) {
  if (Phase == 0) {
    digitalWrite(LEDrot, HIGH);
    Phase = 1;
    PhasenLaenge = 1000;
  } else if (topLoop - PhaseGestartet >= PhasenLaenge) {
    PhaseGestartet = topLoop;
    if (++Phase > 9) {
      Phase = 1;
    }
    switch (Phase) {
      case 1:
        digitalWrite(LEDrot, LOW);
        digitalWrite(LEDgelb, HIGH);
        break;
      case 2:
        digitalWrite(LEDgelb, LOW);
        digitalWrite(LEDblau, HIGH);
        break;
      case 3:
        digitalWrite(LEDblau, LOW);
        digitalWrite(LEDrot2, HIGH);
        break;
      case 4:
        digitalWrite(LEDrot2, LOW);
        digitalWrite(LEDgelb2, HIGH);
        break;
      case 5:
        digitalWrite(LEDgelb2, LOW);
        digitalWrite(LEDblau2, HIGH);
        break;
      case 6:
        digitalWrite(LEDblau2, LOW);
        digitalWrite(LEDrot3, HIGH);
        break;
      case 7:
        digitalWrite(LEDrot3, LOW);
        digitalWrite(LEDgelb3, HIGH);
      case 8:
        digitalWrite(LEDgelb3, LOW);
        digitalWrite(LEDblau3, HIGH);
        break;
      case 9:
        digitalWrite(LEDblau3, LOW);
        digitalWrite(LEDrot, HIGH);
        break;
    }
  }
}

void Programm2(unsigned long topLoop) {
  if (Phase == 0) {
    alleRoten(HIGH);
    Phase = 1;
    PhasenLaenge = 2000;
  } else if (topLoop - PhaseGestartet >= PhasenLaenge) {
    PhaseGestartet = topLoop;
    if (++Phase > 3) {
      Phase = 1;
    }
    switch (Phase) {
      case 1:
        alleRoten(LOW);
        alleGelben(LOW);
        break;
      case 2:
        alleGelben(HIGH);
        alleBlauen(LOW);
        break;
      case 3:
        alleBlauen(HIGH);
        alleRoten(HIGH);
        break;
    }
  }
}

void Programm3(unsigned long topLoop) {
  if (Phase == 0) {
    digitalWrite(LEDgelb, HIGH);
    digitalWrite(LEDgelb2, HIGH);
    digitalWrite(LEDgelb3, HIGH);
    digitalWrite(LEDrot, HIGH);
    Phase = 1;
    PhasenLaenge = 1000;
  } else if (topLoop - PhaseGestartet >= PhasenLaenge) {
    PhaseGestartet = topLoop;
    if (++Phase > 7) {
      Phase = 1;
    }
    switch (Phase) {
      case 1:
        digitalWrite(LEDrot, LOW);
        digitalWrite(LEDrot2, HIGH);
        break;
      case 2:
        digitalWrite(LEDrot2, LOW);
        digitalWrite(LEDrot3, HIGH);
        break;
      case 3:
        digitalWrite(LEDrot2, LOW);
        digitalWrite(LEDrot3, HIGH);
        break;
      case 4:
        digitalWrite(LEDrot3, LOW);
        digitalWrite(LEDblau, HIGH);
        break;
      case 5:
        digitalWrite(LEDblau, LOW);
        digitalWrite(LEDblau2, HIGH);
        break;
      case 6:
        digitalWrite(LEDblau2, LOW);
        digitalWrite(LEDblau3, HIGH);
        break;
      case 7:
        digitalWrite(LEDblau3, LOW);
        digitalWrite(LEDrot, HIGH);
        break;
    }
  }
}

void alleAus() {
  alleRoten(LOW);
  alleGelben(LOW);
  alleBlauen(LOW);
}

void alleRoten(byte aufWas) {
  digitalWrite(LEDrot, aufWas);
  digitalWrite(LEDrot2, aufWas);
  digitalWrite(LEDrot3, aufWas);
}

void alleGelben(byte aufWas) {
  digitalWrite(LEDgelb, aufWas);
  digitalWrite(LEDgelb2, aufWas);
  digitalWrite(LEDgelb3, aufWas);
}

void alleBlauen(byte aufWas) {
  digitalWrite(LEDblau, aufWas);
  digitalWrite(LEDblau2, aufWas);
  digitalWrite(LEDblau3, aufWas);
}

Erstmals vielen Dank!

void alleRoten(byte aufWas) {
  digitalWrite(LEDrot, aufWas);
  digitalWrite(LEDrot2, aufWas);
  digitalWrite(LEDrot3, aufWas);
}

void alleGelben(byte alleAN) {
  digitalWrite(LEDgelb, aufWas);
  digitalWrite(LEDgelb2, aufWas);
  digitalWrite(LEDgelb3, aufWas);
}

void alleBlauen(byte aufWas) {
  digitalWrite(LEDblau, aufWas);
  digitalWrite(LEDblau2, aufWas);
  digitalWrite(LEDblau3, aufWas);
}

Die Gelben sollen alle gleichzeitig an sein, damit sind "LEDgelb" bis "LEDgelb3" gemeint.
Die alle Roten und Blauen sollen jeweils abwechselnd für 1 Sekunde lang Blinken.

Jetzt Leider noch ein paar mehr Fragen, da ich den Code nicht ganz nachvollziehen kann.

  1. Wofür steht das "#include <Bounce2.h>"?
  2. Warum benutzten Sie "const byte" als Variable?
  3. Was bewirkt "Taste.attach", wieso benutzt man dort nicht auch "pinMode"?
  4. Wofür steht "topLoop"?
  5. In Zeile 117, "alleRoten(HIGH);" wie genau erkennt der Arduino den Befehl, der ist doch gar nicht definiert worden? Das selbe in der Phase im zweiten Programm (Zeile 132 bis 141). Dort heißt es "alleRoten(LOW);, alleGelben(LOW);,..."

Ob ich mich mit den Farben verhaspelt habe musst du testen, meine LEDs hier sind 8 x weiss und BUILTIN.

Wenn ein Programm startet wird ein Grundzustand herbeigeführt, dann folgen die zyklischen Schritte.
Was sich einfach zusammenfassen ließ, habe ich zusammengefasst.

Bei einer Weihnachtsbeleuchtung würde ich mir ein etwas Abwechslungsreicheres wünschen,
kurzes zufälliges Blinken als "Glitzern" oder so.

Jedenfalls kannst du jetzt einfach neue Programme einbauen, ohne neue Tasten anzubauen. :wink:

Solange du keine delays benutzt bleibt die Taste benutzbar.

void alleRoten(byte aufWas) {
  digitalWrite(LEDrot, aufWas);
  digitalWrite(LEDrot2, aufWas);
  digitalWrite(LEDrot3, aufWas);
}

Was genau heißt das?

Dir war noch nicht bewusst, dass digitalRead auch Variablen als Parameter verträgt?

Die Funktion macht mit allen roten LEDs das gleiche, was enscheidet sich beim Aufruf.

  alleRoten(HIGH);  // mach sie an
  alleRoten(LOW);   // mach sie aus

byte wieSollenSieSein = HIGH;  // Variablen gehen natürlich ebens0

  alleRoten(wieSollenSieSein);

Ahhh, Ok das wusste ich wirklich noch nicht

Barthalo:
5. In Zeile 117, "alleRoten(HIGH);" wie genau erkennt der Arduino den Befehl, der ist doch gar nicht definiert worden?

Am besten höre auf in "Befehlen" zu denken. Das sind Funktionen.

Normalerweise stimmt es dass man Funktionen vor ihrer Verwendung mindestens deklarieren muss. Eine Funktionsdefinition ist was anderes - nämlich deren Implementierung. Dazu sind Funktionsprototypen da. Die Arduino IDE erledigt dass aber automatisch im Hintergrund und erstellt automatisch die Prototypen vor dem Kompilieren.

Warum benutzten Sie "const byte" als Variable?

Das ist eine Konstante und keine Variable. Die wird einmal gesetzt und nie wieder verändert. Das const verhindert dass man sie ändern kann und hilft dem Compiler dabei sie wegzuoptimieren damit kein Speicher belegt wird

#define macht scheinbar gleiche, aber ist lediglich eine Text-Ersetzung vor dem Kompilieren. Und damit nicht typsicher.

Schau dir das LED-Programm mal an

void Programm4(unsigned long topLoop) {
  static byte selectedLED;
  if (Phase == 0) {
    Phase = 1;
    PhasenLaenge = 20;
  } else if (topLoop - PhaseGestartet >= PhasenLaenge) {
    PhaseGestartet = topLoop;
    if (++Phase > 2) {
      Phase = 1;
    }
    if (Phase == 1) {
      selectedLED = LEDrot + random(LEDblau3 - LEDrot + 1);
      digitalWrite(selectedLED, HIGH);
      PhasenLaenge = random(30);
    } else {
      digitalWrite(selectedLED, LOW);
      PhasenLaenge = random(600);
    }
  }
}

Whandall:
Ich habe mal die LEDs mal alle einen Pin weiterbewegt.

Für die Taste würde ich aus Bequemlichkeit eine Library verwenden.

Auf delay solltest du vollständig verzichten.

Ich hoffe ich habe deine Programme nicht zu sehr verwürfelt, hier einen 1-Tasten Version.

#include <Bounce2.h>

const byte LEDrot = 2;
const byte LEDgelb = 3;
const byte LEDblau = 4;
const byte LEDrot2 = 5;
const byte LEDgelb2 = 6;
const byte LEDblau2 = 7;
const byte LEDrot3 = 8;
const byte LEDgelb3 = 9;
const byte LEDblau3 = 10;

const byte Taster = 11;

Bounce Taste;
byte ausgewaehltesProgramm = 1;
byte Phase;
unsigned long PhaseGestartet;
unsigned long PhasenLaenge;

void setup() {
 for (byte i = LEDrot; i <= LEDblau3; i++) {
   pinMode(i, OUTPUT);
 }
 Taste.attach(Taster, INPUT_PULLUP);
}

void loop() {
 unsigned long topLoop = millis();
 if (Taste.update() && Taste.fell()) {
   if (++ausgewaehltesProgramm > 3) {
     ausgewaehltesProgramm = 1;
   }
   Phase = 0;
   PhaseGestartet = millis();
   alleAus();
 }
 if (ausgewaehltesProgramm == 1) {
   Programm1(topLoop);
 } else if (ausgewaehltesProgramm == 2) {
   Programm2(topLoop);
 } else if (ausgewaehltesProgramm == 3)  {
   Programm3(topLoop);
 }
}

void Programm1(unsigned long topLoop) {
 if (Phase == 0) {
   digitalWrite(LEDrot, HIGH);
   Phase = 1;
   PhasenLaenge = 1000;
 } else if (topLoop - PhaseGestartet >= PhasenLaenge) {
   PhaseGestartet = topLoop;
   if (++Phase > 9) {
     Phase = 1;
   }
   switch (Phase) {
     case 1:
       digitalWrite(LEDrot, LOW);
       digitalWrite(LEDgelb, HIGH);
       break;
     case 2:
       digitalWrite(LEDgelb, LOW);
       digitalWrite(LEDblau, HIGH);
       break;
     case 3:
       digitalWrite(LEDblau, LOW);
       digitalWrite(LEDrot2, HIGH);
       break;
     case 4:
       digitalWrite(LEDrot2, LOW);
       digitalWrite(LEDgelb2, HIGH);
       break;
     case 5:
       digitalWrite(LEDgelb2, LOW);
       digitalWrite(LEDblau2, HIGH);
       break;
     case 6:
       digitalWrite(LEDblau2, LOW);
       digitalWrite(LEDrot3, HIGH);
       break;
     case 7:
       digitalWrite(LEDrot3, LOW);
       digitalWrite(LEDgelb3, HIGH);
     case 8:
       digitalWrite(LEDgelb3, LOW);
       digitalWrite(LEDblau3, HIGH);
       break;
     case 9:
       digitalWrite(LEDblau3, LOW);
       digitalWrite(LEDrot, HIGH);
       break;
   }
 }
}

void Programm2(unsigned long topLoop) {
 if (Phase == 0) {
   alleRoten(HIGH);
   Phase = 1;
   PhasenLaenge = 2000;
 } else if (topLoop - PhaseGestartet >= PhasenLaenge) {
   PhaseGestartet = topLoop;
   if (++Phase > 3) {
     Phase = 1;
   }
   switch (Phase) {
     case 1:
       alleRoten(LOW);
       alleGelben(LOW);
       break;
     case 2:
       alleGelben(HIGH);
       alleBlauen(LOW);
       break;
     case 3:
       alleBlauen(HIGH);
       alleRoten(HIGH);
       break;
   }
 }
}

void Programm3(unsigned long topLoop) {
 if (Phase == 0) {
   digitalWrite(LEDgelb, HIGH);
   digitalWrite(LEDgelb2, HIGH);
   digitalWrite(LEDgelb3, HIGH);
   digitalWrite(LEDrot, HIGH);
   Phase = 1;
   PhasenLaenge = 1000;
 } else if (topLoop - PhaseGestartet >= PhasenLaenge) {
   PhaseGestartet = topLoop;
   if (++Phase > 7) {
     Phase = 1;
   }
   switch (Phase) {
     case 1:
       digitalWrite(LEDrot, LOW);
       digitalWrite(LEDrot2, HIGH);
       break;
     case 2:
       digitalWrite(LEDrot2, LOW);
       digitalWrite(LEDrot3, HIGH);
       break;
     case 3:
       digitalWrite(LEDrot2, LOW);
       digitalWrite(LEDrot3, HIGH);
       break;
     case 4:
       digitalWrite(LEDrot3, LOW);
       digitalWrite(LEDblau, HIGH);
       break;
     case 5:
       digitalWrite(LEDblau, LOW);
       digitalWrite(LEDblau2, HIGH);
       break;
     case 6:
       digitalWrite(LEDblau2, LOW);
       digitalWrite(LEDblau3, HIGH);
       break;
     case 7:
       digitalWrite(LEDblau3, LOW);
       digitalWrite(LEDrot, HIGH);
       break;
   }
 }
}

void alleAus() {
 alleRoten(LOW);
 alleGelben(LOW);
 alleBlauen(LOW);
}

void alleRoten(byte aufWas) {
 digitalWrite(LEDrot, aufWas);
 digitalWrite(LEDrot2, aufWas);
 digitalWrite(LEDrot3, aufWas);
}

void alleGelben(byte aufWas) {
 digitalWrite(LEDgelb, aufWas);
 digitalWrite(LEDgelb2, aufWas);
 digitalWrite(LEDgelb3, aufWas);
}

void alleBlauen(byte aufWas) {
 digitalWrite(LEDblau, aufWas);
 digitalWrite(LEDblau2, aufWas);
 digitalWrite(LEDblau3, aufWas);
}

Bei mir kommt dieser Fehler wenn ich ihren Code benutze.

:\Schule\Technik u. Naturwissenschaften (TuN)\4.1.3. - Weihnachtslichterkette mit einem Taster\_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster\_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster.ino:58:19: warning: missing terminating " character

   if (Phase == 0) "

                   ^

_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster:58: error: missing terminating " character

   if (Phase == 0) "

   ^

H:\Schule\Technik u. Naturwissenschaften (TuN)\4.1.3. - Weihnachtslichterkette mit einem Taster\_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster\_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster.ino: In function 'void loop()':

_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster:40: error: 'alleAus' was not declared in this scope

     alleAus();

             ^

_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster:48: error: 'Programm2' was not declared in this scope

     Programm2(topLoop);

                      ^

_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster:52: error: 'Programm3' was not declared in this scope

     Programm3(topLoop);

                      ^

H:\Schule\Technik u. Naturwissenschaften (TuN)\4.1.3. - Weihnachtslichterkette mit einem Taster\_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster\_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster.ino: In function 'void Programm2(long unsigned int)':

_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster:117: error: 'alleRoten' was not declared in this scope

     alleRoten(HIGH);

                   ^

_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster:132: error: 'alleRoten' was not declared in this scope

     alleRoten(LOW);

                  ^

_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster:133: error: 'alleGelben' was not declared in this scope

     alleGelben(LOW);

                   ^

_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster:137: error: 'alleBlauen' was not declared in this scope

     alleBlauen(LOW);

                   ^

H:\Schule\Technik u. Naturwissenschaften (TuN)\4.1.3. - Weihnachtslichterkette mit einem Taster\_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster\_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster.ino: In function 'void alleAus()':

_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster:201: error: 'alleRoten' was not declared in this scope

     alleRoten(LOW);

                  ^

_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster:202: error: 'alleGelben' was not declared in this scope

     alleGelben(LOW);

                   ^

_4.1.3._-_Weihnachtslichterkette_mit_einem_Taster:203: error: 'alleBlauen' was not declared in this scope

     alleBlauen(LOW);

                   ^

Bibliothek Bounce2 in Version 2.2 im Ordner: C:\Users\thega\Documents\Arduino\libraries\Bounce2  wird verwendet
exit status 1
missing terminating " character

Warum tippst du da einfach ein Hochkomma rein, bzw über die '{'?

In meinen Kode kommen keine '"' vor.

Whandall:
Warum tippst du da einfach ein Hochkomma rein, bzw über die '{'?

In meinen Kode kommen keine '"' vor.

Ups..., keine Ahnung wie mir das dahin kommt :roll_eyes: :slightly_smiling_face:

Wahrscheinlich via Tastatur. :wink:

Wie genau sieht das jetzt mit drei Tastern aus?

#include <Bounce2.h>

const byte LEDrot     = 2;
const byte LEDrot2    = 5;
const byte LEDrot3    = 8;

const byte LEDgelb    = 3;
const byte LEDgelb2   = 6;
const byte LEDgelb3   = 9;

const byte LEDblau    = 4;
const byte LEDblau2   = 7;
const byte LEDblau3   = 10;

const byte Taster1    = 11;
const byte Taster2    = 12;
const byte Taster3    = 13;

const byte Taster1;
const byte Taster2;
const byte Taster3;

byte ausgewaehltesProgramm = 1;
byte Phase;
unsigned long PhaseGestartet; 
unsigned long Phasenlaenge;

void setup()
{
  for (byte i = LEDrot; i <= LEDblau3; i++)
  {
    pinMode(i, OUTPUT);
  }
  for (byte x = Taster1; x <= Taster3; i++)
  {
    pinMode(x, INPUT_PULLUP);
  }
}

void loop()
{
  if (digitalRead(Taster1) == LOW)
  {
    Programm1();
  }

  if (digitalRead(Taster2) == LOW)
  {
    Programm2();
  }

  if (digitalRead(Taster3) == LOW)
  {
    Programm3();
  }
}

void Programm1(unsigned long topLoop)
{
  if (Phase == 0)
    {
    digitalWrite(LEDrot, HIGH);
    Phase = 1;
    PhasenLeange = 1000;
  }
    else if (topLoop - PhaseGestartet >= PhasenLeange)
    {
    PhaseGesartet = topLoop;
    if ( ++Phase > 9)
    {
    Phase = 1;
  }

    switch (Phase)
    {
    case 1:
    digitalWrite(LEDrot, LOW);
    digitalWrite(LEDgelb, HIGH);
    break;

    case 2:
    digitalWrite(LEDgelb, LOW);
    digitalWrite(LEDblau, HIGH);
    break;

    case 3:
    digitalWrite(LEDblau, LOW);
    digitalWrite(LEDrot2, HIGH);
    break;

    case 4:
    digitalWrite(LEDrot2, LOW);
    digitalWrite(LEDgelb2, HIGH);
    break;

    case 5:
    digitalWrite(LEDgelb2, LOW);
    digitalWrite(LEDblau2, HIGH);
    break;

    case 6:
    digitalWrite(LEDblau2, LOW);
    digitalWrite(LEDrot3, HIGH);
    break;

    case 7:
    digitalWrite(LEDrot3, LOW);
    digitalWrite(LEDgelb3, HIGH);
    break;

    case 8:
    digitalWrite(LEDgelb3, LOW);
    digitalWrite(LEDblau3, HIGH);
    break;

    case 9:
    digitalWrite(LEDblau3, LOW);
    digitalWrite(LEDrot, HIGH);
    break;
  }
  }
  }

    void Programm2(unsigned long topLoop)
    {
    if (Phase == 0)
    {
    alleRoten(HIGH);
    Phase = 1;
    PhasenLaenge = 2000;
  }
    else if (topLoop - PhaseGestartet >= PhasenLaenge)
    {
    PhaseGestartet = topLoop;
    if (++Phase > 3)
    {
    Phase = 1;
  }

    switch (Phase)
    {
    case 1:
    alleRoten(LOW);
    alleGelben(LOW);
    break;

    case 2:
    alleGelben(HIGH);
    alleBlauen(LOW);
    break;

    case 3:
    alleBlauen(HIGH);
    alleRoten(HIGH);
    break;
  }
  }
  }

    void Programm3(unsigned long topLoop)
    {
    if (Phase == 0)
    {
    digitalWrite(LEDgelb, HIGH);
    digitalWrite(LEDgelb2, HIGH);
    digitalWrite(LEDgelb3, HIGH);
    digitalWrite(LEDrot, HIGH);

    Phase = 1;
    PhasenLaenge = 1000;
  }

    else if (topLoop - PhaseGestartet >= PhasenLaenge)
    {
    PhaseGestartet = topLoop;
    if (++Phase > 7)
    {
    Phase = 1;
  }

    switch(Phase)
    {
    case 1:
    digitalWrite(LEDrot, LOW);
    digitalWrite(LEDblau, HIGH);
    break;

    case 2:
    digitalWrite(LEDblau, LOW);
    digitalWrite(LEDrot2, HIGH);
    break;

    case 3:
    digitalWrite(LEDrot2, LOW);
    digitalWrite(LEDblau2, HIGH);
    break;

    case 4:
    digitalWrite(LEDblau2, LOW);
    digitalWrite(LEDrot3, HIGH);
    break;

    case 5:
    digitalWrite(LEDrot3, LOW);
    digitalWrite(LEDblau3, HIGH);
    break;

    case 6:
    digitalWrite(LEDblau3, LOW);
    digitalWrite(LEDrot, HIGH);
  }
  }
  }

    void alleAus()
    {
    alleRoten(LOW);
    alleGelben(LOW);
    alleBlauen(LOW);
  }

    void alleRoten(byte spaeter)
    {
    digitalWrite(LEDrot, spaeter);
    digitalWrite(LEDrot2, spaeter);
    digitalWrite(LEDrot3, spaeter);
  }

    void alleGelben(byte spaeter)
    {
    digitalWrite(LEDgelb, spaeter);
    digitalWrite(LEDgelb2, spaeter);
    digitalWrite(LEDgelb3, spaeter);
  }

    void alleBlauen(byte spaeter)
    {
    digitalWrite(LEDblau, spaeter);
    digitalWrite(LEDblau2, spaeter);
    digitalWrite(LEDblau3, spaeter);
  }

Ich meine irgendwas fehlt im Loop, ich habe mir als Hilfe die Version mit einem Taster genommen.

Barthalo:
Wie genau sieht das jetzt mit drei Tastern aus?

Wie bitte?

Barthalo:
Später möchte ich statt drei Taster nur noch einen Taster verwenden, wenn dies möglich ist kann mir jemand da helfen?

Alles was ich bisher gemacht habe war also für den Eimer,
weil du doch nicht das willst, nach dem du eingangs gefragt hast?

Whandall:
Wie bitte?

Alles was ich bisher gemacht habe war also für den Eimer,
weil du doch nicht das willst, nach dem du eingangs gefragt hast?

Nein, Nein, ich wollte beide Versionen.

Whandall:
Wie bitte?

Alles was ich bisher gemacht habe war also für den Eimer,
weil du doch nicht das willst, nach dem du eingangs gefragt hast?

Alles was du bisher gemacht hast war nicht für den Eimer,da ich beide Versionen brauche. Ich Danke Dir auch für deine bisherige Hilfe dafür.