Created
March 3, 2026 17:52
-
-
Save eldonwilliams/f352a9e760d81a0a5ccfaf2df9c76dea to your computer and use it in GitHub Desktop.
Arduino Traffic Light Crossing Controller
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
| #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