In Stage 2 of our Arduino Traffic Light Control System project, we add pedestrian crosswalk signs using LCD screens. These signs display 'WALK' and 'DON'T WALK' messages based on traffic light status. We also improve the timing logic so the 'DON'T WALK' message appears earlier for safety. Follow along and build your own realistic intersection!
Recommended Kits & Accessories
Most Arduino Starter Kits include everything you need for this project.
Arduino Kit: https://amzn.to/4nnUJAm
Project Book: https://amzn.to/4nnUJAm
Arduino Apparel: https://amzn.to/4nznsm6
Series Mention
📚 This project is part of a full tutorial series and upcoming book!
Subscribe and follow along.
CODE:
// North/South Lights
int nsRed = 2;
int nsYellow = 3;
int nsGreen = 4;
// East/West Lights
int ewRed = 5;
int ewYellow = 6;
int ewGreen = 7;
// NEW: LCD Screens
#include Wire.h // Wire library - *less than*Wire.h*greater than
#include Adafruit_LiquidCrystal.h // LCD library *less than*Adafruit_LiquidCrystal.h*greater than
Adafruit_LiquidCrystal lcdWest(0x20); // NEW: LCD for West direction
Adafruit_LiquidCrystal lcdEast(0x21); // NEW: LCD for East direction
Adafruit_LiquidCrystal lcdNorth(0x22); // NEW: LCD for North direction
Adafruit_LiquidCrystal lcdSouth(0x23); // NEW: LCD for South direction
// NEW: Timing variables
unsigned long previousMillis = 0; // NEW: Store last time phase changed
int phase = 0; // NEW: Current phase of traffic lights
void setup() {
pinMode(nsRed, OUTPUT);
pinMode(nsYellow, OUTPUT);
pinMode(nsGreen, OUTPUT);
pinMode(ewRed, OUTPUT);
pinMode(ewYellow, OUTPUT);
pinMode(ewGreen, OUTPUT);
// NEW: Initialize LCDs
lcdWest.begin(16, 2);
lcdEast.begin(16, 2);
lcdNorth.begin(16, 2);
lcdSouth.begin(16, 2);
lcdWest.setBacklight(1);
lcdEast.setBacklight(1);
lcdNorth.setBacklight(1);
lcdSouth.setBacklight(1);
}
// NEW: Function to update LCD messages
void updateLCDs(String nsMessage, String ewMessage) {
static String lastNS = ""; // NEW: Store last NS message
static String lastEW = ""; // NEW: Store last EW message
if (nsMessage != lastNS) {
lcdNorth.clear(); // NEW: Clear North LCD
lcdSouth.clear(); // NEW: Clear South LCD
lcdNorth.setCursor(0, 0); // NEW: Set cursor for North LCD
lcdSouth.setCursor(0, 0); // NEW: Set cursor for South LCD
lcdNorth.print(nsMessage); // NEW: Print message to North LCD
lcdSouth.print(nsMessage); // NEW: Print message to South LCD
lastNS = nsMessage; // NEW: Update last NS message
}
if (ewMessage != lastEW) {
lcdWest.clear(); // NEW: Clear West LCD
lcdEast.clear(); // NEW: Clear East LCD
lcdWest.setCursor(0, 0); // NEW: Set cursor for West LCD
lcdEast.setCursor(0, 0); // NEW: Set cursor for East LCD
lcdWest.print(ewMessage); // NEW: Print message to West LCD
lcdEast.print(ewMessage); // NEW: Print message to East LCD
lastEW = ewMessage; // NEW: Update last EW message
}
}
void loop() {
unsigned long currentMillis = millis(); // NEW: Get current time
switch (phase) {
case 0: // NS Green, EW Red
if (currentMillis - previousMillis = 5000) { //*greater than or equal to
previousMillis = currentMillis;
phase = 1;
}
digitalWrite(nsGreen, HIGH);
digitalWrite(nsYellow, LOW);
digitalWrite(nsRed, LOW);
digitalWrite(ewGreen, LOW);
digitalWrite(ewYellow, LOW);
digitalWrite(ewRed, HIGH);
updateLCDs("DON'T WALK", "WALK");
break;
case 1: // NS Yellow, EW Red
if (currentMillis - previousMillis = 1500) { //*greater than or equal to
previousMillis = currentMillis;
phase = 2;
}
digitalWrite(nsGreen, LOW);
digitalWrite(nsYellow, HIGH);
digitalWrite(nsRed, LOW);
digitalWrite(ewGreen, LOW);
digitalWrite(ewYellow, LOW);
digitalWrite(ewRed, HIGH);
updateLCDs("DON'T WALK", "DON'T WALK");
break;
case 2: // NS Red, EW Green
if (currentMillis - previousMillis = 5000) { //*greater than or equal to
previousMillis = currentMillis;
phase = 3;
}
digitalWrite(nsGreen, LOW);
digitalWrite(nsYellow, LOW);
digitalWrite(nsRed, HIGH);
digitalWrite(ewGreen, HIGH);
digitalWrite(ewYellow, LOW);
digitalWrite(ewRed, LOW);
updateLCDs("WALK", "DON'T WALK");
break;
case 3: // NS Red, EW Yellow
if (currentMillis - previousMillis = 1500) { //*greater than or equal to
previousMillis = currentMillis;
phase = 0;
}
digitalWrite(nsGreen, LOW);
digitalWrite(nsYellow, LOW);
digitalWrite(nsRed, HIGH);
digitalWrite(ewGreen, LOW);
digitalWrite(ewYellow, HIGH);
digitalWrite(ewRed, LOW);
updateLCDs("DON'T WALK", "DON'T WALK");
break;
}
}
Информация по комментариям в разработке