Skip to content

Instantly share code, notes, and snippets.

@eldonwilliams
Created March 3, 2026 17:52
Show Gist options
  • Select an option

  • Save eldonwilliams/f352a9e760d81a0a5ccfaf2df9c76dea to your computer and use it in GitHub Desktop.

Select an option

Save eldonwilliams/f352a9e760d81a0a5ccfaf2df9c76dea to your computer and use it in GitHub Desktop.
Arduino Traffic Light Crossing Controller
#include <LiquidCrystal_I2C.h>
#include <math.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const float warningTime = 1000;
const float crossingTime = 5000;
float requestedCrossingTime = 0;
enum LIGHT {
RED = 4,
YELLOW = 8,
GREEN = 12,
};
void DISP_LIGHT(int light) {
digitalWrite(RED, LOW);
digitalWrite(YELLOW, LOW);
digitalWrite(GREEN, LOW);
digitalWrite(light, HIGH);
}
float lastUpdTime = 0;
const float updLimit = 1000/3;
int DISP_FPLIM() {
if (millis() - lastUpdTime <= updLimit) {
return 0;
}
lastUpdTime = millis();
return 1;
}
void DISP_DNC() {
if (!DISP_FPLIM()) return;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Do not cross");
}
void DISP_CROSS(int timeLeft) {
if (!DISP_FPLIM()) return;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Cross Now: " + String(timeLeft / 1000));
}
void setup() {
lcd.init();
lcd.backlight();
pinMode(3, INPUT);
pinMode(RED, OUTPUT); // RED
pinMode(YELLOW, OUTPUT); // YELLOW
pinMode(GREEN, OUTPUT); // GREEN
Serial.begin(9600);
}
void loop() {
int requestingCrossing = digitalRead(3);
Serial.println(requestingCrossing);
if (!requestingCrossing && requestedCrossingTime == 0) {
DISP_DNC();
DISP_LIGHT(GREEN);
}
if (requestingCrossing == 0 || requestedCrossingTime != 0) {
if (requestedCrossingTime == 0) return;
float deltaTime = millis() - requestedCrossingTime;
if (deltaTime < warningTime) {
DISP_DNC();
DISP_LIGHT(YELLOW);
} else if ((deltaTime - warningTime) < crossingTime) {
DISP_CROSS(crossingTime - (deltaTime - warningTime));
DISP_LIGHT(RED);
} else if (deltaTime >= warningTime + crossingTime) {
DISP_DNC();
DISP_LIGHT(GREEN);
requestedCrossingTime = 0;
}
}
if (requestingCrossing && requestedCrossingTime == 0) {
requestedCrossingTime = millis();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment