#include <LiquidCrystal_I2C.h>
#define PIN_TRIG 4
#define PIN_ECHO 5
// Definindo os pinos dos LEDs (vermelho e verde) para cada vaga
#define LEDr 3
#define LEDv 6
#define LEDr2 7
#define LEDv2 8
#define LEDr3 9
#define LEDv3 10
#define LEDr4 11
#define LEDv4 12
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
lcd.init();
lcd.setBacklight(1);
// Configurando os pinos de trig/echo do ultrassônico
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
// Configurando os pinos dos LEDs como saída e iniciando todos os verdes ligados
pinMode(LEDr, OUTPUT);
pinMode(LEDv, OUTPUT);
pinMode(LEDr2, OUTPUT);
pinMode(LEDv2, OUTPUT);
pinMode(LEDr3, OUTPUT);
pinMode(LEDv3, OUTPUT);
pinMode(LEDr4, OUTPUT);
pinMode(LEDv4, OUTPUT);
// Inicializando todos os LEDs verdes ligados (vagas livres)
digitalWrite(LEDv, HIGH);
digitalWrite(LEDv2, HIGH);
digitalWrite(LEDv3, HIGH);
digitalWrite(LEDv4, HIGH);
// Inicializando todos os LEDs vermelhos desligados (vagas livres)
digitalWrite(LEDr, LOW);
digitalWrite(LEDr2, LOW);
digitalWrite(LEDr3, LOW);
digitalWrite(LEDr4, LOW);
}
void loop() {
// Medição da distância
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
int duration = pulseIn(PIN_ECHO, HIGH);
int distancia = duration / 58;
Serial.print("Distância em CM do carro: ");
delay(200);
Serial.println(distancia);
// Controle dos LEDs conforme a distância
if (distancia >= 20) {
digitalWrite(LEDr, HIGH);
digitalWrite(LEDv, LOW);
} else {
digitalWrite(LEDr, LOW);
digitalWrite(LEDv, HIGH);
}
if (distancia >= 40 ) {
digitalWrite(LEDr2, HIGH);
digitalWrite(LEDv2, LOW);
} else {
digitalWrite(LEDr2, LOW);
digitalWrite(LEDv2, HIGH);
}
if (distancia >= 60) {
digitalWrite(LEDr3, HIGH);
digitalWrite(LEDv3, LOW);
} else {
digitalWrite(LEDr3, LOW);
digitalWrite(LEDv3, HIGH);
}
if (distancia >= 80) {
digitalWrite(LEDr4, HIGH);
digitalWrite(LEDv4, LOW);
} else {
digitalWrite(LEDr4, LOW);
digitalWrite(LEDv4, HIGH);
}
delay(500);
// Contagem de vagas livres
int vagasLivres = 0;
int estado_vagas_verdes[4] = {
digitalRead(LEDv),
digitalRead(LEDv2),
digitalRead(LEDv3),
digitalRead(LEDv4)
};
// Contando quantas vagas estão livres (LED verde aceso)
for (int i = 0; i < 4; i++) {
if (estado_vagas_verdes[i] == HIGH) {
vagasLivres++;
}
}
int vagasOcupadas = 0;
int estado_vagas_vermelhas[4] = {
digitalRead(LEDr),
digitalRead(LEDr2),
digitalRead(LEDr3),
digitalRead(LEDr4)
};
// Contando quantas vagas estão livres (LED vermelho aceso)
for (int i = 0; i < 4; i++) {
if (estado_vagas_vermelhas[i] == HIGH) {
vagasOcupadas++;
}
}
// Exibição no display LCD
lcd.setCursor(0, 0);
lcd.print("1234");
lcd.setCursor(5, 0);
lcd.print("livres=");
lcd.setCursor(15, 0);
lcd.print(vagasLivres);
lcd.print(" "); // Limpa dígito extra
//linha de baixo do lcd
lcd.setCursor(5,1);
lcd.print("ocupadas=");
lcd.setCursor(15,1);
lcd.print(vagasOcupadas);
if (estado_vagas_vermelhas[0] == HIGH){
lcd.setCursor(0,1);
lcd.print("X");
} else {
lcd.setCursor(0,1);
lcd.print(" ");
}
if (estado_vagas_vermelhas[1] == HIGH){
lcd.setCursor(1,1);
lcd.print("X");
} else {
lcd.setCursor(1,1);
lcd.print(" ");
}
if (estado_vagas_vermelhas[2] == HIGH){
lcd.setCursor(2,1);
lcd.print("X");
} else {
lcd.setCursor(2,1);
lcd.print(" ");
}
if (estado_vagas_vermelhas[3] == HIGH){
lcd.setCursor(3,1);
lcd.print("X");
} else {
lcd.setCursor(3,1);
lcd.print(" ");
}
delay(1000);
}
//200 linhas pra ficar bonito, e vai tomando