Running a LED flash loop with a start/stop button

I'm very new to programming, and struggling with a code set. I'm trying to run a simple LED flash sequence. I want it to start when the push button is pressed, and run, until it is pressed again. I can only get it to run once, and not loop continuously.

Any help is appreciate.

-Wrench

#define LED1 13
#define LED2 12
#define LED3 11
#define BUTTON_PIN 6

byte lastButtonState;
byte ledState = LOW;

unsigned long lastTimeButtonStateChanged = millis();
unsigned long debounceDuration = 50; // millis

const int delayTime = 200;

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(BUTTON_PIN, INPUT);
  lastButtonState = digitalRead(BUTTON_PIN);
}

void loop() {
  if (millis() - lastTimeButtonStateChanged >= debounceDuration){
  byte buttonState = digitalRead(BUTTON_PIN);
    if (buttonState != lastButtonState){
    lastTimeButtonStateChanged = millis();
    lastButtonState = buttonState;
    if (buttonState == LOW) {
      digitalWrite(LED1, HIGH); // Turn LED 1 on

     delay(delayTime);

      digitalWrite(LED1, LOW);  // Turn LED 1 off
      digitalWrite(LED2, HIGH); // Turn LED 2 on

      delay(delayTime);

      digitalWrite(LED2, LOW);  // Turn LED 2 off
      digitalWrite(LED3, HIGH); // LED 3 ON

      delay(delayTime);

      digitalWrite(LED3, LOW);

    }
  }
}
}
#define LED1 13
#define LED2 12
#define LED3 11
#define BUTTON_PIN 6
#define delayTime  200

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
}

void loop() {
  if (!digitalRead(BUTTON_PIN)) 
  {
    digitalWrite(LED1, HIGH); // Turn LED 1 on
    delay(delayTime);
    digitalWrite(LED1, LOW);  // Turn LED 1 off
 
    digitalWrite(LED2, HIGH); // Turn LED 2 on
    delay(delayTime);
    digitalWrite(LED2, LOW);  // Turn LED 2 off
 
    digitalWrite(LED3, HIGH); // LED 3 ON
    delay(delayTime);
    digitalWrite(LED3, LOW);
    while (!digitalRead(BUTTON_PIN));
  }
}
1 Like

Unfortunately this didn't solve the issue. Does it matter that this is an Uno R3?
I still get one run of the LEDs and then it stops. I don't get the loop of the LEDs continuously.

you said: one press - one run

My bad. I meant. One press, continuous run until pressed again.

#define LED1 13
#define LED2 12
#define LED3 11
#define BUTTON_PIN 6
#define delayTime  200

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
}

void loop() {
  static bool isActive = false;

  if (!digitalRead(BUTTON_PIN)) {
    isActive = !isActive;
    delay(20);
    while (!digitalRead(BUTTON_PIN));
  }

  if (isActive)  {
    digitalWrite(LED1, HIGH); // Turn LED 1 on
    delay(delayTime);
    digitalWrite(LED1, LOW);  // Turn LED 1 off

    digitalWrite(LED2, HIGH); // Turn LED 2 on
    delay(delayTime);
    digitalWrite(LED2, LOW);  // Turn LED 2 off

    digitalWrite(LED3, HIGH); // LED 3 ON
    delay(delayTime);
    digitalWrite(LED3, LOW);
  }
}

updated
OR ....

Hello heli_wrench

Welcome to the best Arduino forum ever :slight_smile:

What is the task of the sketch in real life?

#define LED1 13
#define LED2 12
#define LED3 11
#define BUTTON_PIN 2    //     <------   attention <-----  pin changed, very important
#define delayTime  200
volatile bool didPressed = false;

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), change, FALLING);
}

void change() {
   if (!didPressed)didPressed = true;
}

void loop() {
  static bool isActive = false;

  if (didPressed) {
    delay(20);
    didPressed = false;
    isActive = !isActive;
  }

  if (isActive)  {
    digitalWrite(LED1, HIGH); // Turn LED 1 on
    delay(delayTime);
    digitalWrite(LED1, LOW);  // Turn LED 1 off

    digitalWrite(LED2, HIGH); // Turn LED 2 on
    delay(delayTime);
    digitalWrite(LED2, LOW);  // Turn LED 2 off

    digitalWrite(LED3, HIGH); // LED 3 ON
    delay(delayTime);
    digitalWrite(LED3, LOW);
  }
}

or even:

const byte LEDs[] = {13, 12, 11};

#define BUTTON_PIN 2    //     <------   attention <-----  pin changed, very important
#define delayTime  200
volatile bool didPressed = false;

void setup() {
   for (byte i = 0; i < sizeof(LEDs); i++)pinMode(LEDs[i], OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), change, FALLING);
}

void change() {
  if (!didPressed)didPressed = true;
}

void loop() {
  static bool isActive = false;
  static uint32_t oldMillis = 0;
  static byte index = 0;

  if (didPressed) {
    delay(20);
    isActive = !isActive;
    digitalWrite(LEDs[index], HIGH);
    oldMillis = millis();
    didPressed = false;
  }

  if (isActive)  {
    if (millis() - oldMillis >= delayTime) {
      digitalWrite(LEDs[index], LOW);
      index = (1+index) % sizeof(LEDs);
      digitalWrite(LEDs[index], HIGH);
      oldMillis = millis();
    }
  }
  else for (byte i = 0; i < sizeof(LEDs); i++)digitalWrite(LEDs[i], LOW); // when this line commented out then leds will not cleared at stop
}

Perfect thanks. This worked.

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