#define LED_CARRO_VERDE 17
#define LED_CARRO_AMARELO 18
#define LED_CARRO_VERMELHO 19
#define LED_PEO_VERDE 4 // pino seguro para analogWrite no Wokwi
#define LED_PEO_VERMELHO 5 // pino seguro para analogWrite no Wokwi
#define BOTAO 16
#define BUZZER 15
#define LDR 33
int estado = 0;
unsigned long tempoInicio = 0;
const unsigned long TEMPO_AGUARDAR = 60000UL;
const unsigned long TEMPO_ABERTO = 40000UL;
bool botaoPressionado = false;
bool solicitacaoAtiva = false;
int brilho = 255;
int ultimoBrilho = -1;
void setup() {
pinMode(LED_CARRO_VERDE, OUTPUT);
pinMode(LED_CARRO_AMARELO, OUTPUT);
pinMode(LED_CARRO_VERMELHO, OUTPUT);
pinMode(LED_PEO_VERDE, OUTPUT);
pinMode(LED_PEO_VERMELHO, OUTPUT);
pinMode(BOTAO, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
pinMode(LDR, INPUT);
}
void loop() {
delay(10);
static unsigned long ultimoDebounce = 0;
static unsigned long ultimaLeituraLDR = 0;
static unsigned long ultimoBip = 0;
unsigned long agora = millis();
// --- LDR a cada 100ms ---
if (agora - ultimaLeituraLDR > 100) {
int leituraLDR = analogRead(LDR);
int novoBrilho = map(leituraLDR, 100, 4095, 50, 255);
if (abs(novoBrilho - ultimoBrilho) > 3) { // só atualiza se mudança significativa
brilho = novoBrilho;
ultimoBrilho = brilho;
}
ultimaLeituraLDR = agora;
}
unsigned long tempoDecorrido = agora - tempoInicio;
// ------------------- ESTADO 0 -------------------
if (estado == 0) {
analogWrite(LED_CARRO_VERDE, brilho);
analogWrite(LED_CARRO_AMARELO, 0);
analogWrite(LED_CARRO_VERMELHO, 0);
analogWrite(LED_PEO_VERDE, 0);
analogWrite(LED_PEO_VERMELHO, brilho);
}
// ------------------- ESTADO 1 -------------------
if (estado == 1) {
if (tempoDecorrido < TEMPO_AGUARDAR - 5000UL) {
analogWrite(LED_CARRO_VERDE, brilho);
analogWrite(LED_CARRO_AMARELO, 0);
} else {
analogWrite(LED_CARRO_VERDE, 0);
analogWrite(LED_CARRO_AMARELO, brilho);
}
analogWrite(LED_CARRO_VERMELHO, 0);
analogWrite(LED_PEO_VERDE, 0);
analogWrite(LED_PEO_VERMELHO, brilho);
if (tempoDecorrido >= TEMPO_AGUARDAR) {
estado = 2;
tempoInicio = agora;
ultimoBip = agora;
}
}
// ------------------- ESTADO 2 -------------------
if (estado == 2) {
analogWrite(LED_CARRO_VERDE, 0);
analogWrite(LED_CARRO_AMARELO, 0);
analogWrite(LED_CARRO_VERMELHO, brilho);
analogWrite(LED_PEO_VERDE, brilho);
analogWrite(LED_PEO_VERMELHO, 0);
// Buzzer a cada 1s com frequência variável
if (agora - ultimoBip > 1000UL) {
unsigned long tempoRestante = TEMPO_ABERTO - (agora - tempoInicio);
int freq = map(tempoRestante, 0, TEMPO_ABERTO, 1000, 2000);
tone(BUZZER, freq, 200);
ultimoBip = agora;
}
if (tempoDecorrido >= TEMPO_ABERTO) {
estado = 0;
solicitacaoAtiva = false;
}
}
// ------------------- BOTÃO -------------------
if (digitalRead(BOTAO) == LOW && agora - ultimoDebounce > 200UL && !botaoPressionado && !solicitacaoAtiva && estado == 0) {
botaoPressionado = true;
solicitacaoAtiva = true;
estado = 1;
tempoInicio = agora;
ultimoDebounce = agora;
}
if (digitalRead(BOTAO) == HIGH) botaoPressionado = false;
}