How To Run Multiple Loop With One or Multiple Buttons?

Hi everyone. I want to do christmas light (Multiple loop-fade effect, full open etc. ) with one or multiple buttons. I searched forum, use multiple code together but didnt work. Anyone help me?

I want;

  1. When ı push button, one loop must start work, ıf ı push same button, the 1. loop stop and 2. loop must start work. if ı push same button, the 2. loop stop and 3. loop must start work.
  2. IF, ı dont push any button, current loop is permanently work.

Sry for English. Ty for help.

My code is:

int ledPin = 3;  
int ledPin2 = 5;
int ledPin3 = 6;
int ledPin4 = 9;

int p1 = 12; 
int p2 = 13; 
int p3 = 7;
int st = 8; 
int goahead = 0;
int program1 = 0;
int program2 = 0;
int program3 = 0;


void setup() {
  pinMode(ledPin, OUTPUT);   
  pinMode(ledPin2, OUTPUT);  
  pinMode(ledPin3, OUTPUT);  
  pinMode(ledPin4, OUTPUT);
  
  pinMode(st, INPUT);
  pinMode(p1, INPUT);
  pinMode(p2, INPUT);
  pinMode(p3, INPUT);
  
}

void loop() {
  
  goahead = digitalRead(st);
  
  
if (goahead == HIGH)
  delay(90);
{
  program1= digitalRead(p1);
  program2 = digitalRead(p2);
  program3 = digitalRead(p3);
  
  if (program1 == HIGH)
 {
    
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue = fadeValue+5) {
    analogWrite(ledPin, fadeValue);
    delay(30);
  }

  
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue = fadeValue-5) {
    analogWrite(ledPin, fadeValue);
    delay(30);
  }

  
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue = fadeValue+5) {
    analogWrite(ledPin2, fadeValue);
    delay(30);
  }

  
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue = fadeValue-5) {
    analogWrite(ledPin2, fadeValue);
    delay(30);
  }
  
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue = fadeValue+5) {
    analogWrite(ledPin3, fadeValue);
    delay(30);
  }

  
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue = fadeValue-5) {
    analogWrite(ledPin3, fadeValue);
    delay(30);
  }

  
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue = fadeValue+5) {
    analogWrite(ledPin4, fadeValue);
    delay(30);
  }

  
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue = fadeValue-5) {
    analogWrite(ledPin4, fadeValue);
    delay(30);
  }
}
  else if (program2 == HIGH)
{
    
  analogWrite(ledPin, 255);
  analogWrite(ledPin2, 255);
  analogWrite(ledPin3, 255);
  analogWrite(ledPin4, 255);
  delay(100);
  analogWrite(ledPin, 0);
  analogWrite(ledPin2, 0);
  analogWrite(ledPin3, 0);
    analogWrite(ledPin4, 0); }
  
  else if (program3 == HIGH)
  {
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue = fadeValue+5) {
    analogWrite(ledPin, fadeValue);
    delay(30);
  }

  
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue = fadeValue-5) {
    analogWrite(ledPin, fadeValue);
    delay(30);
  }
  
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue = fadeValue+5) {
    analogWrite(ledPin3, fadeValue);
    delay(30);
  }

  
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue = fadeValue-5) {
    analogWrite(ledPin3, fadeValue);
    delay(30);
  }
  
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue = fadeValue+5) {
    analogWrite(ledPin2, fadeValue);
    delay(30);
  }

  
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue = fadeValue-5) {
    analogWrite(ledPin2, fadeValue);
    delay(30);
  }
  
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue = fadeValue+5) {
    analogWrite(ledPin4, fadeValue);
    delay(30);
  }

  
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue = fadeValue-5) {
    analogWrite(ledPin4, fadeValue);
    delay(30);
  }
  } 
  

}
}

buttons are typically connected between the pin and ground, the pin configured as INPUT_PULLUP to use the internal pullup resistor which pulls the pin HIGH and when pressed, the button pulls the pin LOW.

a button press can be recognized by detecting a change in state and becoming LOW

    byte but = digitalRead (PinBut);
    if (butLst != but)  {
        butLst = but;
        delay (20);     //debounce
        if (LOW == but)  {
            // button press action
        }
    }

in your case, recognizing a button press should toggle a flag variable, for example, program1

don't understand the need for the st pin

This input pin is definitely not necessary.

It could only serve for decorative purposes. :nerd_face:

sry, ı am amateur on electric and arduino. Must ı add your code to my void loop? i didnt understant. ty for help.

I erased st button. Now when press buttons loops working. But ı want ; when push other buttons, first loop must stop and other must start. ıf dont push any buttons, ıt must continious working.

The way you coded your loop, once you launched a "program" (light animation) you have no way to interrupt it - for example if you choose program #1 then this gets executed

  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue = fadeValue+5) {
    analogWrite(ledPin, fadeValue);
    delay(30);
  }

  
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue = fadeValue-5) {
    analogWrite(ledPin, fadeValue);
    delay(30);
  }

  
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue = fadeValue+5) {
    analogWrite(ledPin2, fadeValue);
    delay(30);
  }

  
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue = fadeValue-5) {
    analogWrite(ledPin2, fadeValue);
    delay(30);
  }
  
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue = fadeValue+5) {
    analogWrite(ledPin3, fadeValue);
    delay(30);
  }

  
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue = fadeValue-5) {
    analogWrite(ledPin3, fadeValue);
    delay(30);
  }

  
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue = fadeValue+5) {
    analogWrite(ledPin4, fadeValue);
    delay(30);
  }

  
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue = fadeValue-5) {
    analogWrite(ledPin4, fadeValue);
    delay(30);
  }

you have 8 loops with 52 steps and a 30ms delay in each so it takes ~12.5 seconds to execute. During that time you do not check any button, so can't do something else.

You need to architect your code differently so that you don't lock the loop. State machines are a way to achieve this - also studying how millis works

For extra information and examples look at

Ty for help, ı will try.

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