// Conrolling traffic with Boolean functions, digital write/reads, if statements, and for statements. #define westButton 3 #define eastButton 13 #define westRed 2 #define westYellow 1 #define westGreen 0 #define eastRed 12 #define eastYellow 11 #define eastGreen 10 // I/Os are now defined. Now, let's define out yellow blink delay #define yellowBlinkTime 500 // 0.5 seconds // Now, lets' define the boolean function and integers boolean trafficWest = true; // This is the starting value. West is true, andEast is false int flowTime = 10000; // 10 Second delay to allow for cars to cross before the opposite lights change. int changeDelay = 2000; // Amount if time between colour changes // All done with definitions! void setup() { // We have to define our I/O lines as either inputs or outputs. pinMode(westButton, INPUT); pinMode(eastButton, INPUT); pinMode(westRed, OUTPUT); pinMode(westYellow, OUTPUT); pinMode(westGreen,OUTPUT); pinMode(eastRed, OUTPUT); pinMode(eastYellow, OUTPUT); pinMode(eastGreen, OUTPUT); // Now we have to set initial states for the lights digitalWrite(westRed, LOW); digitalWrite(westYellow, LOW); digitalWrite(westGreen, HIGH); // West Green light is on digitalWrite(eastRed, HIGH); // East Red light is on digitalWrite(eastYellow, LOW); digitalWrite(eastGreen, LOW); } void loop() { if ( digitalRead(westButton) == LOW ) // Check to see if the west button has been pressed. If so, continue to next IF statement. { if (trafficWest == false ) // Another IF statement with no else to follow. Only continue ot traffic is flowing in EAST direciton. // Remember, you can press a button, but if traffic is already headed in a certain direction, this nulls many button presses. { trafficWest = true; // Change the boolean function. Traffic will now be flowing to the west. delay(flowTime); // Allow 10 seconds for cars to cross. There may be cars already in transit. // Check east lights from green to yellow to red digitalWrite(eastGreen, LOW); digitalWrite(eastYellow, HIGH); delay(changeDelay); // 2 second delay before changing light states again digitalWrite(eastYellow, LOW); digitalWrite(eastRed, HIGH); delay(changeDelay); // Change from yellow to red, and then wait two seconds // Now we have to blink the West yellow light for ( int a = 0; a < 5; a++) { digitalWrite(westYellow, LOW); delay(yellowBlinkTime); digitalWrite(westYellow, HIGH); delay(yellowBlinkTime); } digitalWrite(westYellow, LOW); digitalWrite(westRed, LOW); digitalWrite(westGreen, HIGH); } } // Traffic is now coming from the west to the east. Hurrah... Now, we essentially have to re-write all of the code above to allow for us to change from east to west. if ( digitalRead(eastButton) == LOW ) // Check to see if the east button has been pressed. If so, continue to next IF statement. { if (trafficWest == true ) // Another IF statement with no else to follow. Continue only if traffic is headed west currently. // // Remember, you can press a button, but if traffic is already headed in a certain direction, this nulls many button presses. { trafficWest = false; // change the boolean function. Traffic going to the west is false. It is going to the EAST! delay(flowTime); // Allow 10 seconds for cars to cross. There may be cars already in transit. // Check east lights from green to yellow to red digitalWrite(westGreen, LOW); digitalWrite(westYellow, HIGH); delay(changeDelay); // 2 second delay before changing light states again digitalWrite(westYellow, LOW); digitalWrite(westRed, HIGH); delay(changeDelay); // Change from yellow to red, and then wait two seconds // Now we have to blink the east yellow light for ( int a = 0; a < 5; a++) { digitalWrite(eastYellow, LOW); delay(yellowBlinkTime); digitalWrite(eastYellow, HIGH); delay(yellowBlinkTime); } digitalWrite(eastYellow, LOW); digitalWrite(eastRed, LOW); digitalWrite(eastGreen, HIGH); // Traffic is now flowing from east to west! } } }