How to run two different sequence via two different inputs

Hi there,
I am trying to figure out how to run two different sequences, depending on the input triggered. really struggling to get my head around all this coding, if i can get this working that be great. The input is triggered via a remote that then starts a race start light sequence. The remote has two buttons so i was trying to figure out how to have two different light sequence depending on which button pressed. Otherwise i just keep it as the current sequence i have
Any help appreciated.
Arduino board is controlling the lights via a 4 relay board.

  // put your setup code here, to run once:
int buttonState = 0;
long randNumber;

void setup() {
  randomSeed(analogRead(7));

{
   pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5,   OUTPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  }
}

void   loop() {
  buttonState = digitalRead(7);
  randNumber = random(0, 3000);

   if (buttonState == LOW) {

    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);   
  }

  else {
    delay(randNumber);
    digitalWrite(2, HIGH);
    delay(1000);
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    delay(1000);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    delay(1000);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    delay(1000);
    digitalWrite(5, LOW);
    
    delay(100);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
  }
  } **Following is what i want to add**
void   loop() {
  buttonState = digitalRead(6);
  randNumber = random(0, 1000);

   if (buttonState == HIGH) {

    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);   
  }

  else {
    delay(randNumber);
    digitalWrite(5, HIGH);
    delay(200);
    digitalWrite(5, LOW);
    digitalWrite(5, HIGH);
    delay(200);
    digitalWrite(5, LOW);
    delay(randNumber);
    digitalWrite(2, HIGH);
    delay(1000);
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    delay(1000);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    delay(1000);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    delay(1000);
    digitalWrite(5, LOW);
    
    delay(100);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
  }
  }

Add small delay to avoid debouncing problem.

// put your setup code here, to run once:
int buttonState6 = 0;
int buttonState7 = 0;
long randNumber;

void setup() {
  randomSeed(analogRead(0));  // Changed to use analog pin 0 for randomness

  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
}

void loop() {
  buttonState6 = digitalRead(6);
  buttonState7 = digitalRead(7);

  if (buttonState6 == HIGH) {
    // Sequence for button on pin 6
    randNumber = random(0, 1000);
    delay(randNumber);

    digitalWrite(5, HIGH);
    delay(200);
    digitalWrite(5, LOW);
    delay(200);
    digitalWrite(5, HIGH);
    delay(200);
    digitalWrite(5, LOW);

    delay(randNumber);

    digitalWrite(2, HIGH);
    delay(1000);
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    delay(1000);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    delay(1000);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    delay(1000);
    digitalWrite(5, LOW);
  } 
  else if (buttonState7 == HIGH) {
    // Sequence for button on pin 7
    randNumber = random(0, 3000);
    delay(randNumber);

    digitalWrite(2, HIGH);
    delay(1000);
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    delay(1000);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    delay(1000);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    delay(1000);
    digitalWrite(5, LOW);
  } 
  else {
    // No button pressed, turn off all lights
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
  }

  // Add a short delay to debounce button presses
  delay(50);
}

I am not a programmer but I would structure it so the that each light sequence was its own function. Then read the buttons and do If this then do function 1 else if do function 2. When the loop falls through it will scan the buttons again. Hope this helps.

This would also lend itself to using (non blocking) millis timing, but the whole structure needs a V2.0 once you get it working.

1 Like

Hello zephyr81

Welcome to worldbest Arduino Forum ever :smiley:

I have done a small review of the code and have the following comments:

  • The I/O pins should have a descriptive name.
  • Which Arduino is being used?
  • What is the task of the programme in practice?
  • What real-time behaviour is expected?

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

look this over

const byte PinLeds [] = { 2, 3, 4, 5 };
const byte PinButs [] = { 6, 7 };
enum { Off = LOW, On = HIGH };

const int  Nled = sizeof (PinLeds);
const int  Nbut = sizeof (PinButs);

byte  butState [Nbut];

// -----------------------------------------------------------------------------
void ledsOff ()
{
    for (unsigned n = 0; n < Nled; n++)
        digitalWrite (PinLeds [n], Off);
}

// -----------------------------------------------------------------------------
void ledSeq (
    unsigned long msec)
{
    delay (random (0, 3000));

    for (unsigned n = 0; n < Nled; n++)  {
        digitalWrite (PinLeds [n], On);
        delay (msec);
        digitalWrite (PinLeds [n], Off);
    }
}

// -----------------------------------------------------------------------------
void  loop ()
{
    for (unsigned n = 0; n < Nbut; n++)  {
        byte but = digitalRead (PinButs [n]);
        if (butState [n] != but)  {
            butState [n] = but;
            if (LOW == but) {
                if (1 == n)
                    ledSeq (200);
                else
                    ledSeq (1000);
            }
        }
    }
}

// -----------------------------------------------------------------------------
void setup ()
{
    Serial.begin (9600);

    for (unsigned n = 0; n < Nbut; n++)  {
        pinMode (PinButs [n], INPUT_PULLUP);
        butState [n] = digitalRead (PinButs [n]);
    }

    for (unsigned n = 0; n < Nled; n++)  {
        pinMode (PinLeds [n], OUTPUT);
        digitalWrite (PinLeds [n], Off);
    }

    randomSeed (analogRead (7));
}

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