#define RED_PIN_1 12
#define GREEN_PIN_1 11
#define YELLOW_PIN_1 10
#define RED_PIN_2 7
#define GREEN_PIN_2 6
#define YELLOW_PIN_2 5
#define BUTTON_1_PIN 9
#define BUTTON_2_PIN 8
#define GREEN_DELAY 4000
#define YELLOW_DELAY 1000
// Setting up the parameters for the state of each switch
int buttonState1 = 0;
int buttonState2 = 0;
int button1PressTime = 0; // Time that switch 1 was pressed
int button2PressTime = 0; // TIme that switch 2 was pressed
// Booleans to check if button has been pressed
bool button1Pressed = false;
bool button2Pressed = false;
void setup() {
// Setting up output pins for Traffic light 1
pinMode(RED_PIN_1, OUTPUT);
pinMode(GREEN_PIN_1, OUTPUT);
pinMode(YELLOW_PIN_1, OUTPUT);
// Setting up output pins for Traffic light 2
pinMode(RED_PIN_2, OUTPUT);
pinMode(GREEN_PIN_2, OUTPUT);
pinMode(YELLOW_PIN_2, OUTPUT);
// Seeting up the buttons for pedestrians
pinMode(BUTTON_1_PIN, INPUT);
pinMode(BUTTON_2_PIN, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
buttonState1 = digitalRead(BUTTON_1_PIN);
buttonState2 = digitalRead(BUTTON_2_PIN);
// Checking if the switch 1 has been pressed to change traffic light
if (buttonState1 == HIGH && !button1Pressed) {
changeLights(RED_PIN_1, RED_PIN_2, YELLOW_PIN_1, YELLOW_PIN_2, GREEN_PIN_1, GREEN_PIN_2);
button1Pressed = true;
}
else if (buttonState1 == LOW) {
button1Pressed = false;
}
if (buttonState2 == HIGH && !button2Pressed) {
changeLights(RED_PIN_2, RED_PIN_1, YELLOW_PIN_2, YELLOW_PIN_1, GREEN_PIN_2, GREEN_PIN_1);
button2Pressed = true;
}
else if (buttonState2 == LOW) {
button2Pressed = false;
}
// First interval
digitalWrite(RED_PIN_1, HIGH); // Turn on first red light
digitalWrite(GREEN_PIN_2, HIGH); // Turn on second green light
digitalWrite(RED_PIN_2, LOW); // Turn off second red light
digitalWrite(GREEN_PIN_1, LOW); // Turn off first green light
digitalWrite(YELLOW_PIN_1, LOW); // Turn off first yellow light
digitalWrite(YELLOW_PIN_2, LOW); // Turn off second yellow light
nonBlockDelay(GREEN_DELAY); // Wait for the next round
// Second interval
digitalWrite(YELLOW_PIN_2, HIGH); // Turn on second yellow light
digitalWrite(RED_PIN_1, HIGH); // Turn on first red light
digitalWrite(GREEN_PIN_1, LOW); // Turn off second green light
digitalWrite(GREEN_PIN_2, LOW); // Turn off second green light
digitalWrite(YELLOW_PIN_1, LOW); // Turn off first yellow light
digitalWrite(RED_PIN_2, LOW); // Turn off second yellow light
nonBlockDelay(YELLOW_DELAY); // Wait for the next round
// Third interval
digitalWrite(RED_PIN_2, HIGH); // Turn on second red light
digitalWrite(GREEN_PIN_1, HIGH); // Turn on first green light
digitalWrite(YELLOW_PIN_2, LOW); // Turn off second yellow light
digitalWrite(RED_PIN_1, LOW); // Turn off second red light
digitalWrite(YELLOW_PIN_1, LOW); // Turn off first yellow light
digitalWrite(GREEN_PIN_2, LOW); // Turn off second green light
nonBlockDelay(GREEN_DELAY); // Wait for the next round
// Fourth and final interval
digitalWrite(YELLOW_PIN_1, HIGH); // Turn on first yellow light
digitalWrite(RED_PIN_2, HIGH); // Turn on second red light
digitalWrite(GREEN_PIN_1, LOW); // Turn off first green light
digitalWrite(GREEN_PIN_2, LOW); // Turn off second green light
digitalWrite(YELLOW_PIN_2, LOW); // Turn off second yellow light
digitalWrite(RED_PIN_1, LOW); // Turn off first red light
nonBlockDelay(YELLOW_DELAY); // Loop back to the beginning
}
void changeLights(int RED1, int RED2, int YELLOW1, int YELLOW2, int GREEN1, int GREEN2) {
// Function for RESET each of the traffic lights upon switch press
// For the first interval
digitalWrite(YELLOW2, HIGH); // Turn on opposite yellow light
digitalWrite(RED1, HIGH); // Turn on adjacent red light
digitalWrite(YELLOW1, LOW); // Turn off adjacent yellow light
digitalWrite(RED2, LOW); // Turn off opposite red light
digitalWrite(GREEN1, LOW); // Turn off adjacent green light
digitalWrite(GREEN2, LOW); // Turn off opposite green light
delay(YELLOW_DELAY); // Set the time for opposite yellow light
// For the second interval
digitalWrite(GREEN1, HIGH); // Turn on adjacent green light
digitalWrite(RED2, HIGH); // Turn on opposite red light
digitalWrite(RED1, LOW); // Turn off adjacent red light
digitalWrite(GREEN2, LOW); // Turn off opposite green light
digitalWrite(YELLOW1, LOW); // Turn off adjacent yellow light
digitalWrite(YELLOW2, LOW); // Turn off opposite yellow light
delay(GREEN_DELAY); // Set the time for adjacent green light
// For the third interval
digitalWrite(RED2, HIGH); // Turn on opposite red light
digitalWrite(YELLOW1, HIGH); // Turn on adjacent yellow light
digitalWrite(GREEN1, LOW); // Turn off adjacent green light
digitalWrite(GREEN2, LOW); // Turn off opposite green light
digitalWrite(RED1, LOW); // Turn off adjacent red light
digitalWrite(YELLOW2, LOW); // Turn off opposite yellow light
delay(YELLOW_DELAY); // Set the time for adjacent yellow light
// For the fourth and final interval
digitalWrite(RED1, HIGH); // Turn on adjacent red light
digitalWrite(GREEN2, HIGH); // Turn on opposite green light
digitalWrite(RED2, LOW); // Turn off opposite red light
digitalWrite(GREEN1, LOW); // Turn off adjacent green light
digitalWrite(YELLOW1, LOW); // Turn off adjacent yellow light
digitalWrite(YELLOW2, LOW); // Turn off opposite yellow light
delay(2000); // Setting the final delay before reset
// Reset traffic cycle after the switch has been pressed
digitalWrite(RED1, LOW);
digitalWrite(GREEN2, LOW);
delay(2000);
}
// Credits to ChatGPT for this function
void nonBlockDelay(unsigned long interval) {
// Creating a non-modifiable beginning time
static unsigned long previousMillis = 0;
unsigned char currentMillis = millis();
if (currentMillis - previousMillis <= interval) {
previousMillis = currentMillis;
}
}