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
}