#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Configuração do Display LCD I2C (Endereço comum 0x27)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pinos dos Sensores Ultrassônicos (Vaga 1, Vaga 2, Vaga 3)
const int trigPins[] = {12, 14, 26};
const int echoPins[] = {13, 27, 25};
// Pinos dos LEDs indicadores (Verde e Vermelho por vaga)
const int ledVerdes[] = {17, 19, 23};
const int ledVermelhos[] = {16, 18, 5};
const int TOTAL_VAGAS = 3;
const float DISTANCIA_DETECCAO = 50.0; // Vaga considerada ocupada se carro estiver a menos de 50cm
void setup() {
Serial.begin(115200);
// Inicializa o LCD
lcd.init();
lcd.backlight();
// Configura os pinos de entradas e saídas
for (int i = 0; i < TOTAL_VAGAS; i++) {
pinMode(trigPins[i], OUTPUT);
pinMode(echoPins[i], INPUT);
pinMode(ledVerdes[i], OUTPUT);
pinMode(ledVermelhos[i], OUTPUT);
}
}
float lerDistancia(int id) {
digitalWrite(trigPins[id], LOW);
delayMicroseconds(2);
digitalWrite(trigPins[id], HIGH);
delayMicroseconds(10);
digitalWrite(trigPins[id], LOW);
long duracao = pulseIn(echoPins[id], HIGH);
// Calcula a distância em centímetros
float distancia = duracao * 0.034 / 2;
return distancia;
}
void loop() {
int vagasOcupadas = 0;
for (int i = 0; i < TOTAL_VAGAS; i++) {
float dist = lerDistancia(i);
delay(30); // Pequeno atraso para evitar interferência de eco
// Se detectar um objeto/carro próximo
if (dist > 0 && dist < DISTANCIA_DETECCAO) {
vagasOcupadas++;
digitalWrite(ledVerdes[i], LOW); // Desliga LED Verde
digitalWrite(ledVermelhos[i], HIGH); // Liga LED Vermelho
} else {
digitalWrite(ledVerdes[i], HIGH); // Liga LED Verde
digitalWrite(ledVermelhos[i], LOW); // Desliga LED Vermelho
}
}
int vagasLivres = TOTAL_VAGAS - vagasOcupadas;
float taxaOcupacao = ((float)vagasOcupadas / TOTAL_VAGAS) * 100.0;
// Atualiza o painel LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("LIVRES: ");
lcd.print(vagasLivres);
lcd.print(" OCUP: ");
lcd.print(vagasOcupadas);
lcd.setCursor(0, 1);
lcd.print("TAXA OCUP: ");
lcd.print((int)taxaOcupacao);
lcd.print("%");
// Exibe no painel Serial para monitoramento
Serial.print("Vagas Livres: "); Serial.print(vagasLivres);
Serial.print(" | Ocupadas: "); Serial.print(vagasOcupadas);
Serial.print(" | Taxa: "); Serial.print(taxaOcupacao); Serial.println("%");
delay(1500); // Atualiza a cada 1.5 segundos
}
Loading
esp32-devkit-c-v4
esp32-devkit-c-v4