4 Taster sollen Methode auswählen

Hallo zusammen,

ich tüftel schon seit Tagen annem simplen Sketch rum und komm nicht weiter...

Ich hab 4 Taster per pulldown angeschlossen (High am DigitalIn wenn gedrückt. vielleicht sind 1K zu klein?)

Die sollen auswählen welche LEDs blinken bzw wie...

Immer wenn ich den sketch hochlade--> b methode (Modus) 3

und wechseln tut der auch nicht wirklich..soll heissen sobald ich den Taster 2 (modus2) loslasse ists wieder 3

Am liebsten hätte ich auch das er in einer Methode verweilt, solange keine andere Taste gedrückt wird

Schaut mal plz (hängt euch bitte nicht mit den Kommentaren auf, die sind mit codeschnipseln reinkopiert)

int LEDgruen = 5;
int LEDrot = 6; //Das Wort „LEDblau“ steht jetzt für den Wert 6.
//Das Wort „taster“ steht jetzt für den Wert 7.
const int RotModus = 7;
const int GruenModus = 8;
const int AmpelModus = 9;
const int AnModus = 10;

int state;
int sensor;
const int potiPin = A0;
int pwm;
int Modus=0;

  void Rot()
  { //Programmabschnitt des IF-Befehls öffnen.
    digitalWrite(LEDrot, pwm); //dann soll die LED leuchten
    delay (500); //und zwar für für 5 Sekunden (5000 Millisekunden).
    digitalWrite(LEDrot, LOW); //danach soll die LED aus sein.
  } //Programmabschnitt des IF-Befehls schließen.

  void Gruen() //gruenModus
  { //Programmabschnitt des IF-Befehls öffnen.
    digitalWrite(LEDgruen, pwm); //dann soll die LED leuchten
    delay (5000); //und zwar für für 5 Sekunden (5000 Millisekunden).
    digitalWrite(LEDgruen, LOW); //danach soll die LED aus sein.
    delay(5000);  
  } //Programmabschnitt des IF-Befehls schließen.

  void Ampel()//Ampel Modus
  { //Programmabschnitt des IF-Befehls öffnen.
    digitalWrite(LEDrot, pwm); //dann soll die LED leuchten
    delay (520); //und zwar für für 5 Sekunden (5000 Millisekunden).
    digitalWrite(LEDrot, LOW); //danach soll die LED aus sein.
    delay (20);
    digitalWrite(LEDgruen, pwm);
    delay (500);
    digitalWrite(LEDgruen, LOW);
  } //Programmabschnitt des IF-Befehls schließen.

  void AnAus()//Verarbeitung: Wenn der Taster gedrückt ist (DalWrias Spannungssignal ist hoch)
  { //Programmabschnitt des  IF-Befehls öffnen.
    state = digitalRead(LEDrot);
    if (state = 0)
      {
        digitalWrite(LEDrot,pwm);
      }
      else
      {
        digitalWrite(LEDrot,0);
      }
    state = digitalRead(LEDgruen);
    if (state = 0)
      {
        digitalWrite(LEDgruen,pwm);
      }
      else
      {
        digitalWrite(LEDgruen,0);
      }
  }   

void setup() //Hier beginnt das Setup.
{
  pinMode(LEDgruen, OUTPUT);//Der Pin mit der LED (Pin 6) ist jetzt ein Ausgang
  pinMode(LEDrot, OUTPUT);
  pinMode(RotModus, INPUT);
  pinMode(GruenModus, INPUT);
  pinMode(AmpelModus, INPUT);
  pinMode(AnModus, INPUT); //Der Pin mit dem Taster (Pin 7) ist jetzt ein Eingang.
  
}

void loop()
{ //Mit dieser Klammer wird der Loop-Teil geöffnet.
  Serial.begin(9600);
  
  sensor = analogRead(potiPin);
  pwm = map(sensor, 0, 1023, 0, 255);// auslesen poti und digital mappen
  Serial.print(pwm);
  Serial.println("Hell");
  Serial.print(Modus);
  Serial.println("Modus");
  if (digitalRead(RotModus)==HIGH)
  //Hier wird der Pin7 ausgelesen (Befehl:digitalRead). Das Ergebnis wird unter der Variable „tasterstatus“ mit dem Wert „HIGH“ für 5Volt oder „LOW“ für 0Volt gespeichert.
    {
      Modus = 1;
      Rot();
    }
  if (digitalRead(GruenModus)==HIGH)
    {
      Modus = 2;
      Gruen();
      
      }
  if (digitalRead(AmpelModus)==HIGH)
    {
      Modus = 3;
      Ampel();
    }
  if (digitalRead(AnModus)==HIGH)
  {
    Modus = 4;
    AnAus();
  }
  
}

Eine Zusatzfrage noch, wie kriegt man das hin, dass wenn die Methode 4 aufgerufen wird (AnAus), die Leds nur einmal den Status wechseln?!
Wahrscheinlich muss ich dann in der Methode den Taster 4 abfragen und solange der nicht gedrückt wird....
puh...muss er warten....äh ja...

Vielen Dank für Eure Hilfe, als blutiger Halbwissender ist das manchmal echt ....

Neuron

Schaut mal plz (hängt euch bitte nicht mit den Kommentaren auf, die sind mit codeschnipseln reinkopiert)

Das geht leider nicht!
In der Kriegsführung wird Propaganda u.A. dazu verwendet, den Gegner zu verwirren.

In der Programmierung sollen Kommentare die Verwirrungen mindern.
Kommentare sollen sagen, warum was gemacht wird und nicht was gemacht wird, das tut schon der Code.
Falsche Kommentare ist so ziemlich das böseste, was man sich selber und den Lesern antun kann.

Und nein, leider kann ich dir nicht konstruktiv helfen, da ich keine Ahnung habe, was es denn jetzt wirklich tun soll.
Ich sehe auch keine/wenig Übereinstimmung zwischen Beschreibung und Code.

Tipp:
Ein Programm ist: In Software gegossene Gedanken.
Also müssen erst die Gedanken klar werden, dann wird auch das Programm funktionieren.

neuron74:
ich tüftel schon seit Tagen annem simplen Sketch rum und komm nicht weiter...

void loop()

{ //Mit dieser Klammer wird der Loop-Teil geöffnet.
  Serial.begin(9600);



Eine Zusatzfrage noch, wie kriegt man das hin, dass wenn die Methode 4 aufgerufen wird (AnAus), die Leds nur einmal den Status wechseln?!

combie hats ja schon auf den Punkt gebracht.

Aber irgendwie komm ich nicht umhin, zu meinen, schon mal jemandem geholfen gehabt zu haben der den selben Schreibstil hatte.
Und bevor Du Zusatzfragen stellen kannst, fange mit einem einfachen Sketch an.
Da Du LED's benutzt: blink und Blink without delay aus den Beispielen sind ein guter Einstieg.
Und dann aus dem Bereich communication das Beispiel asciitabelle, denn im Moment initialisierst Du 100te Male die Sekunde die serielle Schnittstelle...

Hallo
meine Lieblingsantwort ist immer:
Man nehme eine Tüte mit Zeitgebern und ein paar struct Definitionen und dann sollte die Ampelschaltung funktioneren :slight_smile:

Hallo,
ich versuche mal dir beim Ordnen Deiner Gedanken zu helfen. Fang aber erst mal mit zwei Tastern und zwei LED´s an. Wenn Du Taster 1 kurz drückst geht die LED1 dauernd an. Wenn Du Taster2 kurz drückst geht LED1 aus und LED2 beginnt zu blinken. 1s ein eine s aus. Drückst Du jetzt wieder Taster1 hört das Blinken auf und LED1 geht wieder dauern an. Ich denke das ist so das was Du eigentlich haben willst.

Lösen könnte man das so :

mit dem Drücken der Taster setzt Du je eine zugehörige Statusvariable vom Typ bool auf true und die jeweils ander setzt Du auf false. Eine von beiden dann also jeweils so lange auf true bis der andere Taster gerückt wird. Mit diesen beiden Statusvariablen verzweigst Du miitels if... in den Programteil für das Blinken oder das Dauerlicht. Das Binken der Led2 machst Du mit millis(), (BlinkWithoutDelay) damit du auch mitbekommst das der andere Taster gedrückt wird. Du kannst es auch erst mal mit delay() machen, damit lernst Du dann den Unterschied kennen. Bau Dir an den entscheidenen Stellen zusätzlich ein paar Ausgaben auf den Monitor ein, damit Du den Ablauf verfolgen kannst.

Mach Dir einen Ablaufplan in dem Du hintereinander aufschreibst was Du vorhast, meistens entdeckt man dabei schon wenn was nicht logisch ist. Mit ein bischen Übung kannst Du dann aus fast jeder Textzeile eine Codezeile machen.

Wenn es dann richtig läuft erweiterst Du auf den 3. und 4. Taster.

Heinz

Ich habe versucht zu verstehen, was dein Code machen soll, die Kommentare waren da nicht hilfreich.
Besonders bei AnAus() musste ich raten...
Vorschlag:

int LEDgruen = 5;
int LEDrot = 6; 
const int RotModus = 7;
const int GruenModus = 8;
const int AmpelModus = 9;
const int AnModus = 10;
const int potiPin = A0;
int pwm;
byte Modus = 0;
byte lastModus = 0;
unsigned long interval = 0;
unsigned long currentMillis = 0;
unsigned long lastMillis = 0;

void Rot() {
  static bool state = LOW;
  interval = 500;
  if (state = !state) analogWrite(LEDrot, pwm);
  else analogWrite(LEDrot, 0);
}

void Gruen() {
  static bool state = LOW;
  interval = 5000;
  if (state = !state) analogWrite(LEDrot, pwm);
  else analogWrite(LEDrot, 0);
}

void Ampel() {
  static byte state = 0;
  switch (state) {
    case 0:
      analogWrite(LEDrot, pwm);
      interval = 520;
      state = 1;
      break;
    case 1:
      analogWrite(LEDrot, 0);
      interval = 20;
      state = 2;
      break;
    case 2:
      analogWrite(LEDgruen, pwm);
      interval = 500;
      state = 3;
      break;
    case 3:
      analogWrite(LEDgruen, 0);
      interval = 500;
      state = 0;
      break;
  }
}

void AnAus() {
  static bool state = 0;
  interval = 500;
  if (state = !state) {
    analogWrite(LEDrot, pwm);
    analogWrite(LEDgruen, 0);
  } else
  {
    digitalWrite(LEDgruen, 0);
    digitalWrite(LEDgruen, pwm);
  }
}

void setup()
{
  pinMode(LEDgruen, OUTPUT);
  pinMode(LEDrot, OUTPUT);
  pinMode(RotModus, INPUT);
  pinMode(GruenModus, INPUT);
  pinMode(AmpelModus, INPUT);
  pinMode(AnModus, INPUT); 
  Serial.begin(9600);
}

void loop() {
  pwm = map(analogRead(potiPin), 0, 1023, 0, 255);

  if (digitalRead(RotModus)) Modus = 1;
  else if (digitalRead(GruenModus)) Modus = 2;
  else if (digitalRead(AmpelModus)) Modus = 3;
  else if (digitalRead(AnModus)) Modus = 4;

  if (lastModus != Modus) {
    lastModus = Modus;
    interval = 0;
    analogWrite(LEDrot,0);
    analogWrite(LEDgruen,0);
    Serial.print(pwm);
    Serial.println("Hell");
    Serial.print(Modus);
    Serial.println("Modus");
  }
  currentMillis = millis();
  if (currentMillis - lastMillis >= interval) {
    lastMillis = currentMillis;
    switch (Modus) {
      case 1: Rot(); break;
      case 2: Gruen(); break;
      case 3: Ampel(); break;
      case 4: AnAus(); break;
    }
  }
}

(natürlich ungetestet)

gruß lorenz

Wow,

Vielen vielen Dank...
Ich Kämpf mich morgen mal durch...
Sorry für meinen schlechten Kommentar. Aber der Wahnsinn..
Eigentlich soll taster 1 rot einschalten
2 gruen
3 ampeltechnisch laufen
4 das ganze ausschalten und wieder einschalten

Hab nicht gedacht, auf was für Probleme man da stößt... Einige hab Ich schon ausgemerzt... Wie das so ist, wenn man seit wenigen Wochen damit rumexperimsntiert und dann der Sohn kommt und ein breadboard bestückt mit den Sachen aus Starterkit.. Papa: mach mal...
LG an alle Helfer

Bis morgen ':slight_smile:

neuron74:
... Papa: mach mal...

... 'nen endlichen Automaten, aber zackich!

Wenn Du mehrere Sachen quasi gleichzeitig machen möchtest - und Du möchtest ja, dass es blinkt und gleichzeitig die Taster abgefragt werden - kommst Du um irgendeine Art von „State Machine“ nicht herum. Evtl. hilft ja mein Geschreibsel.

Gruß

Gregor

Ein par Anfängerfehler die mir an deinem Code aufgefallen sind:

Solche Komentare sind Mist:

int LEDrot = 6; //Das Wort „LEDblau" steht jetzt für den Wert 6.
const int RotModus = 7; //Das Wort „taster" steht jetzt für den Wert 7.
delay (500); //und zwar für für 5 Sekunden (5000 Millisekunden).
void AnAus()//Verarbeitung: Wenn der Taster gedrückt ist (DalWrias Spannungssignal ist hoch)
void Rot() { //Programmabschnitt des IF-Befehls öffnen.

Das = ist ein Zuweisungsoperator vermutlich wolltest du aber den Vergleichsoperator == verwenden:

if (state = 0)

digitalWrite() kann nur "an" oder "aus" deswegen heißt es [b]digital[/b]Write() Vermutlich wolltest du hier analogWrite() verwenden:

digitalWrite(LEDrot, pwm);

Wenn du möchtest, dass beim Blinken der LEDs auch noch andere Dinge passieren (wie z.B. Taster abfragen), darfst du kein delay() verwenden. Schau dir dazu BlinkWithoutDelay aus den Arduino-Beispielen an.
(Für Klugscheißer: Auf Interrupts o.Ä. gehe ich an dieser Stelle absichtlich nicht ein.)

gruß lorenz

corvus_:
(Für Klugscheißer: Auf Interrupts o.Ä. gehe ich an dieser Stelle absichtlich nicht ein.)

Wozu auch?
So schnell ist der nicht. Weder mit der Hand, noch mit dem Auge.

Schau dir dazu BlinkWithoutDelay aus den Arduino-Beispielen an.

na wenn ihm das nun erneut vorgetackert wird, dann wirds wohl werden...
:wink:

my_xy_projekt:
Wozu auch?
So schnell ist der nicht. Weder mit der Hand, noch mit dem Auge.

Der Interrupt, oder der Klugscheißer? :wink:

my_xy_projekt:
na wenn ihm das nun erneut vorgetackert wird, dann wirds wohl werden...
:wink:

Hoffentlich, aber ich geh lieber nochmal auf Nummer sicher:
Bitte anschauen, und verstehen: BlinkWithoutDelay 8)

gruß lorenz

Hallo
zerlege am Besten Deine Aufgabenstellung, nach dem EVA-Prinzip, in
E=Eingabe - Taste
V=Verarbeitung - Zeitgeber starten/stoppen
A=Ausgabe - LED
Module.
Alle diese Module lassen sich prima einzeln Testen und danach über Kontrollstrukturen zusammenlöten. :slight_smile:

Hallo
ich fange mit dem Modul zum steuern einer LED an :slight_smile:

#define ProjektName "led_ein_aus_blinken"
const int Led=13;
unsigned long stempel;            // Zeitstempel für die nächste Ausführung
const unsigned long pause =500;  // Zeitpause zwischen den Ausführungen
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.print("File: ");
  Serial.println(__FILE__);
  Serial.print("Projekt: ");
  Serial.println(ProjektName);
  pinMode (Led, OUTPUT);
  Serial.println("LED [e]inschalten");
  Serial.println("LED [a]usschalten");
  Serial.println("LED [b]linken");
}
void LEDein() {
  stempel = 0;
  digitalWrite(Led, true);
}
void LEDaus() {
  stempel = 0;
  digitalWrite(Led, false);
}
void LEDblinken() {
  stempel = millis();
  digitalWrite(Led, not digitalRead(13));
}
void monitor()
{
  switch (Serial.read())
  {
    case 'e': LEDein(); break;
    case 'a': LEDaus(); break;
    case 'b': LEDblinken(); break;
  }
}
void loop() {
  // put your main code here, to run repeatedly:
// Tastureingabe zum Testen  
  if (Serial.available()) monitor();
// und hier kommt der Zeitgeber   
  if ((millis() - stempel) > pause && stempel) LEDblinken();
}

moin zusammen,

vieln Dank für die zahlreiche Hilfe, hat mir einiges gebracht an neuen Befehlen und Verständnis
ich häng noch in einem Detail, nämlich am Taster 4, der quasi die LEDs ausschalten, oder in den letzten Modus zurückspringen soll, was noch nicht klappt...
die zugehörige Methode ist toggle();

int LEDgruen = 5;
int LEDrot = 6;
const int RotModus = 7;
const int GruenModus = 8;
const int AmpelModus = 9;
const int AnModus = 10;
const int potiPin = A0;
int pwm;
byte Modus = 0;
byte lastModus = 0;
unsigned long interval = 0;
unsigned long currentMillis = 0;
unsigned long lastMillis = 0;
int Schalt=0;
int SavedModus=0;
int An=0;
int LastAn=0;

void Rot() {
  static bool state = LOW;
  interval = 500;
  if (state = !state) analogWrite(LEDrot, pwm);
  else analogWrite(LEDrot, 0);
}

void Gruen() {
  static bool state = LOW;
  interval = 5000;
  if (state = !state) analogWrite(LEDrot, pwm);
  else analogWrite(LEDrot, 0);
}

void Ampel() {
  static byte state = 0;
  switch (state) {
    case 0:
      analogWrite(LEDrot, pwm);
      interval = 520;
      state = 1;
      break;
    case 1:
      analogWrite(LEDrot, 0);
      interval = 20;
      state = 2;
      break;
    case 2:
      analogWrite(LEDgruen, pwm);
      interval = 500;
      state = 3;
      break;
    case 3:
      analogWrite(LEDgruen, 0);
      interval = 500;
      state = 0;
      break;
}
}
void toggle()
{
  interval=100;
  currentMillis = millis();
  if (currentMillis - lastMillis >= interval) {
    lastMillis = currentMillis;}
  if (Schalt==1)
{
  if LastAn !== An
  {
    LastAn=An;
    digitalWrite(LEDrot, 0);
  digitalWrite(LEDgruen, 0);
  Schalt=0;
  An=1;
  Serial.print("AUS"); 
}
else if (Schalt==1 && An ==1)
{
  Modus=SavedModus;
  An=0;
  Schalt=0;
  Serial.print("AN");
      }
}


void AnAus() {
  static bool state = LOW;
}
void setup()
{
  pinMode(LEDgruen, OUTPUT);
  pinMode(LEDrot, OUTPUT);
  pinMode(RotModus, INPUT);
  pinMode(GruenModus, INPUT);
  pinMode(AmpelModus, INPUT);
  pinMode(AnModus, INPUT);
  Serial.begin(9600);
}


void loop() {
  pwm = map(analogRead(potiPin), 0, 1023, 0, 255);

  if (digitalRead(RotModus)) Modus = 1;
  else if (digitalRead(GruenModus)) Modus = 2;
  else if (digitalRead(AmpelModus)) Modus = 3;
  else if (digitalRead(AnModus)) SavedModus=Modus, Modus = 4,Schalt=1; // Schalter gedrückt, letzter Modus wird gespeichert

     if (lastModus != Modus) 
    {
    lastModus = Modus;
    interval = 0;
    analogWrite(LEDrot,0);
    analogWrite(LEDgruen,0);
    Serial.print(pwm);
    Serial.println("Hell");   !
    Serial.print(Modus);
    Serial.println("Modus");
  }
  currentMillis = millis();
  if (currentMillis - lastMillis >= interval) {
    lastMillis = currentMillis;
    switch (Modus) {
      case 1: Rot(); break;
      case 2: Gruen(); break;
      case 3: Ampel(); break;
      case 4: toggle(); break;
    }
  }
}

Ich hab jetzt gerad überlegt, dass ich den letzten toggle Zustand ja auch speichern muss (LastAn)
aber ich bin mir fast sicher, dass ich noch was ändern muss...

Vielen Dank...aller Anfang...meine Güte

neuron74:
vieln Dank für die zahlreiche Hilfe, hat mir einiges gebracht an neuen Befehlen und Verständnis

    if LastAn != = An

Das funktioniert nicht.
Zudem mach mal STRG-T, der ganze Sketch kann so nicht kompilieren.

Sorry, hatte noch ein par Ideen umsetzen wollen...
so ist der letzte Stand, der kompiliert werden kann

int LEDgruen = 5;
int LEDrot = 6;
const int RotModus = 7;
const int GruenModus = 8;
const int AmpelModus = 9;
const int AnModus = 10;
const int potiPin = A0;
int pwm;
byte Modus = 0;
byte lastModus = 0;
unsigned long interval = 0;
unsigned long currentMillis = 0;
unsigned long lastMillis = 0;
int Schalt=0;
int SavedModus=0;
int An=0;
int LastAn=0;

void Rot() {
  static bool state = LOW;
  interval = 500;
  if (state = !state) analogWrite(LEDrot, pwm);
  else analogWrite(LEDrot, 0);
}

void Gruen() {
  static bool state = LOW;
  interval = 5000;
  if (state = !state) analogWrite(LEDrot, pwm);
  else analogWrite(LEDrot, 0);
}

void Ampel() {
  static byte state = 0;
  switch (state) {
    case 0:
      analogWrite(LEDrot, pwm);
      interval = 520;
      state = 1;
      break;
    case 1:
      analogWrite(LEDrot, 0);
      interval = 20;
      state = 2;
      break;
    case 2:
      analogWrite(LEDgruen, pwm);
      interval = 500;
      state = 3;
      break;
    case 3:
      analogWrite(LEDgruen, 0);
      interval = 500;
      state = 0;
      break;
}
}
void toggle()
{
  interval=100;
  currentMillis = millis();
  if (currentMillis - lastMillis >= interval) {
    lastMillis = currentMillis;}
  if (Schalt==1)
{
  digitalWrite(LEDrot, 0);
  digitalWrite(LEDgruen, 0);
  Schalt=0;
  An=1;
  Serial.print("AUS"); 
}
else if (Schalt==1 && An ==1)
{
  Modus=SavedModus;
  An=0;
  Schalt=0;
  Serial.print("AN");
      }
}


void AnAus() {
  static bool state = LOW;
}
void setup()
{
  pinMode(LEDgruen, OUTPUT);
  pinMode(LEDrot, OUTPUT);
  pinMode(RotModus, INPUT);
  pinMode(GruenModus, INPUT);
  pinMode(AmpelModus, INPUT);
  pinMode(AnModus, INPUT);
  Serial.begin(9600);
}


void loop() {
  pwm = map(analogRead(potiPin), 0, 1023, 0, 255);

  if (digitalRead(RotModus)) Modus = 1;
  else if (digitalRead(GruenModus)) Modus = 2;
  else if (digitalRead(AmpelModus)) Modus = 3;
  else if (digitalRead(AnModus)) SavedModus=Modus, Modus = 4,Schalt=1; // Schalter gedrückt, letzter Modus wird gespeichert

     if (lastModus != Modus) 
    {
    lastModus = Modus;
    interval = 0;
    analogWrite(LEDrot,0);
    analogWrite(LEDgruen,0);
    Serial.print(pwm);
    Serial.println("Hell");   !
    Serial.print(Modus);
    Serial.println("Modus");
  }
  currentMillis = millis();
  if (currentMillis - lastMillis >= interval) {
    lastMillis = currentMillis;
    switch (Modus) {
      case 1: Rot(); break;
      case 2: Gruen(); break;
      case 3: Ampel(); break;
      case 4: toggle(); break;
    }
  }
}

neuron74:

}

}

Uh ... ich krieg' Pickel. Du hast vergessen, Deinen Code mit Strg-T zumindest einigermaßen hübsch zu machen.

Gruß

Gregor

Sorry,

kantte ich nicht
ich werde mich bessern

int LEDgruen = 5;
int LEDrot = 6;
const int RotModus = 7;
const int GruenModus = 8;
const int AmpelModus = 9;
const int AnModus = 10;
const int potiPin = A0;
int pwm;
byte Modus = 0;
byte lastModus = 0;
unsigned long interval = 0;
unsigned long currentMillis = 0;
unsigned long lastMillis = 0;
int Schalt = 0;
int SavedModus = 0;
int An = 0;
int LastAn = 0;

void Rot() {
  static bool state = LOW;
  interval = 500;
  if (state = !state) analogWrite(LEDrot, pwm);
  else analogWrite(LEDrot, 0);
}

void Gruen() {
  static bool state = LOW;
  interval = 5000;
  if (state = !state) analogWrite(LEDrot, pwm);
  else analogWrite(LEDrot, 0);
}

void Ampel() {
  static byte state = 0;
  switch (state) {
    case 0:
      analogWrite(LEDrot, pwm);
      interval = 520;
      state = 1;
      break;
    case 1:
      analogWrite(LEDrot, 0);
      interval = 20;
      state = 2;
      break;
    case 2:
      analogWrite(LEDgruen, pwm);
      interval = 500;
      state = 3;
      break;
    case 3:
      analogWrite(LEDgruen, 0);
      interval = 500;
      state = 0;
      break;
  }
}
void toggle()
{
  interval = 100;
  currentMillis = millis();
  if (currentMillis - lastMillis >= interval) {
    lastMillis = currentMillis;
  }
  if (Schalt == 1)
  {
    digitalWrite(LEDrot, 0);
    digitalWrite(LEDgruen, 0);
    Schalt = 0;
    An = 1;
    Serial.print("AUS");
  }
  else if (Schalt == 1 && An == 1)
  {
    Modus = SavedModus;
    An = 0;
    Schalt = 0;
    Serial.print("AN");
  }
}


void AnAus() {
  static bool state = LOW;
}
void setup()
{
  pinMode(LEDgruen, OUTPUT);
  pinMode(LEDrot, OUTPUT);
  pinMode(RotModus, INPUT);
  pinMode(GruenModus, INPUT);
  pinMode(AmpelModus, INPUT);
  pinMode(AnModus, INPUT);
  Serial.begin(9600);
}


void loop() {
  pwm = map(analogRead(potiPin), 0, 1023, 0, 255);

  if (digitalRead(RotModus)) Modus = 1;
  else if (digitalRead(GruenModus)) Modus = 2;
  else if (digitalRead(AmpelModus)) Modus = 3;
  else if (digitalRead(AnModus)) SavedModus = Modus, Modus = 4, Schalt = 1; // Schalter gedrückt, letzter Modus wird gespeichert

  if (lastModus != Modus)
  {
    lastModus = Modus;
    interval = 0;
    analogWrite(LEDrot, 0);
    analogWrite(LEDgruen, 0);
    Serial.print(pwm);
    Serial.println("Hell");   !
    Serial.print(Modus);
    Serial.println("Modus");
  }
  currentMillis = millis();
  if (currentMillis - lastMillis >= interval) {
    lastMillis = currentMillis;
    switch (Modus) {
      case 1: Rot(); break;
      case 2: Gruen(); break;
      case 3: Ampel(); break;
      case 4: toggle(); break;
    }
  }
}

neuron74:
ich werde mich bessern

Prima, das sieht doch gleich viel hübscher aus!

Gut auch, dass Du mehr als einmal case() verwendet hast. Wenn ich so manche if-Orgien sehe ...

Gibt es mit der aktuellen Version denn noch Probleme? Wenn der Code jetzt schon mal keine Pickel mehr verursacht, kann ich ihn auch etwas genauer angucken :slight_smile:

Gruß

Gregor

Ja leider...
Wie ich gestern schon sagte....
die Methode toggle(); springt nicht zurück in die vorherige Methode...
also, ich drücke taste 1 (rot();)--->läuft
dann drücke ich taste 4 (toggle()) --> die LEDs gehen aus so wie bestellt
dann nochmal 4 dann soll er quasi wieder in rot() zurückspringen, bzw in das vorherige...irgendwo hab ich den gedankenfehler....

Danke