testing inputs while outputing

Hey! Thanks in advance for all help and suggestions. Every idea is valuable. So, basically what I want be able to do is switch the mode (counter) while blinky() is running. I want to stop the blinky() and run case:2 by pushing select. This is just example code from a huge project I'm working on where blinky() would be really big. Do I need to use interrupts? And how would I do that. Thanks again for all the support, you guys are great!

int mode = 8;  //Mode selection button
int select = 7; //Select button
int counter = 0; //Counter # for modes
int LED1 = 9;
int LED2 = 10;
int LED3 = 11;
int LED4 = 12;

void setup() 
{

  pinMode(mode, INPUT_PULLUP);
  pinMode(select, INPUT_PULLUP);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);

}

/////////////////////////////////////////////////////////////////////////////////////
void loop() 
{
  int selectVal = digitalRead(select);
  int switchVal = digitalRead(mode);
  if(switchVal == LOW)
  {
    
    delay(500);
    counter ++;
    
   if(counter == 3)
    {
      counter = 1;
    }
  }
///////////////////////////////////////////  
  switch(counter)
  {
   case 1:   
      digitalWrite(LED4, LOW);
      digitalWrite(LED3, HIGH);
      if(selectVal == LOW)
      {
        blinky();  
      }
    break;
    
    
  case 2:   
    digitalWrite(LED3, LOW);
    digitalWrite(LED4, HIGH);
    
    break;


  }
}

////////////////////////////////////////////////////////////////////////////////////////////
// METHODS // METHODS // METHODS // METHODS // METHODS // METHODS // METHODS // METHODS ////
////////////////////////////////////////////////////////////////////////////////////////////

void blinky()
{
 digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
   digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
     digitalWrite(LED1, HIGH);
 delay(200);
 digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(200);
  digitalWrite(LED2, LOW);
}

read forum.arduino.cc/index.php?topic=223286.0

Mark

Do I need to use interrupts?

No, you probably don't.
Much better would be better to get rid of the calls to delay()

Look at the blink without delay example in the IDE.

I looked into using blink without delay, but I still would need multiple If statements to switch the counter (I assume). The bigger project that I am building is a synchronized x-mas lights to music. Each of the 4 cases will be a song, and each song is about 1500 lines. Is there a way to keep the delay and still switch the counter or is there no choice? I already have all the songs using delay. Thanks again!

What do you think an interrupt is?
How do you think it will help you?

My original idea was to have the select button as an interrupt and trigger to run a ISR to exit the loop and switch the counter. I wasn't able to find any examples of people doing this, or even if I'm understanding it appropriately. Please correct me if I'm wrong. I'm here to learn.

You're sitting reading a book.
The phone rings, so you go to answer it.
You put the phone down and go back to baking your cake.

Does that sound like an interrupt?

I wasn't able to find any examples of people doing this,

Not surprising.

or even if I'm understanding it appropriately

You are not.

An interrupt service routine can only interact with code in the main program by changing the value of variables used in both. The ISR can not control or divert the flow of another piece of code.

In programming terms, no. It would be a simple test for the ring. Could I then place the test outside of the blinky() in this example?

Yes, but the latency because of all the calls to delay() would be horrific.

So basically with delay() I would have to wait for the method blinky() to finish before I could switch the mode. However if I use blink without delay, I could very easily interrupt it?

Yes and the thread you where pointed at shows how to doit! So READ IT!

Mark

Mark,
Thanks for the link. It does cover how to do that properly and it is what I will have to follow. I was more just curious if there was a way around it still using delay. I now understand that it cant be simply done. Thanks for your help!
Jake

It's not that it can't be done, it's just that it's a lot easier to do it properlyappropriately.

The function blinky() below does exactly what you want without delay() other than adding other pins.. you could add a counter and loop through until the song is over..

unsigned long dtime = 200;
int LED1 = 13;
unsigned long starttime = millis();
boolean offon =true;

  void setup() 
{
  pinMode(LED1, OUTPUT);
}
void loop(){
  
  Blinky();
  
}
void Blinky(){
  
  if (millis() - starttime >= dtime){
    if(offon){
      digitalWrite(LED1, LOW);
      offon = false;
    }else{
      
       digitalWrite(LED1, HIGH);
       offon = true;
    }
    starttime = starttime + dtime;
  }
}

I was just looking for a way to still use delay, because I have three songs done. Each song is about 33,000 bytes big and around 3000 lines and they all use delay. Next time I will use blink without delay. But for now I will just have to make do. Thanks
Jake

Thank you for the example, that is what I will have to do next time. As of now I have hundreds of different delay times. I will know next time. Thanks kycountry!

Thanks for the example kycountry! But as of now I have hundreds of different delay times. I will probably have to change them to match your example in the future though. Thank you!
Jake

Thanks to all who have helped so far! I have learned a lot.