//MARCONDES C BASTOS
#include <LiquidCrystal_I2C.h>
// --- Configurações do Display LCD ---
// Endereço I2C do display LCD (comumente 0x27 ou 0x3F)
// Colunas e linhas do display (ex: 16 colunas, 2 linhas)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// --- Pinos do Sensor Ultrassônico ---
// É uma boa prática usar nomes em maiúsculas para constantes.
// Verifique se estes pinos são compatíveis com sua placa (ex: ESP32).
// Pinos como o 27 não existem em Arduinos como Uno/Nano.
const int TRIGGER_PIN = 14; // Pino de Trigger do HC-SR04
const int ECHO_PIN = 27; // Pino de Echo do HC-SR04
// --- Pinos dos Atuadores ---
const int LED_PIN = 13; // Pino do LED de alerta
const int BUZZER_PIN = 12; // Pino do Buzzer
// --- Constantes de Lógica ---
const float DISTANCIA_ALERTA_CM = 100.0; // Distância em cm para acionar o alerta
const unsigned int FREQUENCIA_BUZZER_HZ = 1000; // Frequência do buzzer em Hz
const unsigned long PULSE_TIMEOUT_US = 30000; // Timeout para pulseIn em microssegundos (aprox. 5 metros, ajuste se necessário)
// (Velocidade do som ~343m/s. Para 5m: 2*5m / 343m/s * 1e6 µs/s ≈ 29154 µs)
void setup() {
// Inicializa os pinos
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Inicializa a comunicação serial (para debugging, opcional)
// Serial.begin(115200); // Ajuste a taxa conforme seu monitor serial
// Inicializa o display LCD
lcd.init(); // Inicializa o LCD
lcd.backlight(); // Liga o backlight
// Mensagem de inicialização
lcd.setCursor(0, 0); // Coluna 0, Linha 0
lcd.print("Sistema Ligado!");
// Serial.println("Sistema Ligado!"); // Debug
delay(2000); // Tempo para ler a mensagem de inicialização
lcd.clear(); // Limpa o display para as próximas informações
}
void loop() {
long duracao_us; // Variável para armazenar a duração do pulso de eco em microssegundos
float distancia_cm; // Variável para armazenar a distância calculada em centímetros
// 1. Dispara o pulso ultrassônico
digitalWrite(TRIGGER_PIN, LOW); // Garante que o pino de trigger esteja em nível baixo
delayMicroseconds(2); // Pequeno atraso para estabilização
digitalWrite(TRIGGER_PIN, HIGH); // Envia o pulso de trigger
delayMicroseconds(10); // Duração do pulso de trigger (10 microssegundos)
digitalWrite(TRIGGER_PIN, LOW); // Finaliza o pulso de trigger
// 2. Mede a duração do pulso de eco
// pulseIn retorna a duração do pulso em microssegundos.
// Se o pulso não for completado dentro do timeout, retorna 0.
duracao_us = pulseIn(ECHO_PIN, HIGH, PULSE_TIMEOUT_US);
// 3. Calcula a distância
// Velocidade do som no ar: ~343 metros por segundo (ou 0.0343 cm/µs)
// A distância é (tempo * velocidade_som) / 2, porque o som vai e volta.
if (duracao_us > 0) { // Verifica se a leitura foi bem-sucedida (não houve timeout)
distancia_cm = duracao_us * 0.0343 / 2.0;
} else {
distancia_cm = -1.0; // Valor inválido para indicar erro na leitura ou objeto fora de alcance
// Você pode usar um valor alto (ex: 9999) se preferir indicar "fora de alcance"
}
// 4. Atualiza o display LCD de forma controlada para evitar "fantasmas"
char lineBuffer[17]; // Buffer para a linha do LCD (16 caracteres + terminador nulo '\0')
lcd.setCursor(0, 0); // Posiciona o cursor na Coluna 0, Linha 0
if (distancia_cm >= 0) {
// Formata a string de distância, por exemplo: "Dist: 123.4 cm"
// snprintf é uma forma segura de formatar strings, evitando estouro de buffer.
snprintf(lineBuffer, sizeof(lineBuffer), "Dist: %.1f cm", distancia_cm);
} else {
// Mensagem de erro se a leitura falhar
snprintf(lineBuffer, sizeof(lineBuffer), "Erro Leitura");
}
// Preenche o restante da linha do buffer com espaços para limpar caracteres antigos no LCD
int currentLength = strlen(lineBuffer);
for (int i = currentLength; i < 16; i++) { // 16 é o número de colunas do LCD
lineBuffer[i] = ' ';
}
lineBuffer[16] = '\0'; // Garante a terminação nula para a string de 16 caracteres visíveis
lcd.print(lineBuffer); // Imprime a string formatada e preenchida no LCD
// Debug no Serial Monitor (opcional)
// if (distancia_cm >= 0) {
// Serial.print("Distancia: ");
// Serial.print(distancia_cm, 1); // Imprime com 1 casa decimal
// Serial.println(" cm");
// } else {
// Serial.println("Erro na leitura do sensor ou objeto fora de alcance.");
// }
// 5. Lógica de Alerta
// Aciona o alerta se a distância for válida (maior que 0) e menor que o limite definido
if (distancia_cm > 0 && distancia_cm < DISTANCIA_ALERTA_CM) {
digitalWrite(LED_PIN, HIGH); // Liga o LED
tone(BUZZER_PIN, FREQUENCIA_BUZZER_HZ); // Aciona o buzzer com a frequência definida
} else {
digitalWrite(LED_PIN, LOW); // Desliga o LED
noTone(BUZZER_PIN); // Desliga o buzzer
}
delay(100); // Pequeno delay para estabilidade e para não sobrecarregar o sensor/LCD.
// Ajuste este valor conforme a necessidade de responsividade do seu sistema.
}