#include <Arduino.h> // Inclui a biblioteca principal do Arduino/ESP32
// --- Definição dos Pinos GPIO ---
#define LED_VERDE_VEICULO 16
#define LED_AMARELO_VEICULO 17
#define LED_VERMELHO_VEICULO 18
#define LED_AZUL_PEDESTRE 19
#define BOTAO_VEICULO 14
#define BOTAO_PEDESTRE 12
// --- Tempos de Ciclo (Ajustados para Wokwi para evitar resets) ---
#define TEMPO_VERDE_VEICULO 1000UL // milissegundos
#define TEMPO_AMARELO_VEICULO 500UL
#define TEMPO_VERMELHO_VEICULO 1000UL
#define TEMPO_AZUL_PEDESTRE 2000UL
// --- Variáveis Globais de Estado (usando int para flags booleanas, 0=falso, 1=verdadeiro) ---
int pedestre_solicitou = 0; // Flag para indicar se o pedestre solicitou a travessia
// --- Função de Inicialização ---
void setup() {
Serial.begin(115200); // Inicia a comunicação serial para depuração
Serial.println("\n>>> Programa de Semáforo (Simplificado, Corrigido) Iniciado <<<");
// Configura os pinos dos LEDs como SAÍDAS
pinMode(LED_VERDE_VEICULO, OUTPUT);
pinMode(LED_AMARELO_VEICULO, OUTPUT);
pinMode(LED_VERMELHO_VEICULO, OUTPUT);
pinMode(LED_AZUL_PEDESTRE, OUTPUT);
// Configura os pinos dos botões como ENTRADAS com PULLDOWN interno
// Isso garante que o pino esteja LOW quando o botão não estiver pressionado.
pinMode(BOTAO_VEICULO, INPUT_PULLDOWN);
pinMode(BOTAO_PEDESTRE, INPUT_PULLDOWN);
// Garante que todos os LEDs estejam desligados no início
digitalWrite(LED_VERDE_VEICULO, LOW);
digitalWrite(LED_AMARELO_VEICULO, LOW);
digitalWrite(LED_VERMELHO_VEICULO, LOW);
digitalWrite(LED_AZUL_PEDESTRE, LOW);
Serial.println("Todos os LEDs desligados no início.");
}
//**********************************************************************************
// --- Função Principal do Programa ---
void loop() {
// === Seção de Leitura do Botão de Pedestre (ocorre continuamente) ===
// Esta parte do código sempre verifica o botão de pedestre,
if (digitalRead(BOTAO_PEDESTRE) == HIGH) {
if (pedestre_solicitou == 0) { // Só registra a solicitação uma vez por pressionamento
pedestre_solicitou = 1; // Pedestre solicitou
Serial.println(">>> Pedestre pressionou o botão de travessia! (Solicitação Registrada) <<<");
}
// Pequeno delay para "segurar" a detecção do botão e evitar a leitura instável sem debounce real.
// Pode ser ajustado ou removido se causar problemas na sua simulação/hardware.
delay(50);
}
// === Seção de Leitura do Botão Veicular ===
// Lê o estado atual do botão veicular
if (digitalRead(BOTAO_VEICULO) == HIGH) {
Serial.println("\n--- Botão Principal (Veicular) Pressionado! ---");
Serial.println("Iniciando Ciclo do Semáforo Veicular...");
// Desliga todos os LEDs inicialmente para garantir estado conhecido
digitalWrite(LED_VERDE_VEICULO, LOW);
digitalWrite(LED_AMARELO_VEICULO, LOW);
digitalWrite(LED_VERMELHO_VEICULO, LOW);
digitalWrite(LED_AZUL_PEDESTRE, LOW);
// --- PASSO 1: LED VERDE (Veículos) ---
Serial.println(">> Sinal Veicular: VERDE");
digitalWrite(LED_VERDE_VEICULO, HIGH);
delay(TEMPO_VERDE_VEICULO);
// --- PASSO 2: LED AMARELO (Veículos) ---
Serial.println(">> Sinal Veicular: AMARELO");
digitalWrite(LED_VERDE_VEICULO, LOW);
digitalWrite(LED_AMARELO_VEICULO, HIGH);
delay(TEMPO_AMARELO_VEICULO);
// --- PASSO 3: LED VERMELHO (Veículos) ---
Serial.println(">> Sinal Veicular: VERMELHO");
digitalWrite(LED_AMARELO_VEICULO, LOW);
digitalWrite(LED_VERMELHO_VEICULO, HIGH);
delay(TEMPO_VERMELHO_VEICULO);
// === Lógica de Pedestre após Ciclo Veicular ===
// AGORA, verifica APENAS a flag 'pedestre_solicitou' que foi atualizada no início do loop()
if (pedestre_solicitou == 1) { // Se a flag de solicitação estiver ativa
Serial.println("Solicitação de Pedestre Detectada. Ativando travessia.");
// Garante que o LED vermelho veicular seja desligado antes do pedestre
digitalWrite(LED_VERMELHO_VEICULO, LOW);
// --- PASSO 1: LED AZUL (Pedestre) ---
Serial.println(">> Sinal Pedestre: AZUL (Travessia Permitida)");
digitalWrite(LED_AZUL_PEDESTRE, HIGH);
delay(TEMPO_AZUL_PEDESTRE);
Serial.println(">> Sinal Pedestre: AZUL Desligado (Travessia Encerrada)");
digitalWrite(LED_AZUL_PEDESTRE, LOW);
Serial.println("Ciclo de Pedestre Concluído.");
pedestre_solicitou = 0; // Reseta a flag após atender a solicitação
} else {
Serial.println("Nenhuma solicitação de Pedestre. Finalizando ciclo veicular.");
// Se não houve solicitação de pedestre, o LED vermelho veicular ainda estava aceso
// e precisa ser desligado agora.
digitalWrite(LED_VERMELHO_VEICULO, LOW);
}
// Desliga todos os LEDs restantes no final do ciclo geral, caso algum tenha ficado aceso
// (Isso é uma redundância para garantir que tudo esteja desligado antes de esperar um novo acionamento)
digitalWrite(LED_VERDE_VEICULO, LOW);
digitalWrite(LED_AMARELO_VEICULO, LOW);
digitalWrite(LED_AZUL_PEDESTRE, LOW);
Serial.println("Ciclo Geral Concluído.");
// Pequena pausa para evitar múltiplos acionamentos muito rápidos do botão veicular
// (Este é um substituto rudimentar para o debounce aqui)
delay(50);
}
// Pequeno delay no loop para evitar que o ESP32 leia os botões incessantemente
// e liberar um pouco de processamento para outras coisas.
delay(10);
}