One Push button Multiple LED effects

Hi,
Im trying to create multiple lighting LED effects using a single push button.
Simply :-
1 press turn all LEDs
2nd Press Chaser
3rd Press alternate Blinking
4th Press off
I believe im having issues with Blink without delay as my push button is unresponsive however i cant understand or find an example off this working with multiple leds in the way im trying to do it.
Does anybody have an example one push button led state change without delay i could use? The ultimate goal is to replace the LEDs with RGB and add potentiometers to change the colours.

Any help would be appreciated

Thanks

Lewis

int switchPin = 2;
int LedPin1 = 3;
int LedPin2 = 4;
int LedPin3 = 5;
int LedPin4 = 6;
int LedPin5 = 7;
int LedPin6 = 8;
int LedPin7 = 9;
int LedPin8 = 10;
int LedPin9 = 11;
int LedPin10 = 12;
int val;
int val2;
int buttonState;
int Mode = 0;
int dt = 250;
int dt2 = 750;


byte counter = 0;
void setup() {
  pinMode(switchPin, INPUT);
  pinMode(LedPin1, OUTPUT);
  pinMode(LedPin2, OUTPUT);
  pinMode(LedPin3, OUTPUT);
  pinMode(LedPin4, OUTPUT);
  pinMode(LedPin5, OUTPUT);
  pinMode(LedPin6, OUTPUT);
  pinMode(LedPin7, OUTPUT);
  pinMode(LedPin8, OUTPUT);
  pinMode(LedPin9, OUTPUT);
  pinMode(LedPin10, OUTPUT);
  buttonState = digitalRead(switchPin);
  Serial.begin(9600);

}
void loop() {
      
  val = digitalRead(switchPin);
  delay(100);
  val2 = digitalRead(switchPin);
  if (val == val2) {
    if (val != buttonState) {
      if (val == LOW) {
        if (Mode == 0) {
          Mode = 1;
        } else {
          if (Mode == 1) {
            Mode = 2;
          } else {
            if (Mode == 2) {
              Mode = 3;
            } else {
              if (Mode == 3) {
                Mode = 0;
              }
            }
          }
        }
      }
    }
    buttonState = val;
     Serial.println(Mode);
  }
  if (Mode == 0) { // all-off
    digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, LOW);
  }
  if (Mode == 1) {
    digitalWrite(LedPin1, HIGH);
    digitalWrite(LedPin2, HIGH);
    digitalWrite(LedPin3, HIGH);
    digitalWrite(LedPin4, HIGH);
    digitalWrite(LedPin5, HIGH);
    digitalWrite(LedPin6, HIGH);
    digitalWrite(LedPin7, HIGH);
    digitalWrite(LedPin8, HIGH);
    digitalWrite(LedPin9, HIGH);
    digitalWrite(LedPin10, HIGH);
  }
  if (Mode == 2) {
 
     digitalWrite(LedPin1, HIGH);
    digitalWrite(LedPin2, HIGH);
    digitalWrite(LedPin3, HIGH);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, LOW);
    delay(dt);
      digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, HIGH);
    digitalWrite(LedPin3, HIGH);
    digitalWrite(LedPin4, HIGH);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, LOW);
    delay(dt);
         digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, HIGH);
    digitalWrite(LedPin4, HIGH);
    digitalWrite(LedPin5, HIGH);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, LOW);
    delay(dt);
         digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, HIGH);
    digitalWrite(LedPin5, HIGH);
    digitalWrite(LedPin6, HIGH);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, LOW);
    delay(dt);
         digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, HIGH);
    digitalWrite(LedPin6, HIGH);
    digitalWrite(LedPin7, HIGH);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, LOW);
    delay(dt);
         digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, HIGH);
    digitalWrite(LedPin7, HIGH);
    digitalWrite(LedPin8, HIGH);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, LOW);
    delay(dt);
         digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, HIGH);
    digitalWrite(LedPin8, HIGH);
    digitalWrite(LedPin9, HIGH);
    digitalWrite(LedPin10, LOW);
    delay(dt);
         digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, HIGH);
    digitalWrite(LedPin9, HIGH);
    digitalWrite(LedPin10, HIGH);
    delay(dt);
         digitalWrite(LedPin1, HIGH);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, HIGH);
    digitalWrite(LedPin10, HIGH);
    delay(dt);
 
          digitalWrite(LedPin1, HIGH);
    digitalWrite(LedPin2, HIGH);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, HIGH);
    delay(dt);
      
  }
  if (Mode == 3) {
    digitalWrite(LedPin1, HIGH);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, HIGH);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, HIGH);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, HIGH);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, HIGH);
    digitalWrite(LedPin10, LOW);
    delay(dt2);
        digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, HIGH);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, HIGH);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, HIGH);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, HIGH);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, HIGH);
     delay(dt2);
  }
}

Here is an example using the state change detection to select the mode with one button.

/*
   The circuit:
   - pushbutton attached to pin 12 from ground
   - the internal pullup on pin 12 is enabled
*/

// this constant won't change:
const byte  buttonPin = 12;    // the pin that the pushbutton is attached to
const byte ledPin = 13;       // the pin that the LED is attached to

const byte NumOfModes = 3;

byte mode = 0;

void setup()
{
   // initialize the button pin as a input:
   pinMode(buttonPin, INPUT_PULLUP);
   // initialize the LED as an output:
   pinMode(ledPin, OUTPUT);
   // initialize serial communication:
   Serial.begin(115200);

}

void loop()
{
   checkButton();
}

void checkButton()
{
   boolean buttonState = digitalRead(buttonPin);         // current state of the button
   static boolean lastButtonState = HIGH;     // previous state of the button
   static unsigned long timer = 0;
   unsigned long interval = 20;
   if (millis() - timer >= interval)
   {
      timer = millis();

      // read the pushbutton input pin:
      buttonState = digitalRead(buttonPin);

      // compare the buttonState to its previous state
      if (buttonState != lastButtonState)
      {
         // if the state has changed, increment the counter
         if (buttonState == LOW)
         {
            // if the current state is LOW then the button went from off to on:
            mode++;           
            if ( mode > NumOfModes)
            {
               mode = 0;
            }
            switch (mode)
            {
               case 0:
                  Serial.println("mode 0");
                  break;
               case 1:
                  Serial.println("mode 1");
                  break;
               case 2:
                  Serial.println("mode 2");
                  break;
               case 3:
                  Serial.println("mode 3");
                  break;
            }
         }
         // save the current state as the last state, for next time through the loop
         lastButtonState = buttonState;
      }
   }
}

Hi Thanks for you help groundFungus!
this nearly works for my purposes however mode 2 & 3 require loops not sure how to include this?
Also you cant change mode until the mode has completed its run

Thanks

/*
   The circuit:
   - pushbutton attached to pin 12 from ground
   - the internal pullup on pin 12 is enabled
*/

// this constant won't change:
const byte  buttonPin = 2;    // the pin that the pushbutton is attached to
int LedPin1 = 3;
int LedPin2 = 4;
int LedPin3 = 5;
int LedPin4 = 6;
int LedPin5 = 7;
int LedPin6 = 8;
int LedPin7 = 9;
int LedPin8 = 10;
int LedPin9 = 11;
int LedPin10 = 12;
int dt = 250;
int dt2 = 750;
const byte NumOfModes = 3;

byte mode = 0;

void setup()
{
   // initialize the button pin as a input:
   pinMode(buttonPin, INPUT_PULLUP);
   // initialize the LED as an output:
    pinMode(LedPin1, OUTPUT);
  pinMode(LedPin2, OUTPUT);
  pinMode(LedPin3, OUTPUT);
  pinMode(LedPin4, OUTPUT);
  pinMode(LedPin5, OUTPUT);
  pinMode(LedPin6, OUTPUT);
  pinMode(LedPin7, OUTPUT);
  pinMode(LedPin8, OUTPUT);
  pinMode(LedPin9, OUTPUT);
  pinMode(LedPin10, OUTPUT);
   // initialize serial communication:
   Serial.begin(9600);

}

void loop()
{
   checkButton();
}

void checkButton()
{
   boolean buttonState = digitalRead(buttonPin);         // current state of the button
   static boolean lastButtonState = HIGH;     // previous state of the button
   static unsigned long timer = 0;
   unsigned long interval = 20;
   if (millis() - timer >= interval)
   {
      timer = millis();

      // read the pushbutton input pin:
      buttonState = digitalRead(buttonPin);

      // compare the buttonState to its previous state
      if (buttonState != lastButtonState)
      {
         // if the state has changed, increment the counter
         if (buttonState == LOW)
         {
            // if the current state is LOW then the button went from off to on:
            mode++;           
            if ( mode > NumOfModes)
            {
               mode = 0;
            }
            switch (mode)
            {
               case 0:
                  Serial.println("mode 0");
    digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, LOW);
                  break;
               case 1:
                  Serial.println("mode 1");
                      digitalWrite(LedPin1, HIGH);
    digitalWrite(LedPin2, HIGH);
    digitalWrite(LedPin3, HIGH);
    digitalWrite(LedPin4, HIGH);
    digitalWrite(LedPin5, HIGH);
    digitalWrite(LedPin6, HIGH);
    digitalWrite(LedPin7, HIGH);
    digitalWrite(LedPin8, HIGH);
    digitalWrite(LedPin9, HIGH);
    digitalWrite(LedPin10, HIGH);
                  break;
               case 2:
                digitalWrite(LedPin1, HIGH);
    digitalWrite(LedPin2, HIGH);
    digitalWrite(LedPin3, HIGH);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, LOW);
    delay(dt);
      digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, HIGH);
    digitalWrite(LedPin3, HIGH);
    digitalWrite(LedPin4, HIGH);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, LOW);
    delay(dt);
         digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, HIGH);
    digitalWrite(LedPin4, HIGH);
    digitalWrite(LedPin5, HIGH);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, LOW);
    delay(dt);
         digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, HIGH);
    digitalWrite(LedPin5, HIGH);
    digitalWrite(LedPin6, HIGH);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, LOW);
    delay(dt);
         digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, HIGH);
    digitalWrite(LedPin6, HIGH);
    digitalWrite(LedPin7, HIGH);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, LOW);
    delay(dt);
         digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, HIGH);
    digitalWrite(LedPin7, HIGH);
    digitalWrite(LedPin8, HIGH);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, LOW);
    delay(dt);
         digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, HIGH);
    digitalWrite(LedPin8, HIGH);
    digitalWrite(LedPin9, HIGH);
    digitalWrite(LedPin10, LOW);
    delay(dt);
         digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, HIGH);
    digitalWrite(LedPin9, HIGH);
    digitalWrite(LedPin10, HIGH);
    delay(dt);
         digitalWrite(LedPin1, HIGH);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, HIGH);
    digitalWrite(LedPin10, HIGH);
    delay(dt);
 
          digitalWrite(LedPin1, HIGH);
    digitalWrite(LedPin2, HIGH);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, HIGH);
    delay(dt);
                  Serial.println("mode 2");
                  break;
               case 3:
                  Serial.println("mode 3");
                      digitalWrite(LedPin1, HIGH);
    digitalWrite(LedPin2, LOW);
    digitalWrite(LedPin3, HIGH);
    digitalWrite(LedPin4, LOW);
    digitalWrite(LedPin5, HIGH);
    digitalWrite(LedPin6, LOW);
    digitalWrite(LedPin7, HIGH);
    digitalWrite(LedPin8, LOW);
    digitalWrite(LedPin9, HIGH);
    digitalWrite(LedPin10, LOW);
    delay(dt2);
        digitalWrite(LedPin1, LOW);
    digitalWrite(LedPin2, HIGH);
    digitalWrite(LedPin3, LOW);
    digitalWrite(LedPin4, HIGH);
    digitalWrite(LedPin5, LOW);
    digitalWrite(LedPin6, HIGH);
    digitalWrite(LedPin7, LOW);
    digitalWrite(LedPin8, HIGH);
    digitalWrite(LedPin9, LOW);
    digitalWrite(LedPin10, HIGH);
     delay(dt2);
                  break;
            }
         }
         // save the current state as the last state, for next time through the loop
         lastButtonState = buttonState;
      }
   }
}

Meaning the sequences under case 2 & 3 repeat endlessly until the button moves the code to the next sequence?

This is because there's a quarter-second delay after each pattern. So for example, it takes a minimum of 10 x 250ms to run case 2 and you don't check the input again 'til the case ends and you start over at the top of loop().  You need to move to millis()-based timing.

Take a look at the blinker code in post #7 of this thread: Timer counter state change toggle FSM - all at once.

No, you are not having issues with Blink without delay. You are not using blink without delay. You are using blink with delay.

Hi Dougp, Yes exactly mode 2 & 3 repeat endlessly, thanks for the example code! ill review! thanks for your help much appreciated

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