const int LED[4][3] = {
{13, 12, 11}, // Norte: Verde, Amarelo, Vermelho
{10, 9, 8}, // Leste: Verde, Amarelo, Vermelho
{7, 6, 5}, // Sul: Verde, Amarelo, Vermelho
{4, 3, 2} // Oeste: Verde, Amarelo, Vermelho
};
unsigned long tempoAnterior = 0; // Usado para controlar o tempo
unsigned long tempoVerde = 100; // Tempo inicial para o verde (100ms)
unsigned long tempoAmarelo = 10; // Tempo para o amarelo (10ms)
unsigned long tempoTroca = 0; // Marca o tempo de mudança de cor
char direcaoAtual = 'n'; // Direção atual do tráfego
char direcaoAnterior = 'n'; // Direção anterior
int tempoVerdeRestante = 100; // Tempo restante para o verde
void setup() {
Serial.begin(9600);
for (int j = 0; j < 4; j++) {
for (int i = 0; i < 3; i++) {
pinMode(LED[j][i], OUTPUT); // Configura os pinos dos LEDs como saída
}
}
Serial.println("MONITOR");
}
void loop() {
unsigned long tempoAtual = millis(); // Captura o tempo atual
if(direcaoAtual=='n'){
padrao();
}
// Verifica se há novos dados no Serial
if (Serial.available() > 0) {
direcaoAtual = Serial.read(); // Lê a direção a partir da entrada serial
// Se for um caractere válido, processa, senão marca como direção inválida
if (direcaoAtual == 'n' || direcaoAtual == 's' || direcaoAtual == 'l' || direcaoAtual == 'o') {
Serial.print(direcaoAtual);
} else {
Serial.println("INVÁLIDO");
direcaoAtual = 'n'; // Reseta a direção para 'n' (norte)
}
}
// Se a direção mudou ou está no estado inicial, reinicia o ciclo do semáforo
if (direcaoAtual != direcaoAnterior) {
tempoAnterior = tempoAtual; // Reseta o tempo ao mudar a direção
tempoVerdeRestante = tempoVerde; // Tempo verde reiniciado
direcaoAnterior = direcaoAtual; // Atualiza a direção anterior
}
// Controla as luzes dependendo da direção
if (direcaoAtual == 'n') {
controlarSemaforo(0, tempoAtual);
} else if (direcaoAtual == 'l') {
controlarSemaforo(1, tempoAtual);
} else if (direcaoAtual == 's') {
controlarSemaforo(2, tempoAtual);
} else if (direcaoAtual == 'o') {
controlarSemaforo(3, tempoAtual);
}
}
// Função que controla o semáforo de cada direção
void controlarSemaforo(int i, unsigned long tempoAtual) {
// Se o tempo do verde expirou
if (tempoAtual - tempoAnterior >= tempoVerdeRestante) {
// Passa do verde para o amarelo
digitalWrite(LED[i][0], LOW); // Apaga o verde
digitalWrite(LED[i][1], HIGH); // Acende o amarelo
tempoAnterior = tempoAtual; // Reseta o tempo
tempoVerdeRestante = tempoAmarelo; // Define o tempo para o amarelo
}
// Se o tempo do amarelo expirou
if (tempoAtual - tempoAnterior >= tempoVerdeRestante) {
// Passa do amarelo para o vermelho
digitalWrite(LED[i][1], LOW); // Apaga o amarelo
digitalWrite(LED[i][2], HIGH); // Acende o vermelho
tempoAnterior = tempoAtual; // Reseta o tempo
tempoVerdeRestante = tempoVerde; // Define o tempo para o verde da próxima vez
}
// Caso o semáforo ainda esteja no verde
if (tempoAtual - tempoAnterior < tempoVerdeRestante) {
digitalWrite(LED[i][0], HIGH); // Acende o verde
digitalWrite(LED[i][2], LOW); // Apaga o vermelho
}
}
void padrao(){
digitalWrite(LED[0][1], LOW);
digitalWrite(LED[0][2], LOW);
digitalWrite(LED[0][0], HIGH);
for(int i=1;i<4; i++){
digitalWrite(LED[i][0], LOW); // Apaga o verde
digitalWrite(LED[i][1], LOW);
digitalWrite(LED[i][2], HIGH);
}
}