// Control box sketch for ARROWSTIK traffic control light bar, written by Bradley S. Worthington-White // DEFINING CONSTANTS // The relays in use are normally closed, R_ON & R_OFF below make writting the sketch a little easier, reverse R_ON and R_OFF for normally open relays const int R_ON = LOW; //Relay ON const int R_OFF = HIGH; //Relay OFF // defining pin numbers for the lights in the light bar const int LArrow = 2; //Left Arrow (one light) const int LTwo = 3; //Left two outer lights const int Center = 4; //Center two lights const int RTwo = 5; //Right two outer lights const int RArrow = 6; //Right Arrow (one light) // DEFINING VARIABLES //the waittime(s) below are changed within the individual sections of the sketch as appropriate int waittime; // waittime int waittime2; //second waittime int waittime3; //and a third waittime void setup() { // ensure all lights are off at startup or reset digitalWrite(RArrow, R_OFF); digitalWrite(RTwo, R_OFF); digitalWrite(Center, R_OFF); digitalWrite(LTwo, R_OFF); digitalWrite(LArrow, R_OFF); // set digital pin modes for switching the relays pinMode(RArrow, OUTPUT); pinMode(RTwo, OUTPUT); pinMode(Center, OUTPUT); pinMode(LTwo, OUTPUT); pinMode(LArrow, OUTPUT); // set analog pin modes for input from the 5 position rotary switch pinMode(A1, INPUT); pinMode (A2, INPUT); pinMode (A3, INPUT); pinMode (A4, INPUT); pinMode (A5, INPUT); } void loop() { // ensure the value of all analog pins is zero (0) at startup or reset analogWrite(A1,0); analogWrite(A2,0); analogWrite(A3,0); analogWrite(A4,0); analogWrite(A5,0); Switch: // reads the switch position and goes to the labeled section in sketch that applies if (analogRead(A1)>200) goto CA1; else if (analogRead(A2)>200) goto LA1; else if (analogRead(A3)>200) goto RA1; else if (analogRead(A4)>200) goto AL1; else if (analogRead(A5)>200) goto KR1; KR1: //Knight Rider // defining waittime(s) for this sequence waittime = 75; waittime2 = 25; digitalWrite(LArrow,R_ON); delay(waittime); digitalWrite(LTwo,R_ON); delay(waittime2); digitalWrite(LArrow,R_OFF); delay(waittime); digitalWrite(Center,R_ON); delay(waittime2); digitalWrite(LTwo,R_OFF); delay(waittime); digitalWrite(RTwo,R_ON); delay(waittime2); digitalWrite(Center,R_OFF); delay(waittime); digitalWrite(RArrow,R_ON); delay(waittime2); digitalWrite(RTwo,R_OFF); delay(waittime); digitalWrite(RTwo,R_ON); delay(waittime2); digitalWrite(RArrow,R_OFF); delay(waittime); digitalWrite(Center,R_ON); delay(waittime2); digitalWrite(RTwo,R_OFF); delay(waittime); digitalWrite(LTwo,R_ON); delay(waittime2); digitalWrite(Center,R_OFF); delay(waittime); digitalWrite(LArrow,R_ON); delay(waittime2); digitalWrite(LTwo,R_OFF); delay(waittime); digitalWrite(LArrow,R_OFF); goto Switch; // each section always returns to switch to check if the switch position has changed LA1: //LEFT direction sequence waittime = (125); // defining waittime(s) for this sequence waittime2 = (200); waittime3 = (50); digitalWrite(RTwo, R_ON); // begins by turning lights on in sequence from left to right delay(waittime); digitalWrite(Center, R_ON); delay(waittime); digitalWrite(LTwo, R_ON); delay(waittime); digitalWrite(LArrow, R_ON); delay(waittime); digitalWrite(LArrow, R_OFF); // Left Arrow flashes after all lights on delay(waittime2); digitalWrite(LArrow, R_ON); delay(waittime2); digitalWrite(LArrow, R_OFF); delay(waittime2); digitalWrite(LArrow, R_ON); delay(waittime2); digitalWrite(LArrow, R_OFF); // turning lights off, from right to left - quickly digitalWrite(RTwo, R_OFF); delay(waittime3); digitalWrite(Center, R_OFF); delay(waittime3); digitalWrite(LTwo, R_OFF); delay(waittime3); goto Switch; //recheck switch position RA1: // RIGHT direction sequence waittime = (125); // defining waittime(s) for this sequence waittime2 = (200); waittime3 = (50); // begins by turning lights on in sequence from left to right digitalWrite(LTwo, R_ON); delay(waittime); digitalWrite(Center, R_ON); delay(waittime); digitalWrite(RTwo, R_ON); delay(waittime); digitalWrite(RArrow, R_ON); delay(waittime); // Right Arrow flashes after all lights on digitalWrite(RArrow, R_OFF); delay(waittime2); digitalWrite(RArrow, R_ON); delay(waittime2); digitalWrite(RArrow, R_OFF); delay(waittime2); digitalWrite(RArrow, R_ON); delay(waittime2); digitalWrite(RArrow, R_OFF); // turning lights off, from left to right - quickly digitalWrite(LTwo, R_OFF); delay(waittime3); digitalWrite(Center, R_OFF); delay(waittime3); digitalWrite(RTwo, R_OFF); delay(waittime3); goto Switch; //recheck switch position AL1: // Flashing sequence with Center light on steady and LTwo and RTwo flashing on both sides of Center waittime = (125); // defining waittime(s) for this sequence waittime2 = (50); if (Center == LOW) goto cont; // avoids playing with the center light after it's on digitalWrite(Center,R_ON); cont: digitalWrite(LTwo, R_ON); delay(waittime); digitalWrite(LTwo, R_OFF); delay(waittime2); digitalWrite(LTwo,R_ON); delay(waittime); digitalWrite(LTwo,R_OFF); delay(waittime2); digitalWrite(RTwo, R_ON); delay(waittime); digitalWrite(RTwo, R_OFF); delay(waittime2); digitalWrite(RTwo, R_ON); delay(waittime); digitalWrite(RTwo, R_OFF); delay(waittime2); goto Switch; // recheck switch position CA1: // Lights on steady (no flashing), the arrow lights on each end stay off waittime = (10); // defining waittime(s) for this sequence, just a short delay for stability digitalWrite(Center, R_ON); delay(waittime); digitalWrite(LTwo, R_ON); delay(waittime); digitalWrite(RTwo, R_ON); delay(waittime); delay(1000); // waits for a second before checking the switch position again goto Switch; // checking switch position, but you knew that by know } // The End