2 LED´s mit 2 Tastern wie schaffe ich es einen aktion zu beenden

Hallo zusammen,

inzwischen ist mein StarterKit da und ich habe ein wenig rum gefummelt.

Habe mir jetzt was gebaut, aber es geht noch nicht 100 % wie ich es will.

Hardware Arduino Uno
2 LED´s
2 Taster
4 Widerstände

wenn ich den linken Taster drücke blinkt es links und wenn ich den rechten Taster drücke blinkt es rechts.
Nur wenn ich mich mal verdrückt habe, kann ich es nicht unterbrechen.
Wie bekomme ich das hin, dass wenn ich links gedrückt habe und rechts will die Led auf hört zu blinken wenn ich rechts drücke?

int BlinkerLinks = 9;
int tasterLinks = 11;
int BlinkerRechts = 12;
int tasterRechts = 8;

void setup(){
  pinMode(BlinkerLinks,OUTPUT);
  pinMode(tasterLinks,INPUT);
  pinMode(BlinkerRechts,OUTPUT);
  pinMode(tasterRechts,INPUT);
}

void loop(){

  if (digitalRead(tasterLinks)==HIGH) 
  for (int zaehler=1; zaehler<=5; zaehler = zaehler+1){
    digitalWrite(BlinkerLinks, HIGH);
    delay(400);
    digitalWrite(BlinkerLinks, LOW);
    delay(400);
  }

    if (digitalRead(tasterRechts)==HIGH) 
  for (int zaehler=1; zaehler<=5; zaehler = zaehler+1){
    digitalWrite(BlinkerRechts, HIGH);
    delay(400);
    digitalWrite(BlinkerRechts, LOW);
    delay(400);
  }
  delay(20);
}

Vielen Dank für eure Unterstützung.

Gruß
Dacapo

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).

Gruß Tommy

Wie bekomme ich das hin, dass wenn ich links gedrückt habe und rechts will die Led auf hört zu blinken wenn ich rechts drücke?

du blockierst dich aktuell in deiner For-Anweisung.
Du siehst ja selber, dass die For-Schleife erst nach hartem Ablauf der 5 Durchgänge beendet wird. Der andere Button wird da drinnen nicht abgefragt. Es wäre imho auch schmutzig, da jetzt ein if AndererButton dann break zu ergänzen.

Du sollst dir das Beispiel "BlinkWithoutDelay" ansehen, wie man derartige Blockaden vermeidet, dann eine Statemaschine schreiben die entweder die eine oder andere LED blinken lässt.

Und setze deinen Sketch, wie schon geschrieben, in Code-Tags. Erst dann ist dieser vernünftig lesbar.

Hallo und Danke.

Ich habe mir jetzt verschiedene Statemaschines angeschaut.

Leider nur Beispiele an Hand von Ampeln gefunden.

Kann man in einer Statemaschine auch den Zustand erreichen das sie nichts macht?

Habe es jetzt so verstanden, das wenn ich das Blinken unterbreche, er den loop, nach Ende des blinken rechts dann weiter führt.
Ist das richtig?

Ich weiß ich stelle bestimmt dumme Fragen...
Suche mich auch schon seit 2 Tagen durch verschiedene Foren.

Bedenkt bitte, jeder Anfang ist schwer und ich hoffe ihr habt ein wenig Nachsicht mit mir.

Vielen lieben Dank.

Ja, wenn der Sketch richtig aufgebaut ist, durchläuft er ständig die Loop, heißt ja auch Schleife.
Somit macht die Statemachine immer etwas und reagiert weiterhin auf Anweisungen. Nach deren Durchführung (z.B. Blinken) durchläuft er weiterhin die Loop.
Damit das alles ohne Probleme und Verzögerungen läuft, sollten delays vermieden werden.
Die blockieren diesen Ablauf und stören dadurch.

Danke Dieter,

Also müsste ich ein case schreiben, der beide LEDs auf low und die Taster auch auf low setzt. Würde das funktionieren?

Baue erstmal anhand des Beispiels "BlinkWithoutDelay" einen Sketch in dem du 2 unabhängige Leds blinken lässt.
Die Leds schaltest du dann mittels Statusvariablen auf blinken oder nicht blinken.

Hallo,

hier noch anschaulicher erklärt.

Theseus erklärt millis()
http://forum.arduino.cc/index.php?topic=400102.msg2752141#msg2752141

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung
http://forum.arduino.cc/index.php?topic=423688.0

Dann gehe Zeile für Zeile immer wieder durch und lerne was der Reihe nach abläuft und sich verändert

const byte LED13 = 13;

void setup()
{
  pinMode(LED13, OUTPUT);           
}

void loop()
{
  heartbeat();
}


void heartbeat ()                         
{
  static unsigned long last_ms = 0;
  static bool state = LOW;
  const unsigned int INTERVAL = 500;
  
  if (millis() - last_ms > INTERVAL) {
    last_ms = millis();
    state = !state;
    digitalWrite(LED13, state);
  }
}

Auch wenn sich bei einem solchen Mini-Lernprojekt der Sinn vlt. nicht gleich erschießt ... versuche dir (für die Zukunft) folgenden modularen Programmier-Stil anzugewöhnen: "EVA". Das steht für "Eingabe", "Verarbeitung" und "Ausgabe". Das sorgt Übersichtlichkeit und Wartbarkeit (leichte Änderungen)

Bezogen auf dein Projekt heisst das, dass du weitgehend getrennte Prorammteile (Funktionen) anlegst, die unabhängig von eineander arbeiten und nutzbar sind. Also ...

  1. du liest den Zustand der Taster ein und legst diese Infos in globalen Variablen (Skalare oder Arrays) ab
  2. du führst die einsprechende Verarbeitung durch (Logik, Kombinatorik), legst die Ergebnisse wiederum ab
  3. du machst die Ausgaben (z.B. Pins setzen, an denen LEDs, Relais oder andere "Verbraucher" hängen)
  4. gehe zu 1

Es wird bestimmt gleich Kritiker geben, die hier schreiben, dass sei altmodisch oder zumindest völlig übertrieben. Hör' nicht darauf. Diese Methode ist die einzige, mit der man auch größere Projekte im Überblick behält und je eher man sich daran gewöhnt, umso einfacher hat man es später ...

Dacapo:
Leider nur Beispiele an Hand von Ampeln gefunden.

Zugegeben liebe ich diese Beispiele! Kennst Du auch die Ampel mit "Fußgänger-Anforderung"? Da gibt es eine Variante von RudiDL5 und eine prozedurale von mir. Bei meiner gibt es case WARTEN, wo auf den Druck auf den "Bettelknopf" gewartet wird.

Im Thema Wieder bewässerung gibt es ein Beispiel, wo nicht auf einen Knopfdruck, aber auf Trockenheit gewartet wird. Schaue Dir da nur die Methode run() an, denn case MESSEN wartet.