//#include <SPI.h>
//#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define SS_PIN 10
#define RST_PIN 9
//MFRC522 rfid(SS_PIN, RST_PIN);
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define BUZZER_PIN 2
const int greenPins[4] = {A0, A3, 3, 6};
const int yellowPins[4] = {A1, 1, 4, 7};
const int redPins[4] = {A2, 0, 5, 8};
const byte emergencyUIDs[][4] = {
{0x4, 0xF3, 0xEE, 0xA},
{0x4, 0xF3, 0xE6, 0xA},
{0x4, 0xF3, 0xED, 0xA},
};
const char* emergencyTypes[] = {
">>>--AMBULANCE--<<<",
">>>--FIRE TRUCK--<<<",
">>>---VIP TRIP---<<<SCOOTER"
};
const int numEmergencyUIDs = sizeof(emergencyUIDs) / sizeof(emergencyUIDs[0]);
bool emergencyDetected = false;
const char* detectedVehicle = "";
int N;
void setup()
{
//for simulation only
pinMode(9, INPUT) ;
pinMode(10, INPUT) ;
pinMode(11, INPUT) ;
//Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Traffic System Init");
//SPI.begin();
// rfid.PCD_Init();
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
for (int i = 0; i < 4; i++) {
pinMode(greenPins[i], OUTPUT);
pinMode(yellowPins[i], OUTPUT);
pinMode(redPins[i], OUTPUT);
digitalWrite(greenPins[i], LOW);
digitalWrite(yellowPins[i], LOW);
digitalWrite(redPins[i], HIGH);
}
delay(2000);
lcd.clear();
}
void loop() {
for (int i = 0; i < 4; i++) {
N=i;
setTrafficLights(i);
if (timedPhaseWithCheck("Green", 7000)) return;
//lcd.setCursor(0, 0);
//lcd.print("Road ");
//lcd.print(i + 1);
//lcd.print(" Yellow ");
digitalWrite(greenPins[i], LOW);
digitalWrite(yellowPins[i], HIGH);
if (timedPhaseWithCheck("Yellow", 3000)) return;
digitalWrite(yellowPins[i], LOW);
digitalWrite(redPins[i], HIGH);
}
}
bool timedPhaseWithCheck(const char* phase, unsigned long duration) {
unsigned long startTime = millis();
unsigned long elapsed = 0;
while (elapsed < duration) {
checkRFID();
if (emergencyDetected) {
handleEmergency(detectedVehicle);
emergencyDetected = false;
return true;
}
lcd.setCursor(0, 0);
lcd.print("--NORMAL RESTORED--");
lcd.setCursor(0, 1);
lcd.print("ROAD NO:");
lcd.print(N + 1);
lcd.print(" GRANTED");
lcd.setCursor(0, 2);
lcd.print("PHASE TYPE: ");
lcd.print(phase);
lcd.setCursor(0, 3);
lcd.print("TIME LEFT: ");
lcd.print((duration - elapsed) / 1000);
lcd.print(" sec");
delay(200); // small delay to reduce flicker
elapsed = millis() - startTime;
}
lcd.clear();
return false;
}
void checkRFID() {
//real code
/* if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
for (int i = 0; i < numEmergencyUIDs; i++) {
if (isMatchingUID(rfid.uid.uidByte, emergencyUIDs[i])) {
detectedVehicle = emergencyTypes[i];
emergencyDetected = true;
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
return;
}
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}*/
for (int i = 0; i < numEmergencyUIDs; i++)
{
if(digitalRead(9+i)==LOW)
{
detectedVehicle = emergencyTypes[i];
emergencyDetected = true;
return;
}
}
}
bool isMatchingUID(byte* uid, const byte* targetUID) {
for (byte i = 0; i < 4; i++) {
if (uid[i] != targetUID[i]) {return false;}
//Serial.print(uid[i],HEX);Serial.print(":");
}
return true;
}
void handleEmergency(const char* vehicleType) {
for (int i = 0; i < 4; i++) {
digitalWrite(greenPins[i], LOW);
digitalWrite(yellowPins[i], LOW);
digitalWrite(redPins[i], HIGH);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("!EMERGENCY VEHICLE!");
lcd.setCursor(0, 1);
lcd.print(vehicleType);
tone(BUZZER_PIN, 900);
delay(7000);
noTone(BUZZER_PIN);
lcd.clear();
}
void setTrafficLights(int activeRoad) {
for (int i = 0; i < 4; i++) {
if (i == activeRoad) {
digitalWrite(redPins[i], LOW);
digitalWrite(greenPins[i], HIGH);
} else {
digitalWrite(greenPins[i], LOW);
digitalWrite(redPins[i], HIGH);
}
digitalWrite(yellowPins[i], LOW);
}
}