// Definição das portas dos LEDs
const int ledA_red = 2;
const int ledA_yellow = 3;
const int ledA_green = 4;
const int ledB_red = 5;
const int ledB_yellow = 6;
const int ledB_green = 7;
const int ped_red = 8;
const int ped_green = 9;
// Botão do pedestre
const int button = 10;
// Controle de tempo
unsigned long previousMillis = 0;
unsigned long cycleMillis = 0;
// Intervalos de tempo
const unsigned long greenTime = 10000;
const unsigned long yellowTime = 3000;
const unsigned long pedTime = 5000;
bool isPedestrianWaiting = false;
bool isPedestrianCrossing = false;
int state = 0; // Estado do ciclo do semáforo
void setup() {
// Configurar os LEDs como saída
pinMode(ledA_red, OUTPUT);
pinMode(ledA_yellow, OUTPUT);
pinMode(ledA_green, OUTPUT);
pinMode(ledB_red, OUTPUT);
pinMode(ledB_yellow, OUTPUT);
pinMode(ledB_green, OUTPUT);
pinMode(ped_red, OUTPUT);
pinMode(ped_green, OUTPUT);
// Configurar o botão como entrada
pinMode(button, INPUT_PULLUP);
// Inicializar os estados iniciais
digitalWrite(ledA_green, HIGH);
digitalWrite(ledB_red, HIGH);
digitalWrite(ped_red, HIGH);
}
void loop() {
unsigned long currentMillis = millis();
// Verifica se o botão foi pressionado
if (digitalRead(button) == LOW && !isPedestrianWaiting) {
isPedestrianWaiting = true;
}
if (isPedestrianCrossing) {
// Controle para o pedestre cruzar
if (currentMillis - cycleMillis >= pedTime) {
// Finaliza o tempo de atravessar
digitalWrite(ped_green, LOW);
digitalWrite(ped_red, HIGH);
isPedestrianCrossing = false;
isPedestrianWaiting = false;
// Retorna ao ciclo normal
state = 0;
previousMillis = currentMillis;
}
} else {
// Controle do ciclo do semáforo
if (currentMillis - previousMillis >= greenTime && state == 0) {
// Troca de verde para amarelo
previousMillis = currentMillis;
digitalWrite(ledA_green, LOW);
digitalWrite(ledA_yellow, HIGH);
state = 1;
} else if (currentMillis - previousMillis >= yellowTime && state == 1) {
// Troca de amarelo para vermelho e troca do outro semáforo
previousMillis = currentMillis;
digitalWrite(ledA_yellow, LOW);
digitalWrite(ledA_red, HIGH);
digitalWrite(ledB_red, LOW);
digitalWrite(ledB_green, HIGH);
state = 2;
} else if (currentMillis - previousMillis >= greenTime && state == 2) {
// Troca do semáforo B para amarelo
previousMillis = currentMillis;
digitalWrite(ledB_green, LOW);
digitalWrite(ledB_yellow, HIGH);
state = 3;
} else if (currentMillis - previousMillis >= yellowTime && state == 3) {
// Troca do semáforo B para vermelho e troca do semáforo A
previousMillis = currentMillis;
digitalWrite(ledB_yellow, LOW);
digitalWrite(ledB_red, HIGH);
digitalWrite(ledA_red, LOW);
digitalWrite(ledA_green, HIGH);
state = 0;
// Verifica se o pedestre está aguardando
if (isPedestrianWaiting) {
isPedestrianCrossing = true;
cycleMillis = currentMillis;
// Ambos os semáforos ficam vermelhos
digitalWrite(ledA_green, LOW);
digitalWrite(ledA_red, HIGH);
digitalWrite(ledB_green, LOW);
digitalWrite(ledB_red, HIGH);
// Sinal de pedestre
digitalWrite(ped_red, LOW);
digitalWrite(ped_green, HIGH);
}
}
}
}