Is IF or While best for this scenario

I have code for a traffic light where when a 'train' crosses it activates a switch which activates an input causing the lights to change. Should I use an IF or WHILE statement? If a WHILE statement is best, is it right/correctly implemented.

I think if I use a while statement it would be simpler to implement and makes the code shorter. If i use an IF statement it would be more complex

I want the lights to change as soon as the input is activated rather than having to put IF statements every few lines?

// Those prefixed with L are the segments for Lenin Road, those with M are for Mao Road.

int LA = 0;
int LB = 1;
int LC = 2;
int LD = 3;
int LE = 4;
int LF = 5;
int LG = 6;
int MA = 7;
int MB = 8;
int MC = 9;
int MD = 10;
int ME = 11;
int MF = 12;
int MG = 13;
int RR_Det = A0; // This input is high when the train crosses, and causes the crosswalks to shutdown

void setup() {
  pinMode(LA, OUTPUT);
  pinMode(LB, OUTPUT);
  pinMode(LG, OUTPUT);
  pinMode(LD, OUTPUT);
  pinMode(LE, OUTPUT);
  pinMode(LF, OUTPUT);
  pinMode(LG, OUTPUT);
  pinMode(MA, OUTPUT);
  pinMode(MF, OUTPUT);
  pinMode(MC, OUTPUT);
  pinMode(MD, OUTPUT);
  pinMode(ME, OUTPUT);
  pinMode(MF, OUTPUT);
  pinMode(MG, OUTPUT);
  pinMode(RR_Det, INPUT);

}

// The rest of our coding controls what lights turn on for each number counting down from 9 and also the delay inbetween each number

void loop() {
  // Display DON'T CROSS on mao road and Lenin road, but change the signals on Lenin road first
  traindetect();
  digitalWrite(MA, HIGH);
  digitalWrite(MF, HIGH);
  digitalWrite(MC, HIGH);
  digitalWrite(MD, HIGH);
  digitalWrite(ME, HIGH);
  digitalWrite(MF, HIGH);
  digitalWrite(MG, LOW);

  
  digitalWrite(LA, HIGH);
  digitalWrite(LB, HIGH);
  digitalWrite(LC, HIGH);
  digitalWrite(LD, HIGH);
  digitalWrite(LE, HIGH);
  digitalWrite(LF, HIGH);
  digitalWrite(LG, LOW);
  
delay(9000);
  
  digitalWrite(LA, HIGH);
  digitalWrite(LB, LOW);
  digitalWrite(LC, LOW);
  digitalWrite(LD, LOW);
  digitalWrite(LD, HIGH);
  digitalWrite(LE, HIGH);
  digitalWrite(LF, HIGH);
  digitalWrite(LG, LOW);
  
  // The below code will detect a train while the walk signal is lit for 15s
 delay(15000);

  // Count 9
  digitalWrite(LA, HIGH);
  digitalWrite(LB, HIGH);
  digitalWrite(LC, HIGH);
  digitalWrite(LD, LOW);
  digitalWrite(LE, LOW);
  digitalWrite(LF, HIGH);
  digitalWrite(LG, HIGH);
  
  // Count 8
  digitalWrite(LD, HIGH);
  
  // Count 7
  digitalWrite(LD, LOW);
  digitalWrite(LE, LOW);
  digitalWrite(LF, LOW);
  digitalWrite(LG, LOW);
  
  // Count 6
  digitalWrite(LA, HIGH);
  digitalWrite(LB, LOW);
  digitalWrite(LC, HIGH);
  digitalWrite(LD, HIGH);
  digitalWrite(LE, HIGH);
  digitalWrite(LF, HIGH);
  digitalWrite(LG, HIGH);
  
  // Count 5
  delay(1000);
  digitalWrite(LE, LOW);
  
  // Count 4
  delay(1000);
  digitalWrite(LA, LOW);
  digitalWrite(LB, HIGH);
  digitalWrite(LC, HIGH);
  digitalWrite(LD, LOW);
  digitalWrite(LE, LOW);
  digitalWrite(LF, HIGH);
  digitalWrite(LG, HIGH);
  
  // Count 3
  delay(1000);
  

  // Count 2  BCFGAD NEEDS: ABGED, ABDEG
  delay(1000);
  digitalWrite(LA, HIGH);
  digitalWrite(LB, HIGH);
  digitalWrite(LC, HIGH);
  digitalWrite(LE, HIGH);
  digitalWrite(LD, HIGH);
  digitalWrite(LG, LOW);
  digitalWrite(LF, LOW);
  digitalWrite(LG, LOW);
  
  // Count 1
  delay(1000);
  digitalWrite(LA, LOW);
  digitalWrite(LD, LOW);
  digitalWrite(LE, LOW);
  digitalWrite(LF, LOW);
  digitalWrite(LG, LOW);
  digitalWrite(LB, HIGH);
  digitalWrite(LG, HIGH);
  
  // Don't cross (Lenin Road)
  delay(1000);
  digitalWrite(LB, LOW);
  digitalWrite(LG, LOW);

  // REPEAT THE ABOVE BUT ON MAO ROAD INSTEAD REPEAT OF ABOVE BUT ON MAO ROAD INSTEAD
  // Code for Mao Road
  
  // Display DON'T CROSS on mao road and Lenin road, but change the signals on Lenin road first
  digitalWrite(MA, HIGH);
  digitalWrite(MF, HIGH);
  digitalWrite(MC, HIGH);
  digitalWrite(MD, HIGH);
  digitalWrite(ME, HIGH);
  digitalWrite(MF, HIGH);
  digitalWrite(MG, LOW);
  

  digitalWrite(MA, HIGH);
  digitalWrite(MF, HIGH);
  digitalWrite(MC, HIGH);
  digitalWrite(MD, HIGH);
  digitalWrite(ME, HIGH);
  digitalWrite(MF, HIGH);
  digitalWrite(MG, LOW);
  // Below is a 9s delay before the advance green while detecting a train every 1/2's 

  delay(9000);

  digitalWrite(MA, HIGH);
  digitalWrite(MB, LOW);
  digitalWrite(MC, LOW);
  digitalWrite(MD, LOW);
  digitalWrite(MD, HIGH);
  digitalWrite(ME, HIGH);
  digitalWrite(MF, HIGH);
  digitalWrite(MG, LOW);
  
  delay(15000);  // Wait for the pedestrian signal to change before starting the final countdown
  
  // Count 9
  digitalWrite(MA, HIGH);
  digitalWrite(MF, HIGH);
  digitalWrite(MC, HIGH);
  digitalWrite(MD, LOW);
  digitalWrite(ME, LOW);
  digitalWrite(MF, HIGH);
  digitalWrite(MG, HIGH);
  
  // Count 8
  digitalWrite(MD, HIGH);
  digitalWrite(ME, HIGH);
  
  // Count 7
  digitalWrite(MD, LOW);
  digitalWrite(ME, LOW);
  digitalWrite(MF, LOW);
  digitalWrite(MG, LOW);
  
  // Count 6
  digitalWrite(MA, HIGH);
  digitalWrite(MF, LOW);
  digitalWrite(MC, HIGH);
  digitalWrite(MD, HIGH);
  digitalWrite(ME, HIGH);
  digitalWrite(MF, HIGH);
  digitalWrite(MG, HIGH);
  
  // Count 5
  delay(1000);
  digitalWrite(ME, LOW);
  
  // Count 4
  delay(1000);
  digitalWrite(MA, LOW);
  digitalWrite(MF, HIGH);
  digitalWrite(MC, HIGH);
  digitalWrite(MD, LOW);
  digitalWrite(ME, LOW);
  digitalWrite(MF, HIGH);
  digitalWrite(MG, HIGH);
  
  // Count 3
  delay(1000);

  
  // Count 2  BCFGAD NEEDS: ABGED, ABDEG
  delay(1000);
  digitalWrite(MA, HIGH);
  digitalWrite(MF, HIGH);
  digitalWrite(MG, HIGH);
  digitalWrite(ME, HIGH);
  digitalWrite(MD, HIGH);
  digitalWrite(MC, LOW);
  digitalWrite(MF, LOW);
  digitalWrite(MG, LOW);
  
  // Count 1
  delay(1000);
  digitalWrite(MA, LOW);
  digitalWrite(MD, LOW);
  digitalWrite(ME, LOW);
  digitalWrite(MF, LOW);
  digitalWrite(MG, LOW);
  digitalWrite(MF, HIGH);
  digitalWrite(MC, HIGH);
  
  // Don't cross (Mao Road)
  delay(1000);
  digitalWrite(MF, LOW);
  digitalWrite(MC, LOW);
  



}

void traindetect() {
  // If train is crossing then this will disable the ped X-Ing
   while (RR_Det, HIGH);
  digitalWrite(LA, HIGH);
  digitalWrite(LB, HIGH);
  digitalWrite(LC, HIGH);
  digitalWrite(LD, HIGH);
  digitalWrite(LE, HIGH);
  digitalWrite(LF, HIGH);
  digitalWrite(LG, LOW);

  digitalWrite(MA, HIGH);
  digitalWrite(MF, HIGH);
  digitalWrite(MC, HIGH);
  digitalWrite(MD, HIGH);
  digitalWrite(ME, HIGH);
  digitalWrite(MF, HIGH);
  digitalWrite(MG, LOW);
  // If train is crossing then this will disable the ped X-Ing
}

The basic purpose of a 'while()' loop is to perform a defined operation (or set of operations) over and over again as long as a certain condition (that you define) is true. Once that condition becomes false, the repeated performance of that set of operations is halted and program control passes to the statements below the loop.

The basic purpose of an 'if' statement is to make an immediate, one-time decision based on a certain condition (that you define). If the condition is true, an operation (or set of operations) is performed, once. If the condition is false, a different operation (or set of operations) is performed, once (if there is an 'else' clause).

Which of these programming constructs best suits your needs in this case?

I'd think that WHILE is best. But should I put the WHILE statement at the top of the code and not have to put it anywhere else?

  while (RR_Det, HIGH);Whether you use while or if it is important that you use them correctly, unlike the line above.

That is not the correct way to test the state of an input. I suspect that you meant to use digitalRead(RR_DET); to get the state. Even when you fix that the while is wrong because the only code that will be executed while the test is true is the semicolon at the end of the line. The other code will be executed unconditionally. Put the block of conditional code into curly brackets and get rid of the semicolon.

Another factor in the choice between WHILE and IF is the length of time it would take for the WHILE to complete.

If you want your program to be responsive it is not a good idea to use WHILE if it would take more than a millisec or so to complete. My general prefernce is to use IF and allow loop() to to the repetition. These two are effectively the same EXCEPT that, in the first case the something else is only done after the WHILE completes whereas in the second case it happens simultaneously with the something

The something else could, for example, be a check to see if something has activated another switch which should override the first switch.

void loop() {
   while (digitalRead(testPin) == HIGH) {
      // do something
   }
   // do something else
}
void loop() {
   if (digitalRead(testPin) == HIGH) {
     // do something
   }
   // do something else
}

...R