//variaveis
unsigned long t= 0;// tempo começo
int modo= 0;// modos do sinal (inicia no 0)
int i;// contagem de acionamentos do botão
//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
//variáveis o modo 3
const unsigned long tmodo3= 40000; // 40 segundos fixos para atravessar
//const unsigned int tmodo2= 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
bool buzzerligado= false; //modo do buzzer pra ajudar
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);
}
void loop()
{
delay(5); // delay pra funcionar melhor
unsigned long tatual= millis(); //tempo inia do começo
int botao= digitalRead(BOTAO); //leitura do botao
// -------------------- LDR ------------------
int leituraLDR= analogRead(LDR); //leitura do LDR
int brilho= map(leituraLDR, 32, 4095, 50, 255); //ajuste para a leitura do brilho
// -------------------- MODO 0 --------------------
//carros verde -- pedestres vermelho
if (modo == 0) //se estiver no modo 0
{
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
//---------------botao----------------
if (botao == LOW) //leitura do botao
{
t= tatual; //ajusta momento certo de acionamento
modo= 1; //sinal vai para o modo 1
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 --------------------
// começa a contar 60s para o sinal de carros ficar amarelo
if (modo == 1) //inicia modo 1
{
if (tatual - t > 3000) //tempo para o sinal de carros ficar amarelo
{
t= tatual; //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
{
analogWrite(CAR_VERDE, 0); //deslida verde de carros
analogWrite(CAR_AMARELO, brilho); //liga amarelo de carros
//tone(BUZZER, 800, 100);
//contagem de tempo para o sinal de carros ficar vermelho
if (tatual - t > 1000)
{
t= tatual; //ajuste de tempo
modo= 3;// inicia modo 3
// Inicia contagem de tempo do modo 3
iniciomodo3= tatual; //ajusta tempo certo para o modo 3
ultimosom= tatual; //ajusta tempo para os beeps do buzzer
buzzerligado = false; //estado atual do buzzer
//Serial.println("inicio modo 3: 60s restantes");
}
}
// -------------------- MODO 3 --------------------
//carros vermelho ligado -- pedestre verde ligado -- resto desligado
if (modo == 3)
{
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
// ----------------- Lógica dos beeps progressivos -----------------
unsigned long ttotal= tatual - 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 tresto; //variavel de tempo restante
if (ttotal < tmodo3) //se tempo total for menor que modo 3 inteiro
{
tresto= tmodo3 - ttotal; //calcula tempo restante ate acabar modo 3
}
else
{
tresto= 0; //se ja passou modo 3 entao tempo restante é zero
}
//ajuste de intervalo entre os beeps
// ajusta intervalo do beep (800 ms início vai pra 150 ms final)
unsigned long intersom= map(tresto, tmodo3, 0, 800, 150); //ajuusta 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 && tatual - ultimosom >= intersom)
{
tone(BUZZER, 1000); // beep curto
buzzerligado= true; //estado do buzzer ligado
ultimosom= tatual; //momemto do beep
}
// Desliga o beep depois de 10 ms para criar beep curto
if (buzzerligado && tatual - ultimosom >= 10)
{
noTone(BUZZER); //nao tem som buzzer desligado
buzzerligado = false; //estado do buzzer desligado
}
// Sai do modo 3 depois que o tempo todo acaba
if (ttotal >= tmodo3)
{
modo= 0; //volta para o modo 0
noTone(BUZZER); // desliga buzzer de novo (so parou quando coloquei isso)
buzzerligado= false; //estado do buzzer desligado
}
//tentando buzzer de novo
//int tresto = modo3-(tatual - tempo);
//int intervalo =
//if(modo==3)
//{
//buzzerligado=true;
//}
}
}