int red = A0;
int yellow = A1;
int green = A2;
int yellowTime = 5; // Time for yellow light to blink
int greenTime = 10; // Time for green light
int redTime = 10; // Time for red light
int num_array[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,1,0,1,1} //9
};
void setup() {
for (int i = 0; i <= 13; i++) {
pinMode(i, OUTPUT);
}
pinMode(red, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(green, OUTPUT);
digitalWrite(red, LOW);
digitalWrite(yellow, LOW);
digitalWrite(green, LOW);
}
void loop() {
Red();
blinkYellow();
Green();
}
void Red() {
digitalWrite(red, HIGH);
digitalWrite(yellow, LOW);
digitalWrite(green, LOW);
for (int seconds = redTime; seconds >= 0; seconds--) {
if (seconds < 6) {
blinkYellowWithDisplay(seconds); // Blink yellow with display sync when less than 6 seconds
break; // Exit after blinking phase to avoid double handling
} else {
display(seconds); // Normal countdown display
}
}
digitalWrite(red, LOW);
}
void Green() {
digitalWrite(red, LOW);
digitalWrite(yellow, LOW);
digitalWrite(green, HIGH);
for (int seconds = greenTime; seconds >= 0; seconds--) {
if (seconds < 6) {
blinkYellowWithDisplay(seconds); // Call modified blinking with display function
break; // Exit after the blinking phase to avoid redundant handling
} else {
display(seconds); // Normal countdown display
}
}
digitalWrite(green, LOW);
}
void blinkYellowWithDisplay(int duration) {
for (int i = duration; i >= 0; i--) {
digitalWrite(yellow, HIGH);
display_number(i, false); // Show number
delay(500); // On for half second
digitalWrite(yellow, LOW);
clearDisplay(); // Clear display
delay(500); // Off for half second
}
}
void blinkYellow() {
// Normal blinking behavior for yellow light (not part of the countdown)
}
void display(int duration) {
if (duration >= 6) { // Only display if duration is 6 or more to avoid conflict with blinking logic
int tens = duration / 10;
int ones = duration % 10;
display_number(tens, true); // Display tens digit
display_number(ones, false); // Display ones digit
delay(1000); // Wait for one second
}
}
void display_number(int num, bool isTens) {
int startPin = isTens ? 0 : 7;
for (int pin = startPin, segment = 0; pin < startPin + 7 && segment < 7; pin++, segment++) {
digitalWrite(pin, num_array[num][segment]);
}
}
void clearDisplay() {
for (int pin = 0; pin <= 13; pin++) {
digitalWrite(pin, LOW);
}
}