#include <Arduino.h>
enum Estado {
PEDESTRE,
LADO_DIREITA_VERMELHO,
LADO_DIREITA_VERDE,
LADO_DIREITA_AMARELO,
LADO_ESQUERDO_VERMELHO,
LADO_ESQUERDO_VERDE,
LADO_ESQUERDO_AMARELO
};
const int ledDireitaVermelho = 13;
const int ledDireitaAmarelo = 12;
const int ledDireitaVerde = 11;
const int ledEsquerdaVermelho = 10;
const int ledEsquerdaAmarelo = 9;
const int ledEsquerdaVerde = 8;
const int ledPedestreVermelho = A3;
const int ledPedestreVerde = A4;
const int buttonPin = A5;
const int segmentPins[8] = {0, 1, 2, 3, 4, 5, 6, 7};
const byte numbers[10] = {
B11111100, // 0
B01100000, // 1
B11011010, // 2
B11110010, // 3
B01100110, // 4
B10110110, // 5
B10111110, // 6
B11100000, // 7
B11111110, // 8
B11110110 // 9
};
Estado estadoAtual = LADO_DIREITA_VERMELHO;
Estado estadoAnterior;
unsigned long previousMillis = 0;
unsigned long interval = 2000;
unsigned long pedestrianInterval = 5000;
int countdown = 5;
unsigned long lastCountUpdate = 0;
void setup() {
for (int i = 0; i < 8; i++) {
pinMode(segmentPins[i], OUTPUT);
}
pinMode(ledDireitaVermelho, OUTPUT);
pinMode(ledDireitaVerde, OUTPUT);
pinMode(ledDireitaAmarelo, OUTPUT);
pinMode(ledEsquerdaVermelho, OUTPUT);
pinMode(ledEsquerdaVerde, OUTPUT);
pinMode(ledEsquerdaAmarelo, OUTPUT);
pinMode(ledPedestreVermelho, OUTPUT);
pinMode(ledPedestreVerde, OUTPUT);
pinMode(buttonPin, INPUT);
desativarTodosLeds();
digitalWrite(ledPedestreVermelho, HIGH);
}
void loop() {
int buttonState = digitalRead(buttonPin);
unsigned long currentMillis = millis();
if (buttonState == HIGH && estadoAtual != PEDESTRE) {
estadoAnterior = estadoAtual;
estadoAtual = PEDESTRE;
previousMillis = currentMillis;
desativarTodosLeds();
digitalWrite(ledPedestreVerde, HIGH);
digitalWrite(ledPedestreVermelho, LOW);
countdown = 5;
}
if (estadoAtual == PEDESTRE) {
if (currentMillis - lastCountUpdate >= 1000 && countdown > -1) {
lastCountUpdate = currentMillis;
displayNumber(countdown);
countdown--;
}
if (currentMillis - previousMillis >= pedestrianInterval) {
estadoAtual = estadoAnterior;
desativarTodosLeds();
atualizarSemaforo();
}
} else if (currentMillis - previousMillis >= interval) {
atualizarSemaforo();
previousMillis = currentMillis;
}
}
void displayNumber(int num) {
// Activate segments based on the number to be displayed
for (int i = 0; i < 8; i++) {
if (bitRead(numbers[num], i) == HIGH) {
digitalWrite(segmentPins[i], HIGH);
}
else {
digitalWrite(segmentPins[i], LOW);
}
}
}
void desativarTodosLeds() {
digitalWrite(ledDireitaVermelho, LOW);
digitalWrite(ledDireitaVerde, LOW);
digitalWrite(ledDireitaAmarelo, LOW);
digitalWrite(ledEsquerdaVermelho, LOW);
digitalWrite(ledEsquerdaVerde, LOW);
digitalWrite(ledEsquerdaAmarelo, LOW);
digitalWrite(ledPedestreVermelho, LOW);
digitalWrite(ledPedestreVerde, LOW);
}
void atualizarSemaforo() {
switch (estadoAtual) {
case LADO_DIREITA_VERMELHO:
estadoAtual = LADO_DIREITA_VERDE;
desativarTodosLeds();
digitalWrite(ledDireitaVermelho, HIGH);
digitalWrite(ledEsquerdaAmarelo, HIGH);
digitalWrite(ledPedestreVermelho, HIGH);
break;
case LADO_DIREITA_VERDE:
delay(20000);
estadoAtual = LADO_DIREITA_AMARELO;
desativarTodosLeds();
for (int i = 0; i < 2; i++) {
for (int j = 10; j >= 0; j--){
displayNumber(j);
}
}
digitalWrite(ledDireitaVerde, HIGH);
digitalWrite(ledEsquerdaVermelho, HIGH);
digitalWrite(ledPedestreVermelho, HIGH);
break;
case LADO_DIREITA_AMARELO:
estadoAtual = LADO_ESQUERDO_VERMELHO;
desativarTodosLeds();
digitalWrite(ledDireitaAmarelo, HIGH);
digitalWrite(ledEsquerdaVermelho, HIGH);
digitalWrite(ledPedestreVermelho, HIGH);
break;
case LADO_ESQUERDO_VERMELHO:
estadoAtual = LADO_ESQUERDO_VERDE;
desativarTodosLeds();
digitalWrite(ledEsquerdaVermelho, HIGH);
digitalWrite(ledDireitaAmarelo, HIGH);
digitalWrite(ledPedestreVermelho, HIGH);
break;
case LADO_ESQUERDO_VERDE:
estadoAtual = LADO_ESQUERDO_AMARELO;
desativarTodosLeds();
digitalWrite(ledEsquerdaVerde, HIGH);
digitalWrite(ledDireitaVermelho, HIGH);
digitalWrite(ledPedestreVermelho, HIGH);
break;
case LADO_ESQUERDO_AMARELO:
estadoAtual = LADO_DIREITA_VERMELHO;
desativarTodosLeds();
digitalWrite(ledEsquerdaAmarelo, HIGH);
digitalWrite(ledDireitaVermelho, HIGH);
digitalWrite(ledPedestreVermelho, HIGH);
break;
default:
break;
}
}