const int walkButtons[] = {2,4}; // First is N/S (Blue Button), and 2nd is E/W (Red Button)
const int numofWalkButtons = sizeof(walkButtons) / sizeof(walkButtons[0]);
const int NorthSouthLights[] = {8, 9, 10, 28, 22, 24, 26, 30}; // 1st set of 4 are North Lights (red, yellow, green, then blue). 2nd set is South
const int numofNSLights = sizeof(NorthSouthLights) / sizeof(NorthSouthLights[0]);
const int EastWestLights[] = {11, 12, 13, 23, 25, 27};
const int numofEWLights = sizeof(EastWestLights) / sizeof(EastWestLights[0]);
const int PIRsensors[] = {18, 19};
const int numofPIR = sizeof(PIRsensors) / sizeof(PIRsensors[0]);
int lightDurations[] = {1000, 2000, 5000};
int trafficState = 0;
unsigned long lastChangeofState;
unsigned long lastNSDebounceTime;
unsigned long lastEWDebounceTime;
unsigned long lastNorthPIRdetectTime;
unsigned long lastSouthPIRdetectTime;
int NSButtonReading;
int NSWalkButton;
int EWButtonReading;
int EWWalkButton;
int previousEWWalkButton = 1;
int previousNSWalkButton = 1;
int debounceDelay = 50;
int NSWalkVal;
int EWWalkVal;
int previousNorthLight = 0;
int previousSouthLight = 4;
int previousEastLight = 0;
int previousWestLight = 3;
int NorthPIRReading;
int NorthPIRState;
int previousNorthPIRState = 0;
int SouthPIRReading;
int SouthPIRState;
int previousSouthPIRState = 0;
int PIRActivateTime = 1000;
int NorthLeftPermit = 0;
int SouthLeftPermit = 0;
void NorthPIRDetection(){
if (NorthPIRReading != previousNorthPIRState){
lastNorthPIRdetectTime = millis();
}
if (millis() - lastNorthPIRdetectTime > PIRActivateTime){
NorthPIRState = NorthPIRReading;
if (NorthPIRState == 1){
NorthLeftPermit = 1;
//Serial.println(NorthLeftPermit);
}
}
previousNorthPIRState = NorthPIRReading;
}
void SouthPIRDetection(){
if (SouthPIRReading != previousSouthPIRState){
lastSouthPIRdetectTime = millis();
}
if (millis() - lastSouthPIRdetectTime > PIRActivateTime){
SouthPIRState = SouthPIRReading;
if (SouthPIRState == 1){
SouthLeftPermit = 1;
}
}
previousSouthPIRState = SouthPIRState;
}
void debounce(){
if (NSButtonReading != previousNSWalkButton){
lastNSDebounceTime = millis();
}
//Serial.println(lastNSDebounceTime);
if (millis() - lastNSDebounceTime > debounceDelay){ //if Blue Button is pressed, then the NSWalkVal is updated to 1
NSWalkButton = NSButtonReading;
if (NSWalkButton == 0){
NSWalkVal = 1;
//Serial.println("Blue button press");
}
}
previousNSWalkButton = NSWalkButton;
if (EWButtonReading != previousEWWalkButton){
lastEWDebounceTime = millis();
}
if (millis() - lastEWDebounceTime > debounceDelay){ //if Blue Button is pressed, then the NSWalkVal is updated to 1
EWWalkButton = EWButtonReading;
if (EWWalkButton == 0){
EWWalkVal = 1;
}
}
previousEWWalkButton = EWWalkButton;
}
void setup() {
Serial.begin(115200);
for (int h = 0; h < numofPIR; h++){ //Set PIR Sensors as inputs
pinMode(PIRsensors[h], INPUT);
}
for (int i = 0; i < numofWalkButtons; i++){ //Set walk buttons as Inputs with activated pullup resistors
pinMode(walkButtons[i], INPUT_PULLUP);
}
for (int j = 0; j < numofNSLights; j++){ //Set NS lights as outputs
pinMode(NorthSouthLights[j], OUTPUT);
}
for (int k = 0; k < numofEWLights; k++){ // Set
pinMode(EastWestLights[k], OUTPUT);
}
}
void loop() {
if (trafficState == 0){
//Serial.println("North/South Green");
lightDurations[2] = 5000 + 5000*NSWalkVal;
NSWalkVal = 0;
for (int i = 2; i > -1; i--){
while (millis() - lastChangeofState < lightDurations[i]){
digitalWrite(NorthSouthLights[previousNorthLight],LOW);
digitalWrite(NorthSouthLights[previousSouthLight],LOW);
digitalWrite(NorthSouthLights[i], HIGH);
digitalWrite(NorthSouthLights[i+4], HIGH);
digitalWrite(EastWestLights[previousEastLight],HIGH);
digitalWrite(EastWestLights[previousWestLight], HIGH);
NSButtonReading = digitalRead(walkButtons[0]);
//Serial.println(NSButtonReading);
EWButtonReading = digitalRead(walkButtons[1]);
debounce();
NorthPIRReading = digitalRead(PIRsensors[0]);
NorthPIRDetection();
Serial.print("North sensor detects: ");
Serial.println(NorthPIRState);
SouthPIRReading = digitalRead(PIRsensors[1]);
SouthPIRDetection();
//Serial.print("South sensor detects: ");
//Serial.println(SouthLeftPermit);
}
lastChangeofState = millis();
//Serial.println("Change color");
previousNorthLight = i;
previousSouthLight = i+4;
}
trafficState = 1;
}
if (trafficState == 1){
//Serial.println("East/West Green");
lightDurations[2] = 5000 + 5000*EWWalkVal;
NSWalkVal = 0;
for (int i = 2; i > -1; i--){
while (millis() - lastChangeofState < lightDurations[i]){
digitalWrite(EastWestLights[previousEastLight],LOW);
digitalWrite(EastWestLights[previousWestLight], LOW);
digitalWrite(EastWestLights[i], HIGH);
digitalWrite(EastWestLights[i+3], HIGH);
digitalWrite(NorthSouthLights[previousNorthLight],HIGH);
digitalWrite(NorthSouthLights[previousSouthLight], HIGH);
NSButtonReading = digitalRead(walkButtons[0]);
//Serial.println(digitalRead(walkButtons[1]));
EWButtonReading = digitalRead(walkButtons[1]);
debounce();
}
lastChangeofState = millis();
previousEastLight = i;
previousWestLight = i+3;
}
trafficState = 0;
}
}