int cathode[] = {10, 11, 13, 12};
int anode[] = {6, 7, 8, 9};
int button[] = {2, 3, 4, 5};
#define WHT 0
#define RED 1
#define YEL 2
#define GRN 3
#define E 0
#define N 1
#define W 2
#define S 3
unsigned long normalTimer, normalTimeout = 1000;
unsigned long buttonTimer[4], buttonTimeout = 50;
int trafficState, buttonRead, buttonState[4], buttonStateOld[4];
unsigned long walkTimer, walkTimeout = 500;
bool walkPressed = false;
void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
for (int i = 0; i < 4; i++) {
pinMode(anode[i], OUTPUT);
digitalWrite(anode[i], LOW); // reverse bias
pinMode(cathode[i], OUTPUT);
digitalWrite(cathode[i], HIGH); // reverse bias
pinMode(button[i], INPUT_PULLUP);
}
}
void loop() {
// testLEDs();
// testButtons();
//===============
int direction = readButtons();
if (walkPressed) {
walk(direction);
}
}
void walk(int dir) {
// yel ON
for (int i = 0; i < 4; i++) {
ledON(YEL, i); // anode, cathode
}
delay(1000);
// grn OFF
ledOFF(GRN, E);
ledOFF(GRN, N);
ledOFF(GRN, W);
ledOFF(GRN, S);
delay(1000);
// red ON
ledON(RED, E);
ledON(RED, N);
ledON(RED, W);
ledON(RED, S);
while (1);
// yel OFF
ledOFF(YEL, E);
ledOFF(YEL, N);
ledOFF(YEL, W);
ledOFF(YEL, S);
if (dir == 1 || dir == 3) {
// walk ON
ledON(WHT, N);
ledON(WHT, S);
} else {
// walk OFF
ledON(WHT, E);
ledON(WHT, W);
}
}
void ledON (int an, int ca) {
digitalWrite(anode[an], HIGH);
digitalWrite(cathode[ca], LOW);
}
void ledOFF (int an, int ca) {
digitalWrite(cathode[ca], HIGH);
digitalWrite(anode[an], HIGH);
}
int readButtons() {
for (int b = 0; b < 4; b++) {
buttonRead = digitalRead(button[b]);
if (buttonRead != buttonStateOld[b]) {
buttonTimer[b] = millis();
}
if (millis() - buttonTimer[b] > buttonTimeout) {
if (buttonRead != buttonState[b]) {
buttonState[b] = buttonRead;
if (buttonState[b] == LOW) // button pressed
walkPressed = true;
}
}
buttonStateOld[b] = buttonRead;
}
}
void normalflow() {
// RED (3) >> RED/YEL (1) >> GRN (3) >> GRN/YEL (1) >>
if (millis() - normalTimer > normalTimeout) {
trafficState++;
if (trafficState > 5)
trafficState = 0;
}
switch (trafficState) {
case 0: {
digitalWrite(cathode[0], HIGH);
digitalWrite(anode[0], LOW);
digitalWrite(cathode[0], HIGH);
digitalWrite(anode[0], LOW);
}
}
}
void testButtons() {
for (int b = 0; b < 4; b++) {
if (digitalRead(button[b]) == 0) {
for (int i = 0; i < 4; i++) { // LEDs ON
digitalWrite(anode[i], HIGH); // all anodes forward bias
digitalWrite(cathode[b], LOW); // only button cathodes forward bias
}
} else {
for (int i = 0; i < 4; i++) { // LEDs OFF
digitalWrite(anode[i], LOW); // all anodes reverse bias
digitalWrite(cathode[b], HIGH); // only button cathode reverse bias
}
}
}
}
void testLEDs() {
int dly = 100;
for (int a = 0; a < 4; a++) {
delay(dly);
digitalWrite(anode[a], HIGH); // forward bias anodes
for (int c = 0; c < 4; c++) {
delay(dly);
digitalWrite(cathode[c], LOW); // LED ON - forward bias cathode
delay(dly);
digitalWrite(cathode[c], HIGH); // LED OFF - reverse bias cathode
}
digitalWrite(anode[a], LOW); // reverse bias anodes
}
}
N
S
W
E
DI
E
N
W
S
CA
D10
D11
D12
D13
BT
D2
D3
D4
D5
AN
D6
D7
D8
D9
AR
0
1
2
3
LED
WHT
RED
YEL
GRN