If-Schleife mit Millis()

Hallo Arduino-Gemeinde,
dies ist mein erster Beitrag in diesem Forum und ich hoffe, dass ich alles richtig mache und mir jemand helfen kann.
Ich habe ein kleines Sketch geschrieben, der zwei LEDs zum gegeneinander blinken veranlassen soll. Aber der Reihe nach.
Bei jeder Unterbrechung der Gabellichtschranke_1 wird ein Counter hochgezählt (also +1). Mit der Gabellichtschranke_2 wird der Counter wieder runtergezählt (also -1). Wenn der Counter also ungleich 0 ist, sollen die LEDs gegeneinander blinken. Das Blinken soll über millis() gesteuert werden. Die if Abfrage wäre folgendermaßen:

//-------Blinken-------------------------

  if (counter_1 != 0)                         //wenn Counter ungleich 0,
  {
    if (millis() - start >= intervall)
    {
      statusLED_A = !statusLED_A;               //LED-Status wird umgedreht
      digitalWrite(ledPin_A, statusLED_A);      //LED je nach Status AN oder AUS
      statusLED_B = !statusLED_B;
      digitalWrite(ledPin_B, statusLED_B);
      start = millis();  
    }
  else                                        //wenn Counter = 0
  {
    digitalWrite(ledPin_A, LOW);              //dann LED_A aus    
    digitalWrite(ledPin_B, LOW);              //dann LED_B aus
  }
  }

}     //Klammer von der void loop()
//-------ENDE---------------------------

Eigentlich würde ich davon ausgehen, dass die LEDs A+B ausgehen, wenn der Counter = 0 ist. Leider verhält sich die if-Schleife nicht so. Die LEDs blinken zwar, aber sie leuchten nur ganz schwach. Wenn ich die beiden digitalWrite(ledPin_A, LOW); und digitalWrite(ledPin_B, LOW); rausnehme, blinken die LEDs in voller Leuchtkraft, aber wenn der Counter = 0 ist bleibt immer eine LED ständig an.
Ich habe schon einiges versucht, aber ich bekomme es einfach nicht hin.
Ich hoffe nun, dass mir jemand auf die Sprünge helfen kann.

Nachfolgend noch der komplette Sketche:
Ups, dass ist schade, aber als Neuling darf ich leider noch nichts hochladen. Vielleicht könnt ihr mir trotzdem helfen.

Mit freundlichen Grüßen
Detlev

Drücke mal STRG+T in der Arduino IDE

Dann siehst du, dass das else nicht zum ersten if gehört.

Hallo Plumps,
ich bin begeistert und sprachlos. Ich nehme an, ein Blick von Dir auf den Sketch und die Sache war für Dich klar. Einfach Super und vielen herzlichen Dank.
Ich wünsche Dir noch einen schönen Tag und bleib bitte gesund.

Mit freundlichen Grüßen
Detlev

Du brauchst noch eine bool Variable in der Du Dir merkst, das Du noch nicht im Blinkmodus bist.
Warum? 10 sekunden Intervall als Vorgabe
Deine Variante:
0:00 Start blink
0:10 intervall blink
0:20 intervall blink
0:22 Stop blink
0:24 Start -> Intervall noch nicht abgelaufen
// Sechs Sekunden passiert nichts
0:30 blink

Meine Variante:
0:00 Start Merker gelöscht? Ja: blink und Merker setzen
0:10 intervall blink
0:20 intervall blink
0:22 Stop blink Merker löschen
0:24 Start -> Intervall noch nicht abgelaufen
0:24 Merker gelöscht? Ja: blink und Merker setzen
0:34 intervall blink
0:44 intervall blink
0:46 Stop blink Merker löschen

if (counter_1 != 0)                         // wenn Counter ungleich 0...
{
  if (millis() - start >= intervall ||      // ... und Zeit abgelaufen ODER ...
      isStart == false)                     // ... vorher nicht ausgelöst
  {
    statusLED_A = !statusLED_A;             // LED-Status wird umgedreht
    digitalWrite(ledPin_A, statusLED_A);    // LED je nach Status AN oder AUS
    statusLED_B = !statusLED_B;
    digitalWrite(ledPin_B, statusLED_B);
    start = millis();
    isStart = true;
  }
}
else                                        // wenn Counter == 0
{
  digitalWrite(ledPin_A, LOW);              // dann LED_A aus
  digitalWrite(ledPin_B, LOW);              // dann LED_B aus
  isStart = false;
}

Hallo my_xy_projekt,
vielen Dank für Deinen Tipp. Ich habe ihn sofort ausprobiert.
Wenn ich Deine Änderung in den Sketch einbaue, verändert sich das blinkverhalten so, dass der Blinkvorgang jedes mal gestartet wird, wenn ich den Counter hochzähle. So sollte es nicht sein. Es sollte kontinuierlich weiter blinken bis der Counter wieder auf 0 ist. Das tut er, ohne Deine Änderung.
Trotzdem nochmal vielen Dank für Deinen Tipp.

Mit freundlichen Grüßen
Detlev

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.