Arduino Button Code Switching

Hi, I'm working on police flasher project and using Arduino Nano for it.

Here is my code and it's working as expected but I want to add a button to switch modes. I will proceed after solve the button issue.

This code is Mode 1.

void setup() {
pinMode(2, INPUT); //Mode Button
pinMode(5, OUTPUT); // LED RED
pinMode(6, OUTPUT); // LED BLUE
pinMode(7, OUTPUT); // LED WHITE
pinMode(8, OUTPUT); // LED WHITE
}

void loop() {

if (digitalRead == (2, HIGH)); // When Mode button is pushed...
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);

//so on...
}

This is Mode 2

void loop() {

if (digitalRead == (2, HIGH)); // When Mode button is pushed...
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(20);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(20);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(20);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(20);

When I press the button I want to switch 1. Mode's loop to 2. Modes loop. But could't make it. Someone help please.

1 Like

Please post the full code of your best attempt, using code tags when you do, and describe the problems you encountered

1 Like

should be

if (digitalRead(2) == HIGH) {

You must carefully follow the rules of C/C++ language. You cannot choose to write something that you think might be the same thing.

1 Like

When I press the button it won't switch to Mode 2 :frowning: What's wrong in the code?

void setup() {
pinMode(2, INPUT); //Mode Button
pinMode(5, OUTPUT); // LED RED
pinMode(6, OUTPUT); // LED BLUE
pinMode(7, OUTPUT); // LED WHITE
pinMode(8, OUTPUT); // LED WHITE
}

void loop() { //Mode1

if (digitalRead(2) == HIGH); { // When Mode button is pushed...
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);
}
void loop1() { //Mode2

if (digitalRead(2) == HIGH); // When Mode button is pushed...
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(20);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(20);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(20);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(20);

}

Still need an assistance...

I already did @UKHeliBob

if (digitalRead(2) == HIGH); { // When Mode button is pushed...

then later

if (digitalRead(2) == HIGH); // When Mode button is pushed...

How will the code know which of them to react to ?

If you want to change modes then you need to detect when the button becomes pressed rather than when it is pressed

See the StateChangeDetection example in the IDE

There are, however, other problems such as your use of delay() during which nothing, including reading of input states can happen and the fact that I suspect that you do not have a pulldown resistor in place to keep the input pin at a known state at all times

Still incorrect.

loop1() is never called.

Could you write down the right code?

I wrote it down in post #3.

Nope, I already put 10k pulldown resistor.

const int buttonPin = 2;
const int ledPin = 5;

int buttonPushCounter = 0;
int buttonState = 0;
int lastButtonState = 0;

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

void loop() {
  buttonState = digitalRead(buttonPin);

  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);
    } else {
      Serial.println("off");
    }
    delay(50);
  }
  lastButtonState = buttonState;

  if (buttonPushCounter % 2 == 0) {
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
  } else {
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
  }
}

So, this is IDE codes when I press the button all 4 LED's are on if I press again all of them off. Now, I have to adapt this to my code which are Mode 1 and Mode 2.

1 Like

Good progress!

I would suggest:

      buttonPushCounter++;
      if (buttonPushCounter >= 2) buttonPushCounter = 0;

Then later you do not need to use "%"

if (buttonPushCounter == 0) {

If you are only going to have 2 modes and the sketch will either be running one mode or the other then you only need one variable, possibly a boolean, to know which mode that the sketch is in

if (mode1 == true)
{
  //code for mode 1
}
else
{
  //code for mode 2
}

Bear in mind the possible problems caused by using blocking delay()s which will slow down response to button presses

You would be better to write the sketch as a state machine and non blocking millis() timing, but use your current method for now and see how it goes

Exactly where do I have to put these in my codes?

const int buttonPin = 2;
const int ledPin = 5;

int buttonPushCounter = 0;
int buttonState = 0;
int lastButtonState = 0;

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

void loop() {
  buttonState = digitalRead(buttonPin);

  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);
    } else {
      Serial.println("off");
    }
    delay(50);
  }
  lastButtonState = buttonState;

  if (buttonPushCounter % 2 == 0) {
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
  } else {
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
  }
}

You don't strictly need another variable as you already have buttonPushCounter but a specifically named variable will help make the code more readable

So, depending on the value of buttonPressCounter set the value of the mode1 variable, then later in loop use its value to determine which block of code runs, much as using the value of buttonPressCounter in the code that you posted

If you do not want to introduce another variable then use buttonPressCounter % 2 directly to control the code that runs at the expense of code readability

Worked partially but still someting wrong.
I need to increase the number of mods like 10 different mode.

const int buttonPin = 2;

int buttonPushCounter = 0;
int buttonState = 0;
int lastButtonState = 0;

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

void loop() {
  buttonState = digitalRead(buttonPin);

  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      buttonPushCounter++;
 if (buttonPushCounter >= 1) buttonPushCounter = 0;
    }
  }

  if (buttonPushCounter = 1) { //Mode 1
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);
  }

  if (buttonPushCounter = 2) { //Mode 2
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(10);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(10);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(10);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
delay(10);
  }
}

https://www.learncpp.com/cpp-tutorial/switch-statement-basics/

  if (buttonPushCounter = 1)   //Mode 1
  if (buttonPushCounter = 2)   //Mode 2

These lines are wrong for a start
= is used to assign a value to a variable
== is used to compare values

Ok, what I'm gonna do to fix?