Created
October 17, 2025 23:58
-
-
Save noti0nS/22088f334e36f7ecbf79e4c98bdaf130 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| enum SemaphoreState { GREEN, YELLOW, RED }; | |
| enum PedestrianState { IDLE, REQUESTED, CROSSING }; | |
| // first semaphore | |
| const int LED_SM1_RED = 4; | |
| const int LED_SM1_YELLOW = 3; | |
| const int LED_SM1_GREEN = 12; | |
| // second semaphore | |
| const int LED_SM2_RED = 7; | |
| const int LED_SM2_YELLOW = 6; | |
| const int LED_SM2_GREEN = 5; | |
| bool firstSemaphoreRunning = true; | |
| SemaphoreState semaphoreState = RED; | |
| unsigned long ledTimer = 0; | |
| int ledIntervals[3] = {500, 3500, 1500}; | |
| const int PEDESTRIAN_RED_LED = 8; | |
| const int PEDESTRIAN_GREEN_LED = 4; | |
| const int PUSHBUTTON = 2; | |
| PedestrianState pedestrianState = IDLE; | |
| const int pedestrianLedInterval = 5000; | |
| unsigned long pestredianLedTimer = 0; | |
| const int blinkPedestrianLedInterval = 500; | |
| unsigned long blinkPedestrianLedTimer = 0; | |
| void setup() { | |
| Serial.begin(9600); | |
| pinMode(LED_SM1_RED, OUTPUT); | |
| pinMode(LED_SM1_YELLOW, OUTPUT); | |
| pinMode(LED_SM1_GREEN, OUTPUT); | |
| pinMode(LED_SM2_RED, OUTPUT); | |
| pinMode(LED_SM2_YELLOW, OUTPUT); | |
| pinMode(LED_SM2_GREEN, OUTPUT); | |
| pinMode(PEDESTRIAN_RED_LED, OUTPUT); | |
| pinMode(PEDESTRIAN_GREEN_LED, OUTPUT); | |
| pinMode(PUSHBUTTON, INPUT_PULLUP); | |
| digitalWrite(2, HIGH); | |
| digitalWrite(LED_SM1_GREEN, HIGH); | |
| digitalWrite(LED_SM2_RED, HIGH); | |
| digitalWrite(PEDESTRIAN_RED_LED, HIGH); | |
| } | |
| void loop1() { | |
| digitalWrite(LED_SM1_GREEN, HIGH); | |
| // digitalWrite(LED_SM1_GREEN, HIGH); | |
| } | |
| void loop() { | |
| switch (pedestrianState) { | |
| case IDLE: | |
| runCurrentSemaphore(); | |
| break; | |
| case REQUESTED: | |
| if (semaphoreState == RED) { | |
| pedestrianState = CROSSING; | |
| disableSemaphores(); | |
| digitalWrite(PEDESTRIAN_RED_LED, LOW); | |
| digitalWrite(PEDESTRIAN_GREEN_LED, HIGH); | |
| pestredianLedTimer = millis(); | |
| } else { | |
| blinkPedestrianLed(); | |
| runCurrentSemaphore(); | |
| } | |
| break; | |
| case CROSSING: | |
| if (millis() - pestredianLedTimer >= pedestrianLedInterval) { | |
| pedestrianState = IDLE; | |
| digitalWrite(PEDESTRIAN_RED_LED, HIGH); | |
| digitalWrite(PEDESTRIAN_GREEN_LED, LOW); | |
| } | |
| break; | |
| } | |
| if (buttonPressed()) { | |
| pedestrianState = REQUESTED; | |
| } | |
| } | |
| void runCurrentSemaphore() { | |
| int pinGreen = firstSemaphoreRunning ? LED_SM1_GREEN : LED_SM2_GREEN; | |
| int pinYellow = firstSemaphoreRunning ? LED_SM1_YELLOW : LED_SM2_YELLOW; | |
| int pinRed = firstSemaphoreRunning ? LED_SM1_RED : LED_SM2_RED; | |
| unsigned long now = millis(); | |
| unsigned long diff = now - ledTimer; | |
| if (diff >= ledIntervals[0] && semaphoreState == RED) { | |
| ledTimer = now; | |
| semaphoreState = GREEN; | |
| digitalWrite(pinRed, LOW); | |
| digitalWrite(pinGreen, HIGH); | |
| int x = firstSemaphoreRunning ? 1 : 2; | |
| Serial.print("ENABLE PIN GREEN FOR "); | |
| Serial.println(x); | |
| } else if (diff >= ledIntervals[1] && semaphoreState == GREEN) { | |
| ledTimer = now; | |
| semaphoreState = YELLOW; | |
| digitalWrite(pinGreen, LOW); | |
| digitalWrite(pinYellow, HIGH); | |
| int x = firstSemaphoreRunning ? 1 : 2; | |
| Serial.print("ENABLE PIN YELLOW FOR "); | |
| Serial.println(x); | |
| } else if (diff >= ledIntervals[2] && semaphoreState == YELLOW) { | |
| ledTimer = now; | |
| semaphoreState = RED; | |
| digitalWrite(pinYellow, LOW); | |
| digitalWrite(pinRed, HIGH); | |
| int x = firstSemaphoreRunning ? 1 : 2; | |
| Serial.print("ENABLE PIN RED FOR "); | |
| Serial.println(x); | |
| firstSemaphoreRunning = !firstSemaphoreRunning; | |
| } | |
| } | |
| void disableSemaphores() { | |
| digitalWrite(LED_SM1_RED, HIGH); | |
| digitalWrite(LED_SM1_YELLOW, LOW); | |
| digitalWrite(LED_SM1_GREEN, LOW); | |
| digitalWrite(LED_SM2_RED, HIGH); | |
| digitalWrite(LED_SM2_YELLOW, LOW); | |
| digitalWrite(LED_SM2_GREEN, LOW); | |
| } | |
| void blinkPedestrianLed() { | |
| int walkLedState = digitalRead(PEDESTRIAN_RED_LED); | |
| unsigned long now = millis(); | |
| if (now - pestredianLedTimer >= blinkPedestrianLedInterval) { | |
| pestredianLedTimer = now; | |
| int state = (digitalRead(PEDESTRIAN_RED_LED) == LOW) ? HIGH : LOW; | |
| digitalWrite(PEDESTRIAN_RED_LED, state); | |
| } | |
| } | |
| bool buttonPressed() { | |
| return pedestrianState == IDLE && digitalRead(PUSHBUTTON) == LOW && semaphoreState != RED; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment