//**************************************************************//
// Name : Atividade Gehra
// Author : Ashley Saint-Louis
// Date : 20/05/2024
// Modified:
// Version : 1
// Notes : Code for controlling a two-stroke traffic light
// : with a pedestrian button and regressive time
// : couting using two 74HC595 Shift Registers
// : saving GPIO pins
//**************************************************************//
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};
//Pin connected to ST_CP of 74HC595
int latchPin = 6;
//Pin connected to SH_CP of 74HC595
int clockPin = 5;
////Pin connected to DS of 74HC595
int dataPin = 7;
const byte digitMap[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 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);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
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) {
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;
}
}