// Definição das variáveis.
static long a;
static long a2;
static long v2;
static long amarelo ;
static unsigned long rep;
static bool habilitapisca = true ;
static bool qualquercoisa = false;
static int modo = 0;
static int vermelho = 0;
static unsigned long rep2;
static unsigned long rep3;
static int ap=0;
static int sombuzzer=0;
long ttrg;
float teco;
float dist=1;
unsigned long rep4;
float carro;
int multa;
long lux=0;
unsigned long piscamulta;
bool luzmulta = true;
#include <LiquidCrystal_I2C.h> // Biblioteca para usar o LCD.
LiquidCrystal_I2C lcd(0x27,16,2); // Configuração do LCD.
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
// Definição dos pinos.
pinMode(4, OUTPUT);
pinMode(19, OUTPUT);
pinMode(18, OUTPUT);
pinMode(27, OUTPUT);
pinMode(26,OUTPUT);
pinMode(5, OUTPUT);
pinMode(23,INPUT_PULLUP);
pinMode(33, INPUT);
pinMode(17,OUTPUT);
pinMode(16, INPUT);
pinMode(25,OUTPUT);
pinMode(13,INPUT);
attachInterrupt(digitalPinToInterrupt(23), botao,FALLING); //Inicia o void botao.
lcd.init(); //inicia o display.
lcd.backlight(); //liga a luz de fundo.
comeco(); //Inicia o void começo.
}
//funcao que atualiza o display para o estado inicial
void comeco()
{
lcd.clear();
lcd.setCursor(0,0); //posiciona o cursor para o inicio do display (coluna 0 e linha 0)
lcd.print("aperte o botao"); //Exibe a mensagem "Aperte o botao" no LCD.
lcd.setCursor(0,1); //Muda o cursor.
lcd.print("para iniciar"); //Exibe a mensagem "para iniciar" no LCD.
}
void loop() {
delay(10);
int potencia = analogRead(33);//Ta definindo o valor do potenciometro.
if (lux != analogRead(13)){ //Logica do LDR nos LED'S.
if(modo==0){//LED'S no sinal verde antes de apertar o botao. (modo 0)
//
lux=analogRead(13);
analogWrite(19,lux);
analogWrite(18,0);
analogWrite(4,0);
analogWrite(27,lux);
analogWrite(26,0);
}
if(modo==1){//LED'S após o aperto do botão. (modo 1)
if(millis()-rep>=a ){ //
lux=analogRead(13);
analogWrite(19,0);
analogWrite(18,lux);
analogWrite(4,0);
}
}
if(modo==2){
lux=analogRead(13);
analogWrite(18,0);
analogWrite(4,lux);
analogWrite(27,0);
analogWrite(26,lux);
}
if (dist <= 0) {
if (!luzmulta) {
luzmulta = !luzmulta;
piscamulta = millis();
analogWrite(25, lux);
}
}
if (luzmulta && (millis() - piscamulta >= 300)) {
analogWrite(25, 0);
luzmulta = !luzmulta;
}
}
if(habilitapisca == false){//Quando o botao é acionado.
if(!qualquercoisa){//Define as váriaveis de tempo.
if (potencia <= 409) a = random(10000,15501);//Definição do tempo do LED verde.
else if (potencia <= 818) a = random(15500,21001);
else if (potencia <= 1227) a = random(21000,26501);
else if (potencia <= 1636) a = random(26500,32001);
else if (potencia <= 2045) a = random(32000,37501);
else if (potencia <= 2454) a = random(37500,43001);
else if (potencia <= 2863) a = random(43000,48501);
else if (potencia <= 3272) a = random(48500,54001);
else a = random(54000,60001);
if (potencia <= 409) vermelho = random(36670,40001);//Definição do tempo do LED vermelho.
else if (potencia <= 818) vermelho = random(33340,36680);
else if (potencia <= 1227) vermelho = random(30010,33350);
else if (potencia <= 2863) vermelho = random(26680,30020);
else if (potencia <= 3272) vermelho = random(23350,26690);
else if (potencia <= 3681) vermelho = random(20020,23360);
else if (potencia <= 2863) vermelho = random(16690,20030);
else if (potencia <= 3272) vermelho = random(13360,17000);
else vermelho = random(10000,13370);
a2= a/1000;//tempo do LED verde em segundos.
v2=vermelho/1000;//tempo do LED vermelho em segundos.
rep=millis();//Define o tempo que passou.
qualquercoisa = true;//ele desliga o if(!qualquercoisa).
amarelo = a+3000;//Define o tempo do LED amarelo para ele ir para o LED vermelho.
}
if (modo==1){//Logica do código.
if(millis()-rep>=a ){//tempo do verde ligado.
lux=0;//Altera a cor do LED para o amarelo.
}
if(millis()-rep4 >= 1000){//Lógica do LCD.
rep4 = millis();
a2--;//Diminui o tempo a cada 1 segundo.
lcd.clear();
lcd.setCursor(0,0);
lcd.print("falta " + String(a2+4) + " segundos ");//Parte escrita que aparece no LCD.
}
if(millis()- rep3 >= amarelo ){
modo++;
lux=0;
Serial.print("falta " + String(v2)+ " segundos");
rep3=millis();
rep2=millis();
}
}
if(modo == 2){//inicia a lógica quando está vermelho.
if(millis()-rep4 >= 1000){//Faz o modo 2 rodar a cada 1 segundo.
rep4 = millis();
v2--;// Diminui o tempo dos segundos restantes no LCD.
lcd.clear();
lcd.setCursor(0,0);
lcd.print("falta " + String(v2) + " segundos ");
if(sombuzzer==0){
tone(5,500,1000);
sombuzzer=1;
}
if(sombuzzer==1){
tone(5,100,1000);
sombuzzer=0;
}
carro=random(2,400);
if (luzmulta && (millis() - piscamulta >= 300)) {
lux=0;
}
digitalWrite(17, HIGH);
if(millis()-rep>=10){
rep=millis();
digitalWrite(17, LOW);
}
teco = pulseIn(16, HIGH, 30000); // timeout 30ms
dist = ((340*teco)/(2*10000)) - carro;
if(dist <= 0){
multa++;
lux=0;
lcd.setCursor(0,1);
lcd.print("multas " + String(multa));
}
}
// Volta para modo 0 depois do tempo de vermelho
if(millis()-rep2 >= vermelho){
modo=0;
ap=0;
lux=0;
lcd.clear();
noTone(5);
dist=1;
}
}
}
}
void botao()//Lógica do botão.
{
static unsigned long tempo1 = 0;
unsigned long tempo2 = millis();
if (tempo2-tempo1 >=300 && ap==0){
tempo1=tempo2;
habilitapisca= false;//roda o habilitapisca.
tone(5,1000,200);//solta o som por 200ms.
qualquercoisa=false;//Faz o qualquercoisa rodar.
modo=1;//troca o modo para o modo 1.
ap=1;//garante que não haja mais apertos.
multa=0;//zera o número de multas.
rep3=millis();
}
}