#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C visor(0x27, 20, 4);
int estadoAtual = 0; // variavel para pode muda de condição apos o aperto do botão
bool estadoAnteriorBotao = LOW;
unsigned long tempoAnterior = 0;
unsigned long inicioCondicao2 = 0;
const unsigned long duracaoCondicao2 = 5000;
int Verde, Amarelo, Vermelho, tempoSinal; // variavel do tempo do sinal
int x = 0; // variavel do tempo
int y = 0; // fase do semafaro
int tmudo = 0; // Armazena o último tempo de bip
//MULTAS
float rsonico; // é o retorno do som "ECHO" do ultra
int multas; // variavel das multas
int unsigned long tmulta=20000; //basicamente é a distancia/tempo de ida e volta em milisegundos do...
//... sensor ate uma altura de aproximadamente 3,7 metros
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
pinMode(18, INPUT_PULLUP); // Botão
pinMode(5, OUTPUT); // Verde carro
pinMode(17, OUTPUT); // Amarelo carro
pinMode(16, OUTPUT); // Vermelho carro
pinMode(2, OUTPUT); // Verde pedestre
pinMode(15, OUTPUT); // Vermelho pedestre
pinMode(25, INPUT); // Potenciômetro
pinMode(14, OUTPUT); // Buzina
pinMode(33, OUTPUT); //pino de trigger do sensor ultrassônico
pinMode(32, INPUT); //Pino de Echo do sensor ultrassônico
pinMode(26,OUTPUT); // Flash Camera
visor.init(); //inicio do visor
visor.backlight(); // acendo a luz de fundo do visor
visor.setCursor(0, 0); // posicionando o curso para (0,0)
visor.print("bem vindo!");
}
void loop() {
delay(1); // Pequeno delay para estabilidade
bool estadoAtualBotao = !digitalRead(18);
// Verifica botão
if (estadoAtual == 0 && estadoAtualBotao && estadoAnteriorBotao == LOW) {
estadoAtual = 1;
inicioCondicao2 = millis();
tempoAnterior = millis();
y = 0;
Verde = map(analogRead(25), 0, 4095, 10000, 60000); // 10 a 60 segundos
Vermelho = map(analogRead(25), 0, 4095, 40000, 10000); // 40 a 10 segundos
Amarelo = 2500; // 2,5 segundos
x = Verde / 1000; // inicia o contador de segundos
}
estadoAnteriorBotao = estadoAtualBotao;
if (estadoAtual == 0) { // antes de aperta o botão
digitalWrite(5, HIGH); // Verde carro
digitalWrite(15, HIGH); // Vermelho pedestre
digitalWrite(16, LOW); // Vermelho carro
digitalWrite(17, LOW); // Amarelo carro
digitalWrite(2, LOW); // Verde pedestre
visor.setCursor(0, 0);
visor.print("Nao Atravessar!!! ");
visor.setCursor(0,1);
visor.print("Aguarde o S.Vermelho");
delay(100);
}
else if (estadoAtual == 1) {
unsigned long agora = millis();
if ( y == 0) { // semafaro Verde
digitalWrite(5, HIGH); // Verde carro
digitalWrite(15, HIGH); // Vermelho pedestre
digitalWrite(16, LOW); // Vermelho carro
digitalWrite(17, LOW); // Amarelo carro
digitalWrite(2, LOW); // Verde pedestre
if (agora - tempoAnterior >= 1000) { // condição para o visor contabilizar o tempo
tempoAnterior = agora;
visor.clear();
visor.setCursor(0, 0);
visor.print("Aguarde...");
visor.setCursor(0, 1);
visor.print("Tempo: " + String(x) + "s");
x--;
if (x <= 0) { // condição para o semafaro mudar de fase, enquanto não muda fica preso na semafaro verde.
y = 1;
x = Amarelo / 1000;
}
}
}
else if (y == 1) { // semafaro Amarelo
digitalWrite(5, LOW); // Verde carro
digitalWrite(15, HIGH); // Vermelho pedestre
digitalWrite(16, LOW); // Vermelho carro
digitalWrite(17, HIGH); // Amarelo carro
digitalWrite(2, LOW); // Verde pedestre
if (agora - tempoAnterior >= 1000) { // condição para o visor contabilizar o tempo
tempoAnterior = agora;
visor.clear();
visor.setCursor(0, 0);
visor.print("Atencao...");
visor.setCursor(0, 1);
visor.print("Tempo: " + String(x) + "s");
x--;
if (x <= 0) { // condição para o semafaro mudar de fase, enquanto não muda fica preso na semafaro amarelo.
y = 2;
x = Vermelho / 1000;
}
}
}
else if (y == 2) { // semafaro vermelho
digitalWrite(5, LOW); // Verde carro
digitalWrite(15, LOW); // Vermelho pedestre
digitalWrite(16, HIGH); // Vermelho carro
digitalWrite(17, LOW); // Amarelo carro
digitalWrite(2, HIGH); // Verde pedestre
if (agora - tempoAnterior >= 1000 ) { // condição para o visor contabilizar o tempo
tempoAnterior = agora;
visor.clear();
visor.setCursor(0, 0);
visor.print("Atravessar");
visor.setCursor(0, 1);
visor.print("Tempo: " + String(x) + "s");
x--;
int buzina = map(x, 0, Vermelho / 1000, 10, 2000); // bipa entre 10 e 2000 millis segundo dependo do tempo.
if (agora - tmudo >= buzina) { // olha o tempo do proximo bip
tmudo = agora;
tone(14, 500, 200); // buzina a cada 200 millis segundos
}
if (x <= 0) {// condição para o semafaro mudar de fase, enquanto não muda fica preso na semafaro vermelho.
estadoAtual = 0; // Volta para o estado inicial
visor.clear();
noTone(14);
}
visor.setCursor (0,2);
visor.print ("Multas Hoje= " + String(multas));
}
digitalWrite(33,LOW); // Comando do sensor ultrasonico para fazer a rotina de multas desligando o ultra
delay(500); // adiciona um delay pra colocar realismo pro codigo pra nao multar muito rapido
digitalWrite(33, HIGH);// Comando do sensor ultrasonico para fazer a rotina de multas ligando e o trigger do ultra(basicamente enviando as ondas sonoras)
delay(500); // adiciona um delay pra colocar realismo pro codigo pra nao multar muito rapido
digitalWrite(33,LOW);// Comando do sensor ultrasonico para fazer a rotina de multas desligando o ultra
rsonico=pulseIn(32,HIGH); // basicamente é o retorno da onda sonora
if(rsonico > 0 && rsonico < tmulta){ // logica para ver se houve avanco do sinal vermelho
multas++; // Adiciona +1 nas multas quando detecta avanco do sinal vermelho
digitalWrite(26, HIGH); //Logica do pisca quando avanca o sinal(aqui acende o led)
delay(200); // delay para nao piscar muito rapido realmente simulando um flash
digitalWrite(26,LOW);// logica do pisca quando avanca o sinal(aqui apaga o led)
}
}
}
}