Last active
September 15, 2025 00:43
-
-
Save noti0nS/2a3be491c8ab72b0ba46a457af19e910 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 = 13; | |
| const int LED_SM1_YELLOW = 12; | |
| const int LED_SM1_GREEN = 11; | |
| // 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_LED = 8; | |
| 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_LED, OUTPUT); | |
| pinMode(PUSHBUTTON, INPUT_PULLUP); | |
| digitalWrite(LED_SM1_GREEN, HIGH); | |
| digitalWrite(LED_SM2_RED, HIGH); | |
| } | |
| void loop() { | |
| switch (pedestrianState) { | |
| case IDLE: | |
| runCurrentSemaphore(); | |
| break; | |
| case REQUESTED: | |
| if (semaphoreState == RED) { | |
| pedestrianState = CROSSING; | |
| disableSemaphores(); | |
| digitalWrite(PEDESTRIAN_LED, HIGH); | |
| pestredianLedTimer = millis(); | |
| } else { | |
| runCurrentSemaphore(); | |
| blinkPedestrianLed(); | |
| } | |
| break; | |
| case CROSSING: | |
| if (millis() - pestredianLedTimer >= pedestrianLedInterval) { | |
| pedestrianState = IDLE; | |
| digitalWrite(PEDESTRIAN_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); | |
| } else if (diff >= ledIntervals[1] && semaphoreState == GREEN) { | |
| ledTimer = now; | |
| semaphoreState = YELLOW; | |
| digitalWrite(pinGreen, LOW); | |
| digitalWrite(pinYellow, HIGH); | |
| } else if (diff >= ledIntervals[2] && semaphoreState == YELLOW) { | |
| ledTimer = now; | |
| semaphoreState = RED; | |
| digitalWrite(pinYellow, LOW); | |
| digitalWrite(pinRed, HIGH); | |
| 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_LED); | |
| unsigned long now = millis(); | |
| if (now - pestredianLedTimer >= blinkPedestrianLedInterval) { | |
| pestredianLedTimer = now; | |
| int state = (digitalRead(PEDESTRIAN_LED) == LOW) ? HIGH : LOW; | |
| digitalWrite(PEDESTRIAN_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