Looping until a button is pressed

TheTonyy:
but i want them to loop until i press one of the two buttons again which would stop the current loop and start either the same or the other program loop.

I think the very few changes I have made in this version will do what you want.

#include <IRremote.h>

const int red = 10; // red led pin 10
const int yellow = 9; // yellow led pin 9
const int green = 8; // green led pin 8
const int receiver = 6; // Infrared receiver output pin( TSOP4838 )

boolean yellowFlashRun = false;  // NEW
boolean changeLightsRun = false;  // NEW

int IRstate;
int lastIRstate;

IRrecv irrecv(receiver);
decode_results results;

void setup() {
    Serial.begin(9600);
    Serial.println("Traffic Lights - Initializing...");
    irrecv.enableIRIn();
    pinMode(red, OUTPUT);
    pinMode(yellow, OUTPUT);
    pinMode(green, OUTPUT);
    pinMode(IRstate, INPUT);

    digitalWrite(red, HIGH);
    delay(1000);
    digitalWrite(red, LOW);
    digitalWrite(yellow, HIGH);
    delay(1000);
    digitalWrite(yellow, LOW);
    digitalWrite(green, HIGH);
    delay(1000);
    digitalWrite(green, LOW);
    delay(1000);
    Serial.println("Traffic Lights - Initialized!");
    Serial.println("Waiting for remote input...");
}

void loop() {
 
    IRstate = digitalRead(receiver);

    if (IRstate != lastIRstate) {
    
        if (irrecv.decode(&results)) {
             switch(results.value) {

                case 0x77E14033: // MENU
                    Serial.println("MENU button pressed");
                    yellowFlashRun = true; // NEW
                    changeLightsRun = false; // NEW
                break;
                
                case 0x77E12033: // PLAY/PAUSE
                    Serial.println("PLAY/PAUSE button pressed");
                    yellowFlashRun = false;  // NEW
                    changeLightsRun = true;  // NEW
                break; 
            }
            delay(10);
            irrecv.resume();
        }
    }
    lastIRstate = IRstate;
    changeLights();  // NEW
    yellowFlash();  // NEW
}
void changeLights() { // I want this to loop until i press a button on the remote

    if (changeLightsRun == true) { // new
        digitalWrite(green, LOW);
        digitalWrite(yellow, HIGH);
        delay(3000);

        digitalWrite(yellow, LOW);
        digitalWrite(red, HIGH);
        delay(5000);

        digitalWrite(yellow, HIGH);
        delay(2000);

        digitalWrite(yellow, LOW);
        digitalWrite(red, LOW);
        digitalWrite(green, HIGH);
        delay(5000);
    }
}
void yellowFlash() { // I want this to loop until i press a button on the remote
    
    if (yelloFlashRun == true) { // new
        digitalWrite(green, LOW);
        digitalWrite(red, LOW);
        digitalWrite(yellow, HIGH);
        delay(1000);
        digitalWrite(yellow, LOW);
        delay(1000);
        digitalWrite(yellow, HIGH);
        delay(1000);
        digitalWrite(yellow, LOW);   
    }
}

I think I have marked all the changes I made

Note how I have made the IR buttons set the value of variables rather than call the function directly. In effect the variable remember the button press.

...R