Skip to content

Instantly share code, notes, and snippets.

@noti0nS
Created October 17, 2025 23:58
Show Gist options
  • Select an option

  • Save noti0nS/22088f334e36f7ecbf79e4c98bdaf130 to your computer and use it in GitHub Desktop.

Select an option

Save noti0nS/22088f334e36f7ecbf79e4c98bdaf130 to your computer and use it in GitHub Desktop.
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