#include <Wire.h> // Biblioteca para comunicação I2C
#include <LiquidCrystal_I2C.h> // Biblioteca para controle do LCD 16x2 via I2C
// Definição dos pinos
const int pinVerde = 2;
const int pinAmarelo = 0;
const int pinVermelho = 4;
const int botao_pedestre_pin = 5;
const int buzzer_pin = 15;
const int sensorCarro_pin = 10; // Pino do sensor de detecção de carro
const int luzVermelha_pedestre_pin = 26; // Pino da luz vermelha do pedestre
const int luzVerde_pedestre_pin = 27; // Pino da luz verde do pedestre
bool abrindo=false;
// variaveis do sensor
#define PIN_TRIG 34
#define PIN_ECHO 35
// variaveis do sensor do semaforo vermelho
boolean sensorDeCarro = 0 ;
// Definição dos tempos de cada estado (em milissegundos)
const unsigned long tempoVerde = 10000; // 10 segundos
const unsigned long tempoAmarelo = 3000; // 3 segundos
const unsigned long tempoVermelho = 5000; // 5 segundos
// Variáveis globais
unsigned long tempoInicio;
int estadoAtual = 0; // 0: verde, 1: amarelo, 2: vermelho
unsigned long tempoRestanteVermelho = tempoVermelho; // Inicializar o tempo restante como tempoVermelho
bool pedestrePressionado = false; // Flag para indicar se o botão do pedestre foi pressionado
// Inicialização do LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Endereço I2C 0x27, 16 colunas e 2 linhas
void setup() {
pinMode(pinVerde, OUTPUT);
pinMode(pinAmarelo, OUTPUT);
pinMode(pinVermelho, OUTPUT);
pinMode(botao_pedestre_pin, INPUT);
pinMode(buzzer_pin, OUTPUT);
pinMode(sensorCarro_pin, INPUT);
pinMode(luzVermelha_pedestre_pin, OUTPUT);
pinMode(luzVerde_pedestre_pin, OUTPUT);
// Inicialização do LCD
lcd.init();
lcd.backlight();
// Inicia o semáforo com o estado inicial
if (!abrindo) mudarEstado(estadoAtual);
}
// Alteração na função loop() para corrigir a exibição do tempo restante no LCD
void loop() {
// Verifica se o tempo de cada estado expirou e avança para o próximo estado
if (millis() - tempoInicio >= tempoVerde && estadoAtual == 0) {
if (!abrindo) mudarEstado(estadoAtual);
} else if (millis() - tempoInicio >= tempoAmarelo && estadoAtual == 1) {
if (!abrindo) mudarEstado(estadoAtual);
} else if (millis() - tempoInicio >= tempoRestanteVermelho && estadoAtual == 2) {
if (!pedestrePressionado && digitalRead(sensorCarro_pin) == HIGH) {
// Verifica se há carro quando o semáforo está vermelho
}
if (!abrindo) mudarEstado(estadoAtual);
} else if (estadoAtual == 2) {
tempoRestanteVermelho = tempoVermelho - (millis() - tempoInicio);
exibirMensagemLCD(tempoRestanteVermelho / 1000); // Exibe o tempo restante somente quando o sinal vermelho do semáforo está ativo
abrindo=false;
}
// Verifica se o botão do pedestre foi pressionado
if (abrindo && digitalRead(botao_pedestre_pin) == HIGH && estadoAtual == 2) {
acionarPedestre();
}
}
// Função para atualizar os LEDs conforme o estado atual
void mudarEstado(int estado) {
abrindo=true;
switch (estado) {
case 0: // Verde
digitalWrite(pinVerde, HIGH);
digitalWrite(pinAmarelo, LOW);
digitalWrite(pinVermelho, LOW);
digitalWrite(luzVermelha_pedestre_pin, HIGH);
digitalWrite(luzVerde_pedestre_pin, LOW);
tempoInicio = millis();
break;
case 1: // Amarelo
digitalWrite(pinVerde, LOW);
digitalWrite(pinAmarelo, HIGH);
digitalWrite(pinVermelho, LOW);
digitalWrite(luzVermelha_pedestre_pin, LOW);
digitalWrite(luzVerde_pedestre_pin, LOW);
tempoInicio = millis();
break;
case 2: // Vermelho
digitalWrite(pinVerde, LOW);
digitalWrite(pinAmarelo, LOW);
digitalWrite(pinVermelho, HIGH);
digitalWrite(luzVermelha_pedestre_pin, LOW);
digitalWrite(luzVerde_pedestre_pin, HIGH);
tempoInicio = millis();
tempoRestanteVermelho = tempoVermelho; // Reinicia o tempo restante
break;
}
// Avança para o próximo estado (cíclico)
estadoAtual = (estadoAtual + 1) % 3;
}
// Função para exibir uma mensagem no LCD com o tempo restante
void exibirMensagemLCD(int tempoRestante) {
lcd.setCursor(0, 0);
lcd.print("Tempo restante: ");
lcd.setCursor(0, 1);
lcd.print(String(tempoRestante) + " s");
}
// Função para acionar o pedestre
void acionarPedestre() {
pedestrePressionado = true;
emitirSom();
digitalWrite(luzVermelha_pedestre_pin, LOW);
digitalWrite(luzVerde_pedestre_pin, HIGH);
// Tempo para o pedestre atravessar (5 segundos)
delay(5000);
digitalWrite(luzVerde_pedestre_pin, LOW);
pedestrePressionado = false;
}
// Alteração na função emitirSom() para produzir diferentes tons dependendo do estado do sinal do pedestre
void emitirSom() {
if (digitalRead(luzVermelha_pedestre_pin) == HIGH) {
tone(buzzer_pin, 1000, 500); // Som agudo se o sinal vermelho do pedestre estiver ativo
} else if (digitalRead(luzVerde_pedestre_pin) == HIGH) {
tone(buzzer_pin, 500, 500); // Som grave se o sinal verde do pedestre estiver ativo
}
noTone(buzzer_pin);
}
// função do sensor do sinal vermelho de multas
void inicia() {
Serial.begin(115200);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
}
void compila() {
// Inicia uma nova medição:
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
// Leia o resultado:
int duration = pulseIn(PIN_ECHO, HIGH);
Serial.print("Distância em CM: ");
Serial.println(duration / 58);
Serial.print("Distância em polegadas: ");
Serial.println(duration / 148);
delay(1000);
} // função sensor de multa acaba aqui