Leds to be turned off immediately when I turn off the switch

I have merged your cross-posts @schwarz046.

Cross-posting is against the Arduino forum rules. The reason is that duplicate posts can waste the time of the people trying to help. Someone might spend a lot of time investigating and writing a detailed answer on one topic, without knowing that someone else already did the same in the other topic.

Repeated cross-posting can result in a suspension from the forum.

In the future, please only create one topic for each distinct subject matter. This is basic forum etiquette, as explained in the "How to get the best out of this forum" guide. It contains a lot of other useful information. Please read it.

Thanks in advance for your cooperation.

Sim updated to turn all leds off if a button is not pressed..

have fun.. ~q

If you want to outperform your peers about really immidiately aborting the sequence and switching off all leds as soon as the switch is turned to "OFF"
and you want to do this without non-blocking timing

You have to use a while-loop for the delaying where this while-loop includes checking the switch-positions all the time.

Only if you check the switch-positions all the time you can react immidiately on it.
This code-version shows the flaw of this approach.
It could be called

conditional aborting

each new part of the sequence does start with switching on an leds and is then immidiately aborted.
This is the reason why all leds light up and go off again very quick
For reliable operation it is not enough to wire the buttons to plus 5V.
As long as the button is not pressed the input is floating and will catch up electromagnetic noise

Only if you use inputmode INPUT_PULLUP the function works reliable
using INPUT_PULLUP inverts the logic
button pressed is LOW
button released is HIGH (because of the microcontroller-internally activated pullup-resistor)
This code uses INPUT_PULLUP and shows the ugly way of
conditional aborting which is let's say half-blocking but not really non-blocking
button-reading is done with this part of the code

// returns zero if all switches are switched OFF
// otherwise returns 1,2,3,4
byte readSwitches() {
  byte result = 0;

  for (byte Idx = 1; Idx <= 4; Idx++) {
    if (digitalRead(Switch[Idx]) == pressed) {
      result += Idx;
    }
  }
  return result;
}

waiting is done with this part of the code

void waitWithSwitchChecking(unsigned long waitTime) {
  unsigned long millisecCounter = 0;
  switchState  = readSwitches();
  if (switchState == 0) {
    return;
  }
  // switchState != 0 means a switch is ON
  while ( (switchState != 0) && (millisecCounter < waitTime) ) {
    switchState  = readSwitches();
    millisecCounter++; // increase counter each millisecond
    delay(1); // wait a SINGLE millisecond
  }
}

And this is the complete code which also has poor-mans debouncing through an initial delay(50)

#define pressed LOW
#define released HIGH

int LED1 = 13;
int LED2 = 12;
int LED3 = 11;
int LED4 = 10;
int LED5 = 9;
int LED6 = 8;
int LED7 = 7;
int LED8 = 6;
int S1 = 5;
int S2 = 4;
int S3 = 3;
int S4 = 2;

const byte LEDs[9] = {0, 13, 12, 11, 10, 9, 8, 7, 6};
const byte Switch[5] = {0, 5, 4, 3, 2};

boolean allSwitchesOff = true;

int val = HIGH;
byte switchState = 0;

int oneSec = 500;


void setup() {
  Serial.begin(115200);
  Serial.println("Setup-Start");

  for (byte Idx = 1; Idx <= 8; Idx++) {
    pinMode(LEDs[Idx], OUTPUT);
  }

  for (byte Idx = 1; Idx <= 4; Idx++) {
    pinMode(Switch[Idx], INPUT_PULLUP);
  }
}


void allLEDsOff() {
  for (byte Idx = 1; Idx <= 8; Idx++) {
    digitalWrite(LEDs[Idx], LOW);
  }
}


// returns zero if all switches are switched OFF
// otherwise returns 1,2,3,4
byte readSwitches() {
  byte result = 0;

  for (byte Idx = 1; Idx <= 4; Idx++) {
    if (digitalRead(Switch[Idx]) == pressed) {
      result += Idx;
    }
  }
  return result;
}


void waitWithSwitchChecking(unsigned long waitTime) {
  unsigned long millisecCounter = 0;
  switchState  = readSwitches();
  if (switchState == 0) {
    return;
  }
  // switchState != 0 means a switch is ON
  while ( (switchState != 0) && (millisecCounter < waitTime) ) {
    switchState  = readSwitches();
    millisecCounter++; // increase counter each millisecond
    delay(1); // wait a SINGLE millisecond
  }
}


void loop() {
  switchState  = readSwitches();

  if (digitalRead(S1) == pressed) {
    delay(50);
    digitalWrite(LED1, HIGH);//First row
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED2, HIGH);//Secondo row
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED1, LOW);
    digitalWrite(LED3, HIGH);//Third row
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED2, LOW);
    digitalWrite(LED4, HIGH);//Fourth row
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED3, LOW);//FIFTH
    digitalWrite(LED5, HIGH);//FIFTH
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED4, LOW);//SIXTH
    digitalWrite(LED6, HIGH);//SIXTH
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED5, LOW);//SEVENTH
    digitalWrite(LED7, HIGH);//SEVENTH
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED6, LOW);//EIGHTH
    digitalWrite(LED8, HIGH);//EIGHTH
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED7, LOW);//NINETH
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED8, LOW);
  }

  if (digitalRead(S2) == pressed) {
    delay(50);
    digitalWrite(LED1, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED2, LOW);
    digitalWrite(LED1, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED1, HIGH);
    digitalWrite(LED3, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED1, LOW);
    digitalWrite(LED3, LOW);
    digitalWrite(LED2, HIGH);
    digitalWrite(LED4, HIGH);
    digitalWrite(LED2, HIGH);
    digitalWrite(LED4, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED2, LOW);
    digitalWrite(LED4, LOW);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED5, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED5, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED3, LOW);
    digitalWrite(LED5, LOW);
    digitalWrite(LED4, HIGH);
    digitalWrite(LED6, HIGH);
    digitalWrite(LED4, HIGH);
    digitalWrite(LED6, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED4, LOW);
    digitalWrite(LED6, LOW);
    digitalWrite(LED5, HIGH);
    digitalWrite(LED7, HIGH);
    digitalWrite(LED5, HIGH);
    digitalWrite(LED7, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED5, LOW);
    digitalWrite(LED7, LOW);
    digitalWrite(LED6, HIGH);
    digitalWrite(LED8, HIGH);
    digitalWrite(LED6, HIGH);
    digitalWrite(LED8, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED6, LOW);
    digitalWrite(LED8, LOW);
    digitalWrite(LED7, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED7, LOW);
    digitalWrite(LED8, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED8, LOW);
  }

  if (digitalRead(S3) == pressed) {
    delay(50);
    digitalWrite(LED1, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED1, LOW);//1st row
    digitalWrite(LED2, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED2, LOW);//2nd row
    digitalWrite(LED3, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED3, LOW);//3rd row
    digitalWrite(LED4, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED4, LOW);//4th row
    digitalWrite(LED5, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED5, LOW);//5th row
    digitalWrite(LED6, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED6, LOW);//6th row
    digitalWrite(LED7, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED7, LOW);//7th row
    digitalWrite(LED8, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED8, LOW);//8th row
    digitalWrite(LED7, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED7, LOW);//9th row
    digitalWrite(LED6, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED6, LOW);//10th row
    digitalWrite(LED5, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED5, LOW);//11th row
    digitalWrite(LED4, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED4, LOW);//12th row
    digitalWrite(LED3, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED3, LOW);//13th row
    digitalWrite(LED2, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED2, LOW);//14th row
    digitalWrite(LED1, HIGH);//15th row
    waitWithSwitchChecking(oneSec);
  }

  if (digitalRead(S4) == pressed) {
    delay(50);
    digitalWrite(LED1, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED2, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED3, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED4, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED5, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED6, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED7, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED8, HIGH);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED8, LOW);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED7, LOW);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED6, LOW);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED5, LOW);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED4, LOW);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED3, LOW);
    waitWithSwitchChecking(oneSec);
    digitalWrite(LED2, LOW);
    waitWithSwitchChecking(oneSec);
  }

  switchState = readSwitches();
  if (switchState == 0) {
    allLEDsOff();
  }
}

here is the link to the WOKWI-simulation

best regards Stefan

Not poor-mans.

Using poor man's debouncing is easier if you just put that delay() once in the loop function.

50 milliseconds shouldn't matter, and 20 milliseconds should suffice for all but the crappiest switches which you shoukd throw out immediately (in less than 1000 milliseconds) if you are trying to use them.

Placing it once in the loop is also directly the one place where a similar non-blocking method can be used, if @schwarz046 ever cares to do.

a7

1 Like

I'm sorry for misusing the word "immediately" here. I'm didn't mean that when the switch is turned off, the leds will be turned off without a single point of delay. What's happening in my code is that the leds will first finish the pattern of lighting before they turn off. What it should do is to stop without finishing the entire pattern first is the switches are turned off, it's okay for me to wait a single sec for it to turn off

this is good, except that when I try it in my set up. when I pressed switch no.2, it will run first the first pattern before running second pattern. I use dip switch btw not button

Without knowing if you changed the wiring from switch connected to +5V
to
switch connected to ground and using INPUT_PULLUP
it cannot be narrowed down why you observed that.

please post exactly that complete sketch with which you observed this behaviour.

In programming you have to be very precise
precise wiring
precise coding
precise describing

Hallo schwarz046

Welcome to the worldbest Arduino forum ever.

I´v made a small code review.
In general - arrays, structs and a homebrewed timer function are your best friends.

What´s the task of your sketch in real life?

Have a nice day and enjoy coding in C++.

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