#include <LiquidCrystal_I2C.h> //biblioteca LCD
unsigned long t=0; //auxilia na contagem de tempo
int modo =0; //modos do sinal
bool ligado=false; //sistema ativado/desativado
int i; //contagem de acionamentos do botão
int brilho = 150; // valor inicial medio
//LCD
LiquidCrystal_I2C lcd(0x27,16,2); //criação de um objeto para controle do lcd (endereço 0x27), com 16 colunas e 2 linhas
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
// ✅ USANDO PINOS PWM CONFIÁVEIS DO ESP32
pinMode(2, OUTPUT); //led vermelho carros (era 19)
pinMode(4, OUTPUT); //led amarelo carros (era 18)
pinMode(5, OUTPUT); //led verde carros (era 17)
pinMode(23, OUTPUT); //led vermelho pedestre
pinMode(22, OUTPUT); //led verde pedestre
pinMode(16, INPUT_PULLUP); //leitura do botao
pinMode(21, OUTPUT); //buzzer
pinMode(15, OUTPUT); //flash para multa
pinMode(34, INPUT); //potenciometro
pinMode(33, INPUT); //LDR
pinMode(14, OUTPUT); //trigger sensor
pinMode(12, INPUT); //echo sensor
// ✅ INICIALIZAÇÃO CORRIGIDA
digitalWrite(5, HIGH); //verde carros ligado (início)
digitalWrite(23, HIGH); //vermelho pedestre ligado
digitalWrite(22, LOW); //verde pedestre desligado
digitalWrite(15, LOW); //flash desligado
digitalWrite(21, LOW); //buzzer desligado
Serial.println("Sistema iniciado - LDR ativo");
Serial.println("LEDs: Verde=5, Amarelo=4, Vermelho=2");
}
void loop() {
unsigned long rep = millis();
int ldr = analogRead(33);
int botao = digitalRead(16);
// ✅ CÁLCULO CORRETO DO BRILHO COM DEBUG
brilho = map(ldr, 0, 4095, 80, 255);
brilho = constrain(brilho, 80, 255);
// ✅ DEBUG DO LDR - mostra valores para diagnosticar
static unsigned long lastDebug = 0;
if (millis() - lastDebug > 1000) {
Serial.print("LDR: ");
Serial.print(ldr);
Serial.print(" | Brilho: ");
Serial.print(brilho);
Serial.print(" | Modo: ");
Serial.println(modo);
lastDebug = millis();
}
delay(10);
// ✅ BOTÃO ACIONADO
if (!ligado && botao == 0) {
ligado = true;
t = rep;
modo = 0;
tone(21, 800, 150); // ✅ BUZZER CORRIGIDO
i++;
Serial.println("Botão acionado " + String(i) + " vezes");
}
// ✅ CONTROLE DE MODOS CORRIGIDO
if (ligado) {
// MODO 0 -> 1: Verde para Amarelo (carros)
if (modo == 0 && rep - t >= 3000) {
digitalWrite(5, LOW); // DESLIGA verde carros
analogWrite(4, brilho); // LIGA amarelo carros com brilho
digitalWrite(23, HIGH); // MANTÉM vermelho pedestre
digitalWrite(22, LOW); // MANTÉM verde pedestre desligado
t = rep;
modo = 1;
tone(21, 800, 150);
Serial.println("Modo 1: Amarelo carros");
}
// MODO 1 -> 2: Amarelo para Vermelho (carros), Verde (pedestre)
else if (modo == 1 && rep - t >= 2000) {
digitalWrite(4, LOW); // DESLIGA amarelo carros
analogWrite(2, brilho); // LIGA vermelho carros com brilho
digitalWrite(23, LOW); // DESLIGA vermelho pedestre
analogWrite(22, brilho); // LIGA verde pedestre com brilho
t = rep;
modo = 2;
Serial.println("Modo 2: Vermelho carros, Verde pedestre");
}
// MODO 2: Pedestre atravessando (6 segundos)
else if (modo == 2) {
int tresto = 6000 - (rep - t);
int intervalo = 400 + (tresto / 10);
// ✅ BUZZER PARA PEDESTRE CORRIGIDO
if ((rep - t) % intervalo < 50) {
tone(21, 600, 50);
}
// Ir para modo 3
if (rep - t >= 6000) {
t = rep;
modo = 3;
Serial.println("Modo 3: Finalizando");
}
}
// MODO 3 -> 0: Voltar ao normal
else if (modo == 3 && rep - t >= 1000) {
digitalWrite(2, LOW); // DESLIGA vermelho carros
digitalWrite(22, LOW); // DESLIGA verde pedestre
analogWrite(5, brilho); // LIGA verde carros com brilho
analogWrite(23, brilho); // LIGA vermelho pedestre com brilho
ligado = false;
t = rep;
modo = 0;
Serial.println("Voltou ao modo normal");
}
}
// ✅ ATUALIZA BRILHO DOS LEDS ATIVOS CONTINUAMENTE
if (!ligado) {
// Modo normal: verde carros, vermelho pedestre
analogWrite(5, brilho); // verde carros
analogWrite(23, brilho); // vermelho pedestre
} else {
// Durante semáforo ativo, atualiza LEDs conforme modo atual
if (modo == 1) {
analogWrite(4, brilho); // amarelo carros
} else if (modo == 2) {
analogWrite(2, brilho); // vermelho carros
analogWrite(22, brilho); // verde pedestre
}
}
}