Lauflicht Arduino

Hi Leute, das ist mein erster Eintrag hier.

Ich muss für die Schule ein Projekt machen, wo ein Lauflicht zu implementieren ist.
Dafür habe ich eine for-Schleife verwendet und die funktioniert wunderbar.

Nur muss ich noch einen Button hinzufügen, der das Lauflicht an der aktuellen Position stoppt, und beim erneuten Drücken fortgesetzt wird.
Hier komme ich nicht weiter.
Das ist mein Code bist jetzt.

int ledArray[3]; //sind 3 LEDs deswegen ein Array
int pin=7;
int button=3;

void setup() {
 for(int i = 0; i<3; i++){
 ledArray[i]=pin;
 pin++;
 pinMode(ledArray[i], OUTPUT);
 }
 pinMode(button, INPUT_PULLUP);
}

void loop() {
 
 int value=digitalRead(button);

 for(int i = 0; i<3; i++){
   digitalWrite(ledArray[i], HIGH);
   delay(250);
   digitalWrite(ledArray[i], LOW);
   delay(250);
 }
}

Wäre froh wenn mir jemand helfen könnte.
Liebe Grüße

Zunächst ist es schwierig für deinen Arduino eine Betätigung des Tasters zu erkennen, da Du ihn quasi die ganze Zeit stopsst. mit delay verbietest du im quasi für 250ms Sekunden irgendetwas zu machen, dann darf er etwas erledigen, was ihm vielleicht ein paar MikroSekunden kostet, dann stoppst Du ihn wieder....

Das geht leider nur durch einen komplett anderen Ansatz.

Nachdem du den Unterschied zwischen Blink ( mit zwei delay() ) und BlinkWithoutDelay erkannt und verstanden hast, kannst du ja mal was ähnliches für dein Lauflicht versuchen.

Tip: statt der for Schleife ist der aktuelle Zustand in Variablen abgelegt und loop() ist deine Schleife...
Dann kann man einfach in jedem Schritt den Taster auslesen.

Bei dir wird der Taster nur alle 23250 = 1500 ms einmal gelesen.
Ein einziges delay(250) in loop() wäre schon besser, um nach jedem Schritt reagieren zu können.

Wozu braucht es übrigens einen weiteren Taster?

  • Einfach : während der Taster gedrückt ist, läuft das Lauflicht. Wenn der Taster losgelassen ist, steht es.

  • Schwieriger: Einmal drücken startet das Lauflicht, nochmal Drücken stoppt es. Was passiert, wenn der Tastendruck kürzer als 250 ms oder länger als 500 ms ist ?

Hallo,

ich habe dir einen Teil vorbereitet und dein LED Array korrigiert. Die vierte Led dient zur Statusanzeige des Tasters mit Schalterfunktion. Dafür habe ich die Bounce2 Lib verwendet. Die Funktion "heartbeat" (agmue's Idee) dient zur Anzeige ob dein Sketch blockiert oder noch arbeitet. Beides kannste entfernen durch löschen der Zeile 54 und der Funktion Zeile 61.

Deine Lauflichtfunktion schreibste komplett um ohne delay und ohne Schleife. Dafür benötigst du millis(). Hier zwei verständliche Erklärungen dazu. Sketch lesen und verstehen solltest du natürlich auch. Wenn du das alles am Ende dem Lehrer erklären kannst, gibt das Punkte satt. Ich hoffe das dich das nicht erschlägt. Für dein Lauflicht noch einen Hinweis. Erstelle dir auf Papier einen Ablaufplan bzw. Ablaufdiagramm. Dann siehst du ohne eine Zeile Code was muss wie und wann passieren. Wenn das im Ablauf alles logisch klar ist setzte das in Code um.

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

// https://forum.arduino.cc/index.php?topic=577148.0

#include <Bounce2.h>    // https://github.com/thomasfredericks/Bounce2

const byte ledArray[] = {7, 8, 9, 10}; // LED Pins
const byte button = 3;

const byte ANZAHL_LED = sizeof(ledArray) / sizeof(ledArray[0]);

Bounce debouncer = Bounce();    // Instantiate a Bounce object


void setup() {

  debouncer.attach(button);
  debouncer.interval(40);

  for (byte i=0; i<ANZAHL_LED; i++) {
    pinMode(ledArray[i], OUTPUT);
  }

  pinMode(LED_BUILTIN, OUTPUT);   // LED13
  pinMode(button, INPUT_PULLUP);

}

void loop() {

  if (update_Taster() )  {            // wenn Rückgabewert true
    // hier sinnvolle Dinge tun
    // ...
    lauflicht();
  }
  
  heartbeat();
}


// ****** Funktionen ******
void lauflicht ()
{

}


bool update_Taster ()                     // Funktionalität eines Schalters
{
  static bool state = false;
  
  debouncer.update();                     // aktualisiere bounce instance

  if ( debouncer.fell() ) {     
    state = !state;                       // toggle Rückgabewert
    digitalWrite(ledArray[3], state);     // Statusanzeige
  }
  
  return state;
}


void heartbeat ()
{
  static bool state = LOW;
  static unsigned long last_millis = 0;
  const unsigned int INTERVAL = 500;          // [ms]
  
  if (millis() - last_millis > INTERVAL) {
    last_millis = millis();
    state = !state;
    digitalWrite(LED_BUILTIN, state);
  }
}

Hey Leute,

ich bedanke mich bei jedem einzelnen für eure Antworten!

Ihr habt mir sehr geholfen. Ich werde die Tipps gleich umsetzen.
Alles Gute!