#define RED_LED_PIN 27
#define YELLOW_LED_PIN 26
#define GREEN_LED_PIN 25
#define BUTTON_PIN 14
#define SEGMENT_A_PIN 23
#define SEGMENT_B_PIN 22
#define SEGMENT_C_PIN 21
#define SEGMENT_D_PIN 19
#define SEGMENT_E_PIN 18
#define SEGMENT_F_PIN 5
#define SEGMENT_G_PIN 4

int segmentPins[] = {
  SEGMENT_A_PIN,
  SEGMENT_B_PIN,
  SEGMENT_C_PIN,
  SEGMENT_D_PIN,
  SEGMENT_E_PIN,
  SEGMENT_F_PIN,
  SEGMENT_G_PIN
};

int segmentOnValues[] = {
  B0000001, // 0 = a
  B1001111, // 1 = b
  B0010010, // 2 = c
  B0000110, // 3 = d
  B1001100, // 4 = e
  B0100100, // 5 = f
  B0100000, // 6 = g
  B0000000, // 7 = desligado
};

int segmentState[] = {0, 0, 0, 0}; // Estado atual de cada dígito do display
unsigned long segmentLastUpdateTime = 0;

int state = 0; // 0 = vermelho, 1 = verde, 2 = amarelo
bool buttonPressed = false;
unsigned long buttonPressTime = 0;
unsigned long counterStartTime = 0;
unsigned long lastTickTime = 0;

void setup() {
  pinMode(RED_LED_PIN, OUTPUT);
  pinMode(YELLOW_LED_PIN, OUTPUT);
  pinMode(GREEN_LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  for (int i = 0; i < 7; i++) {
    pinMode(segmentPins[i], OUTPUT);
  }
  updateDisplay();
}

void loop() {
  // Verifica se o botão foi pressionado
  if (!buttonPressed && digitalRead(BUTTON_PIN) == LOW) {
    buttonPressed = true;
    buttonPressTime = millis();
  }
  
  // Verifica se o botão foi solto
  if (buttonPressed && digitalRead(BUTTON_PIN) == HIGH) {
    buttonPressed = false;
    if (state == 0) { // Botão pressionado quando o sinal está vermelho
      counterStartTime = millis(); // Inicia a contagem de 10 segundos
    }
  }
  
  // Verifica se o tempo de contagem de 10 segundos acabou
  if (state == 0 && counterStartTime != 0 && millis() - counterStartTime >= 10000) {
    counterStartTime = 0;
    state = 1; // Troca o sinal para verde
    updateDisplay();
  }
  
  // Verifica se é necessário trocar o estado do sinal
  if (state == 0 && millis() - lastTickTime >= 1000) {
    lastTickTime = millis();
    digitalWrite(GREEN_LED_PIN, LOW);
    digitalWrite(YELLOW_LED_PIN, HIGH);
    delay(500);
    digitalWrite(RED_LED_PIN, LOW);
    digitalWrite(YELLOW_LED_PIN, LOW);
    digitalWrite(RED_LED_PIN, HIGH);
    state = 2;
    updateDisplay();
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
sevseg1:COM.1
sevseg1:COM.2
sevseg1:A
sevseg1:B
sevseg1:C
sevseg1:D
sevseg1:E
sevseg1:F
sevseg1:G
sevseg1:DP
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
led4:A
led4:C
led5:A
led5:C