//Por Wésley Lima da Paz
//Curso IOT - CEPEDI
//Semáforo de dois tempos
// Definição dos pinos dos LEDs
const int G1 = 21;
const int Y1 = 22;
const int R1 = 23;
const int G2 = 5;
const int Y2 = 18;
const int R2 = 19;
// Definição dos pinos dos botões
const int botao_inicio = 17;
const int botao_parada = 16;
// Variáveis de controle do tempo
unsigned long tempoInicio;
const unsigned long tempoVerde = 10000; // 10 segundos
const unsigned long tempoAmarelo = 2000; // 2 segundos
// Variáveis de estado
int estadoSemaforo = 0; // 0 para verde, 1 para amarelo, 2 para vermelho
void setup()
{
// Inicialização dos pinos
pinMode(G1, OUTPUT);
pinMode(Y1, OUTPUT);
pinMode(R1, OUTPUT);
pinMode(G2, OUTPUT);
pinMode(Y2, OUTPUT);
pinMode(R2, OUTPUT);
pinMode(botao_inicio, INPUT);
pinMode(botao_parada, INPUT);
// Inicialização do estado inicial
digitalWrite(G1, HIGH);
digitalWrite(R2, HIGH);
// Aguarda o pressionamento do botão para iniciar
while (digitalRead(botao_inicio) == HIGH) {
// Aguarda o botão ser pressionado
}
tempoInicio = millis();
}
void loop()
{
// Verifica se o botão de parada foi pressionado
if (digitalRead(botao_parada) == LOW) {
// Reinicia o ciclo quando o botão de parada é pressionado
estadoSemaforo = 5;
tempoInicio = millis();
} else if(digitalRead(botao_inicio) == LOW){
estadoSemaforo = 0;
tempoInicio = millis();
}
// Verifica o estado atual do semáforo e atualiza as luzes
switch (estadoSemaforo)
{
case 0: // Verde
atualizaSemaforo(G1, R2);
if (millis() - tempoInicio >= tempoVerde)
{
estadoSemaforo = 1;
tempoInicio = millis();
}
break;
case 1: // Amarelo
atualizaSemaforo(Y1, R2);
if (millis() - tempoInicio >= tempoAmarelo)
{
estadoSemaforo = 2;
tempoInicio = millis();
}
break;
case 2: // Vermelho
atualizaSemaforo(R1, G2);
if (millis() - tempoInicio >= tempoVerde)
{
estadoSemaforo = 3;
tempoInicio = millis();
}
break;
case 3: // Amarelo (Semaforo 2)
atualizaSemaforo(R1, Y2);
if (millis() - tempoInicio >= tempoAmarelo)
{
estadoSemaforo = 0;
tempoInicio = millis();
}
break;
case 5:
digitalWrite(G1, LOW);
digitalWrite(Y1, LOW);
digitalWrite(R1, LOW);
digitalWrite(G2, LOW);
digitalWrite(Y2, LOW);
digitalWrite(R2, LOW);
break;
}
}
// Função para atualizar as luzes dos semáforos
void atualizaSemaforo(int pinoSemaforo1, int pinoSemaforo2)
{
digitalWrite(G1, LOW);
digitalWrite(Y1, LOW);
digitalWrite(R1, LOW);
digitalWrite(G2, LOW);
digitalWrite(Y2, LOW);
digitalWrite(R2, LOW);
digitalWrite(pinoSemaforo1, HIGH);
digitalWrite(pinoSemaforo2, HIGH);
}