#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Criação do objeto do display LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
//definiçao
#define CAR_VERDE 17
#define CAR_AMARELO 18
#define CAR_VERMELHO 19
#define PED_VERDE 5
#define PED_VERMELHO 4
#define BOTAO 16
#define BUZZER 15
#define LDR 33
#define POT 26
#define T_AMARELO 3000
#define T_VERMELHO 1000
#define TRIGGER 22
#define ECHO 23
//variaveis
unsigned long T_Atual;
unsigned long Tempo = 0; // tempo começo
int modo = 0; // modos do sinal (inicia no 0)
int i;// contagem de acionamentos do botão
//variáveis o modo 3
unsigned long T_Modo_3 = 4000; // 40 segundos fixos para atravessar
//const unsigned int T_Modo_2= 60000; // 60 segundos fixos para carros pararem
//unsigned long iniciomodo2= 0
unsigned long iniciomodo3 = 0; //momento que o modo 3 inicia
unsigned long ultimosom = 0; //tempo do beep para fazer ficar rapido
unsigned long tpulso = 0;
bool buzzerligado = false; //modo do buzzer pra ajudar
bool iniciou0 = false;
bool iniciou1 = false;
bool iniciou2 = false;
int leituraLDR;
int brilho;
void setup()
{
Serial.begin(115200);
Serial.println("Aperte o botão para atravessar!");
//------------------------- PINOS -------------------------
pinMode(CAR_VERMELHO, OUTPUT);
pinMode(CAR_AMARELO, OUTPUT);
pinMode(CAR_VERDE, OUTPUT);
pinMode(PED_VERMELHO, OUTPUT);
pinMode(PED_VERDE, OUTPUT);
pinMode(BOTAO, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
pinMode(LDR, INPUT);
pinMode(TRIGGER, OUTPUT);
pinMode(ECHO, INPUT);
/*
int leituraLDR = analogRead(LDR); //leitura do LDR
int brilho = map(leituraLDR, 32, 4095, 50, 255); //ajuste para a leitura do brilho
analogWrite(CAR_VERDE, brilho); //carro verde ligado
analogWrite(CAR_AMARELO, 0); //carro amarelo desligado
analogWrite(CAR_VERMELHO, 0); // carro vermelho desligado
analogWrite(PED_VERMELHO, brilho); //pedestre vermelho ligado
analogWrite(PED_VERDE, 0); //pedestre vermelho desligado
*/
lcd.init();
lcd.backlight();
}
void loop()
{
float d;
float tchegada;
static int passoupelosinal = 0;
static int passoupelosinall = 0;
//variaveis do ultrassonico
digitalWrite(22,1); // Pulso trigger
delay(10); // delay pra funcionar melhor
//int botao = digitalRead(BOTAO); //leitura do botao
//Serial.println(botao);
// -------------------- LDR ------------------
leituraLDR = analogRead(LDR); //leitura do LDR
brilho = map(leituraLDR, 32, 4095, 50, 255); //ajuste para a leitura do brilho
// -------------------- MODO 0 (DEFAULT) --------------------
//carros verde -- pedestres vermelho
if (modo == 0) //se estiver no modo 0
{ if (!iniciou0) {
analogWrite(CAR_VERDE, brilho); //carro verde ligado
analogWrite(CAR_AMARELO, 0); //carro amarelo desligado
analogWrite(CAR_VERMELHO, 0); // carro vermelho desligado
analogWrite(PED_VERMELHO, brilho); //pedestre vermelho ligado
analogWrite(PED_VERDE, 0); //pedestre vermelho desligad
Serial.println("Iniciando");
iniciou0 = true;
}
//---------------botao----------------
if (!digitalRead(BOTAO)) //leitura do botao
{
iniciou0 = false;
T_Atual = millis();
Tempo = T_Atual; //ajusta momento certo de acionamento
tone(BUZZER, 800, 100); //buzzer solta o beep sinalizando que o botao foi acionado
i++; //contagem de acionamento do botao
Serial.println("Botão acionado " + String(i) + " vezes"); //mostra acionamentos
modo = 1; //sinal vai para o modo 1
lcd.setCursor(0,0);
lcd.print("Aguarde");
}
}
// -------------------- MODO 1 --------------------
// começa a contar 60s para o sinal de carros ficar amarelo
if (modo == 1) //inicia modo 1
{
T_Atual = millis();
//Serial.println("inicio modo 1");
//Serial.print(T_Atual - Tempo);
if (T_Atual - Tempo > T_AMARELO) //tempo para o sinal de carros ficar amarelo
{
Tempo = T_Atual; //ajuste de tempo
modo = 2; //quando tempo acabar vai para o modo 2
}
}
// -------------------- MODO 2 --------------------
// carros amarelo ligado -- pedestre vermelho ligado -- resto desligado
if (modo == 2) //inicia modo 2
{
T_Atual = millis();
//Serial.println("inicio modo 2");
if (!iniciou1) {
analogWrite(CAR_VERDE, 0); //deslida verde de carros
analogWrite(CAR_AMARELO, brilho); //liga amarelo de carros
iniciou1 = true;
}
//tone(BUZZER, 800, 100);
//contagem de tempo para o sinal de carros ficar vermelho
if (T_Atual - Tempo > T_VERMELHO)
{
Tempo = T_Atual; //ajuste de tempo
// Inicia contagem de tempo do modo 3
iniciomodo3 = T_Atual; //ajusta tempo certo para o modo 3
ultimosom = T_Atual; //ajusta tempo para os beeps do buzzer
buzzerligado = false; //estado atual do buzzer
iniciou1 = false;
//Serial.println("inicio modo 3: 60s restantes");
modo = 3; // inicia modo 3
}
}
// -------------------- MODO 3 --------------------
//carros vermelho ligado -- pedestre verde ligado -- resto desligado
if (modo == 3)
{
T_Atual = millis();
//Serial.println("inicio modo 3");
if (!iniciou2) {
analogWrite(CAR_VERDE, 0); //carros verde desligado
analogWrite(CAR_AMARELO, 0); //carros amarelo desligado
analogWrite(CAR_VERMELHO, brilho); //carros vermelho ligado
analogWrite(PED_VERDE, brilho); //pedestre verde ligado
analogWrite(PED_VERMELHO, 0); //pedestre vermelho desligado
iniciou2 = true;
// Mostra mensagem no LCD quando o pedestre pode avançar
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Avance");
}
//Sensor Ultrassonico
if (micros() - tpulso >= 10) { // 10 microssegundos
tpulso = micros();
digitalWrite(22, 0);
}
digitalWrite(TRIGGER, 1);
delayMicroseconds(10);
digitalWrite(TRIGGER, 0);
tchegada = pulseIn(23, 1); // Mede tempo do eco
d = (340.0 / 2) * (tchegada / 1000000.0); // Calcula distância
if (passoupelosinal == 0 && (d <2.01 )){
passoupelosinal = 1;
passoupelosinall++;// usado pra soma da multa não ficar em loop
Serial.println("passou pelo sinal:" + String(passoupelosinall));
}
if (d > 2.1) { // distância voltou a ser maior
passoupelosinal = 0; // libera pra detectar de novo
}
T_Modo_3 = map(analogRead(POT), 32, 4095, 6000, 1000); // altera o tempo do sinal de pedestres a depender da resistencia do potenciometro
// ----------------- Lógica dos beeps progressivos -----------------
unsigned long T_Total = T_Atual - iniciomodo3; //variavel do tempo que passou desde o inicio do modo 3
//tempo atual do loop - momento modo 3 iniciou = tempo total desde modo 3 iniciou
// calcula tempo restante de modo 3
unsigned long T_Resto; //variavel de tempo restante
if (T_Total < T_Modo_3) //se tempo total for menor que modo 3 inteiro
{
T_Resto = T_Modo_3 - T_Total; //calcula tempo restante ate acabar modo 3
}
//se ja passou modo 3 entao tempo restante é zero
else
{
T_Resto = 0;
}
//ajuste de intervalo entre os beeps
// ajusta intervalo do beep (800 ms início vai pra 150 ms final)
unsigned long intersom = map(T_Resto, T_Modo_3, 0, 800, 150); //ajusta valores de beep
//se o tempo que resta for igual ao tempo do modo 3 o intervaldo vai ser de 800(mais lento)
//se o tempo que resta for igual a 0 o tempo do beep vai ser igual a 150 (mais rapido)
// verificaçao para saber se passou o intervalo desde o ultimo beep
if (!buzzerligado && T_Atual - ultimosom >= intersom)
{
tone(BUZZER, 1000); // beep curto
buzzerligado = true; //estado do buzzer ligado
ultimosom = T_Atual; //momemto do beep
}
// Desliga o beep depois de 50 ms para criar beep curto
if (buzzerligado && T_Atual - ultimosom >= 50)
{
noTone(BUZZER); //nao tem som buzzer desligado
buzzerligado = false; //estado do buzzer desligado
}
// Sai do modo 3 depois que o tempo todo acaba
if (T_Total >= T_Modo_3)
{
iniciou2 = false;
modo = 0; //volta para o modo 0
noTone(BUZZER); // desliga buzzer de novo (so parou quando coloquei isso)
buzzerligado = false; //estado do buzzer desligado
}
}
}