const int redPin = 13;
const int yellowPin = 12;
const int greenPin = 11;
// BUTTON VARIABLES
const int buttonPin = 2;
int buttonPrevState = LOW;
// added code
bool buttonPressed = false;
unsigned long buttonPressedTime = 0;
// Transitional interval
long interval = 1000;
unsigned long prevMillis = 0;
//7-segment display pin assign
int A=3;int B=4;int C=5;int D=6;int E=7;int F=8;int G=9;
//Digital map
static const uint8_t digitCodeMap[] = {
0b01000000, // 0
0b01111001, // 1
0b00100100, // 2 A
0b00110000, // 3 GFEDCBA F B
0b00011001, // 4 G
0b00010010, // 5 E C
0b00000010, // 6 D
0b1011000, // 7
0b00000000, // 8
0b00010000, // 9
};
//Pins for segment
int segmentPins[7]={A,B,C,D,E,F,G};
void setup() {
//LEDs
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(buttonPin, INPUT);
digitalWrite(redPin, HIGH);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
interval = 5000;
//Serial Output
Serial.begin(9600);
//Segment display
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
}
// Function to calculate time left before switching to the next light
unsigned long calculateTimeLeft(unsigned long currentMillis, unsigned long prevMillis, long interval) {
return interval - (currentMillis - prevMillis);
}
void loop() {
// Normal Sequence
unsigned long currentMillis = millis(); // time elapsed since the program is run
// button edited code
if (isButtonPressed()) {
buttonPressed = true;
buttonPressedTime = currentMillis;
digitalWrite(redPin, LOW);
digitalWrite(greenPin, HIGH);
digitalWrite(yellowPin, LOW);
interval = 3000;
Serial.print("Button Pressed\n");
}
// edited
int buttonState1 = digitalRead(buttonPin);
if (buttonState1 == LOW) {
if (currentMillis - prevMillis >= interval) {
prevMillis = currentMillis;
// Serial.print("struct");
if (digitalRead(redPin) == HIGH) {
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, HIGH);
interval = 4000;
Serial.print("Yellow\n");
} else if (digitalRead(yellowPin) == HIGH) {
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, HIGH);
interval = 9000;
Serial.print("Green\n");
} else if (digitalRead(greenPin) == HIGH) {
digitalWrite(greenPin, LOW);
digitalWrite(redPin, HIGH);
interval = 9000;
Serial.print("Red\n");
}
}
}
// Calculate time left before switching to the next light
unsigned long timeLeft = calculateTimeLeft(currentMillis, prevMillis, interval);
Serial.print("Time left: ");
Serial.println(timeLeft);
//Display timer output
unsigned long timeInSeconds=timeLeft/1000;
displayDigit(timeInSeconds);
//displayDigit(9);
}
//supplementary functions
// Check button status
bool isButtonPressed() {
static unsigned long lastButtonPressTime = 0;
const unsigned long debounceDelay = 50; // Debounce delay in milliseconds
int buttonState = digitalRead(buttonPin);
if (buttonState == HIGH && millis() - lastButtonPressTime >= debounceDelay) {
lastButtonPressTime = millis();
return true;
}
return false;
}
// switch on segments
void displayDigit(int digit) {
for (int segment = 0; segment < 7; ++segment) {
int segmentValue = LOW;
if (digitCodeMap[digit] & (1 << segment)) {
segmentValue = HIGH;
}
digitalWrite(segmentPins[segment], segmentValue);
}
}