const int RED = 4;
const int YELLOW = 3;
const int GREEN = 2;
const int DELAY_RED = 9;
const int DELAY_YELLOW = 3;
const int DELAY_GREEN = 9;
const int a = 12;
const int b = 13;
const int c = 5;
const int d = 6;
const int e = 7;
const int f = 11;
const int g = 10;
const bool digitMap[10][7] = {
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 0, 0, 1, 1} // 9
};
const int segmentPins[7] = {a, b, c, d, e, f, g};
void setup() {
// Traffic lights
pinMode(RED, OUTPUT);
pinMode(YELLOW, OUTPUT);
pinMode(GREEN, OUTPUT);
// 7-segment display
for (int i = 0; i < 7; i++) {
pinMode(segmentPins[i], OUTPUT);
}
Serial.begin(9600);
}
void loop() {
// STOP PHASE
for (int i = DELAY_RED; i > 0; i--) {
if (i <= DELAY_YELLOW) {
// RED/YELLOW TRANSITION
red_yellow_light();
display(i);
} else {
// RED LIGHT
red_light();
display(i);
}
delay(1000);
}
// GO PHASE
for (int i = DELAY_GREEN; i > 0; i--) {
if (i <= DELAY_YELLOW) {
// YELLOW TRANSITION
yellow_light();
display(i);
} else {
// GREEN LIGHT
green_light();
display(i);
}
delay(1000);
}
}
void red_light() {
digitalWrite(RED, HIGH);
digitalWrite(YELLOW, LOW);
digitalWrite(GREEN, LOW);
}
void red_yellow_light() {
digitalWrite(RED, HIGH);
digitalWrite(YELLOW, HIGH);
digitalWrite(GREEN, LOW);
}
void yellow_light() {
digitalWrite(RED, LOW);
digitalWrite(YELLOW, HIGH);
digitalWrite(GREEN, LOW);
}
void green_light() {
digitalWrite(RED, LOW);
digitalWrite(YELLOW, LOW);
digitalWrite(GREEN, HIGH);
}
void display(int num) {
if (num < 0 || num > 9) {
clearDisplay();
return;
}
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], digitMap[num][i] ? HIGH : LOW);
}
Serial.print("Countdown: ");
Serial.println(num);
}
void clearDisplay() {
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], LOW);
}
}