Flip Flop Schaltung?

Hallo,

ich habe ein Problem mit einem Sketch…

#define LED1 2
#define LED2 4
#define LED3 6
#define BUTTON1 8
#define BUTTON2 10

int ModeW = 0;


void setup()
{
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(BUTTON2, INPUT);
}



void loop()
{
  if ( digitalRead(BUTTON2) == HIGH )
   {
    ModeW = ModeW + 1;
   
    while ( ModeW < 3 )
     {
      digitalWrite(LED1, HIGH);
      ModeW = ModeW + 1;
      delay(500);
     }
    while ( ModeW == 4 )
     {
      int ModeW;
      digitalWrite(LED1, LOW);
      delay(500);
     }
    }

Das soll wie ein Flip Flop funktionieren. Also wenn ich nen Button drücke soll die Led an gehen, und wenn ich den Button nochmal drücke soll sie wieder aus gehen. Das funktioniert aber nur einmal. Bzw. geht sie nur an und nicht wieder aus. Ich hab mich daran jetzt so Festgebissen das ich auf keine andere Idee komme. Würde mich über Hilfe freuen.

Fireman19

PS wenn das hier nicht richtig Formuliert ist, sorry. ich bin neu Hier.

Die Programmierstrategie würde ich stark überlegen. Du baust da stark blockierenden Code.

  • Dein Taster scheint überhaupt nicht entprellt zu sein.
  • wofür wird ModeW erneut in der 2. while Schleife neu defeniert?
  • while(ModeW == 4) wird immer erfüllt sein und deshalb kommst du nicht zurück.
  • Nutzte anstatt while If-Abfragen. Im Playground und in den Examples sind genügend Beispiele wie man es besser macht.

Dein Programm endet in dieser Endlosschleife:

    while ( ModeW == 4 )
     {
      int ModeW;
      digitalWrite(LED1, LOW);
      delay(500);
     }

Sobald diese Bedingung einmal erfüllt ist, liest Du innerhalb der Schleife den Button nicht mehr aus, ModeW bekommt innerhalb der Schleife niemals mehr einen anderen Wert, und da die Bedingung dann immer erfüllt ist, wird die Schleife auch niemals mehr verlassen.

Vernünftig aufgebaute Programme trennen die Programmlogik in Eingabe(), Verarbeitung() und Ausgabe() auf. Das nennt sich das "EVA-Prinzip". Zum Beispiel könnte die loop-Funktion dann so aussehen:

void loop() {
  eingabe();
  verarbeitung();
  ausgabe();
}

Und Du brauchst - je nach Programm - dann nur diese drei Funktion zu schreiben und kannst damit (nahezu) jede Art von Programm mit einwandfreier Programmlogik aufbauen.

BTW: "delay()" ist ein Befehl, um die Programmausführung an der Stelle für eine gewisse Zeit zu blockieren. Bei interaktiven Programmen findet während eines "delay()" daher auch keine Verarbeitung von Tastendrüclen statt, d.h. "delay()" ist zum Programmieren von schnellen, interaktiven Programmen ein völlig ungeeigneter Befehl und sollte daher stets vermieden werden.

Hi, ich muss mich erstmal entschuldigen, da ich diesen Thread gehijackt habe :confused: ... ich poste nicht so häufig, daher war mir diese Fehlverhalten nicht bekannt ... SORRY


Ich habe jetzt einen neuen Thread dazu erstellt unter dem ihr jetzt einen einfachen Code-Schnipsel für eine FlipFlop-Schaltung mit Hold-Funktion findet:

Hier geht es zum Code-Schnipsel -->

Ich weiß ... ich weiß ... der Thread ist Uralt, aber ich wollte hier mal einen Code-Schnipsel für Anfänger hinterlassen, da man bei der Suche nach "Arduino FlipFlop" als erstes auf diesen Thread stößt.

Bitte einen eigenen eröffnen und keine fremden Threads hijacken.

Kannste ja dann auf diesen verweisen....