Arduino Button Code Switching

Start with something like this and expand it

const byte buttonPin = A3;
byte mode = 0;
const byte maxMode = 1;
byte currentState = HIGH;
byte prevState = HIGH;

void setup()
{
  Serial.begin(115200);
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop()
{
  currentState = digitalRead(buttonPin);
  if (currentState == LOW && prevState == HIGH)  //button became pressed
  {
    mode++;
    if (mode > maxMode)
    {
      mode = 0;
    }
    Serial.println(mode);
  }
  prevState = currentState;
  switch (mode)
  {
    case 0:
      Serial.println("running code for mode 0");
      break;
    case 1:
      Serial.println("running code for mode 1");
      break;
  }
}

NOTE that the code uses INPUT_PULLUP and sees LOW as the button being pressed

Uploaded and I changed nothing but LED light intensity is too low with this code. Why? And button is not working modes are not switch to one another.

BTW, button attached to D2 pin.

If you are referring to my code then it does nothing with LEDs. Please clarify

If you have adapted my code then please post your version

const byte buttonPin = 2;
byte mode = 0;
const byte maxMode = 1;
byte currentState = HIGH;
byte prevState = HIGH;

void setup()
{
  Serial.begin(115200);
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop()
{
  currentState = digitalRead(buttonPin);
  if (currentState == LOW && prevState == HIGH)  //button became pressed
  {
    mode++;
    if (mode > maxMode)
    {
      mode = 0;
    }
    Serial.println(mode);
  }
  prevState = currentState;
  switch (mode)
  {
    case 0:
      Serial.println("running code for mode 0");
      digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
delay(50);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
delay(50);
digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
delay(50);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
delay(50);
digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
delay(50);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
delay(50);
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
delay(50);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
delay(50);
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
delay(50);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
delay(50);
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
delay(50);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
delay(50);
      break;
    case 1:
      Serial.println("running code for mode 1");
      digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
delay(1000);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
delay(1000);
digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
delay(1000);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
delay(1000);
digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
delay(1000);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
delay(1000);
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
delay(1000);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
delay(1000);
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
delay(1000);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
delay(1000);
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
delay(1000);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
delay(1000);
      break;
  }
}

Reminding, button attached to D2 pin with 10k pulldown resistor on breadbord. I can send the pic via PM if you want.

Then it won't work because of the use of INPUT_PULLUP (you were warned). Either change that to INPUT and test for HIGH as a button press or rewire the circuit to take the button pin LOW when the button pin is pressed and remove your pulldown resistor

Which Arduino board are you using ?

Using Arduino Nano

OK. That removes one more worry due to your reference to pin D2

Plesase PM?

Let's continue here so that others can chip in with ideas

My worry about your reference to pin D2 was that you might be using an ESP8266 because when using such a board pin 2 is not the same as pin D2 but as you are using a Nano that is not a problem

What have you decided to do ?

Stick to your pulldown resistor or use INPUT_PULLUP, remove the resistor and test tor LOW as a button press ?

Either will work as ling as the code matches the circuit

It's not the original one it's clone Arduino Nano. Bear in mind. I'm beginner and bear in mind that too.

So, I want to solve this the easiest way because I already spent a lot of time.
Let's overhaul the whole code with pulldown resistor.

here is my board.
https://ibb.co/YfCVZ1q

There is no problem using pulldown resistors other than the fact that they have to be fitted

Here is your code based on mine but with your pin number and pulldown resistor taken account of

const byte buttonPin = 2;
byte mode = 0;
const byte maxMode = 1;
byte currentState = HIGH;
byte prevState = HIGH;

void setup()
{
  Serial.begin(115200);
  pinMode(buttonPin, INPUT);
}

void loop()
{
  currentState = digitalRead(buttonPin);
  if (currentState == HIGH && prevState == LOW)  //button became pressed
  {
    mode++;
    if (mode > maxMode)
    {
      mode = 0;
    }
    Serial.println(mode);
  }
  prevState = currentState;
  switch (mode)
  {
    case 0:
      Serial.println("running code for mode 0");
      digitalWrite(5, HIGH);
      digitalWrite(7, HIGH);
      delay(50);
      digitalWrite(5, LOW);
      digitalWrite(7, LOW);
      delay(50);
      digitalWrite(5, HIGH);
      digitalWrite(7, HIGH);
      delay(50);
      digitalWrite(5, LOW);
      digitalWrite(7, LOW);
      delay(50);
      digitalWrite(5, HIGH);
      digitalWrite(7, HIGH);
      delay(50);
      digitalWrite(5, LOW);
      digitalWrite(7, LOW);
      delay(50);
      digitalWrite(6, HIGH);
      digitalWrite(8, HIGH);
      delay(50);
      digitalWrite(6, LOW);
      digitalWrite(8, LOW);
      delay(50);
      digitalWrite(6, HIGH);
      digitalWrite(8, HIGH);
      delay(50);
      digitalWrite(6, LOW);
      digitalWrite(8, LOW);
      delay(50);
      digitalWrite(6, HIGH);
      digitalWrite(8, HIGH);
      delay(50);
      digitalWrite(6, LOW);
      digitalWrite(8, LOW);
      delay(50);
      break;
    case 1:
      Serial.println("running code for mode 1");
      digitalWrite(5, HIGH);
      digitalWrite(7, HIGH);
      delay(1000);
      digitalWrite(5, LOW);
      digitalWrite(7, LOW);
      delay(1000);
      digitalWrite(5, HIGH);
      digitalWrite(7, HIGH);
      delay(1000);
      digitalWrite(5, LOW);
      digitalWrite(7, LOW);
      delay(1000);
      digitalWrite(5, HIGH);
      digitalWrite(7, HIGH);
      delay(1000);
      digitalWrite(5, LOW);
      digitalWrite(7, LOW);
      delay(1000);
      digitalWrite(6, HIGH);
      digitalWrite(8, HIGH);
      delay(1000);
      digitalWrite(6, LOW);
      digitalWrite(8, LOW);
      delay(1000);
      digitalWrite(6, HIGH);
      digitalWrite(8, HIGH);
      delay(1000);
      digitalWrite(6, LOW);
      digitalWrite(8, LOW);
      delay(1000);
      digitalWrite(6, HIGH);
      digitalWrite(8, HIGH);
      delay(1000);
      digitalWrite(6, LOW);
      digitalWrite(8, LOW);
      delay(1000);
      break;
  }
}

However, I can't stress enough that the delay()s, particularly in mode 1 will cause problems because there are several seconds when the input is not read

first of all with your code, LEDs way too blind it's like not even ON. Can you skim your code again? Something is wrong.

I will change that. This is for just testing.

The pins connected to the LEDs are not set to OUTPUT mode.

These lines from your original code got lost somewhere along the road

  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);

Thank you! This problem solved.

And now 2 modes are working one after another wihout pressing the button.

THE CODE IS WORKING ALMOST FINE, BUT!
When I press the button there is a miliseconds delay between switching modes. Why?

const byte buttonPin = 2;
byte mode = 0;
const byte maxMode = 1;
byte currentState = HIGH;
byte prevState = HIGH;

void setup()
{
  Serial.begin(115200);
  pinMode(buttonPin, INPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
}

void loop()
{
  currentState = digitalRead(buttonPin);
  if (currentState == LOW && prevState == HIGH)  //button became pressed
  {
    mode++;
    if (mode > maxMode)
    {
      mode = 0;
    }
    Serial.println(mode);
  }
  prevState = currentState;
  switch (mode)
  {

case 0:
Serial.println("running code for mode 0");

digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
delay(50);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
delay(50);
digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
delay(50);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
delay(50);
digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
delay(50);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
delay(50);
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
delay(50);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
delay(50);
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
delay(50);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
delay(50);
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
delay(50);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
delay(50);
break;

case 1:
Serial.println("running code for mode 1");

digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
delay(100);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
delay(100);
digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
delay(100);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
delay(100);
digitalWrite(5, HIGH);
digitalWrite(7, HIGH);
delay(100);
digitalWrite(5, LOW);
digitalWrite(7, LOW);
delay(100);
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
delay(100);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
delay(100);
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
delay(100);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
delay(100);
digitalWrite(6, HIGH);
digitalWrite(8, HIGH);
delay(100);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
delay(100);
break;
}
}

I would expect that to be up to 0.6 of a second when in mode 0 and up to 1.2 seconds in mode 1. The reason is:

How we can solve this?

You were warned about the effects of using delay()

It is just as well that you removed the 1 second delay()s that were present in an earlier version of your code or things would be much, much worse

Not easy. But you will learn much once you have accomplished that, with our help.

How badly do you want that?

Is the problem, in your opinion, that there is a delay before the mode changes, or is the problem that short presses are completely missed?