#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define SDA 25 // Define o pino SDA
#define SCL 26 // Define o pino SCL
#define trigPin 13 // Define o pino trigPin como 13
#define echoPin 14 // Define o pino echoPin como 14.
#define MAX_DISTANCE 700 // A distância máxima suportada pelo sensor é de aproximadamente 400-500cm.
LiquidCrystal_I2C lcd(0x27,20,4); // Inicializa o LCD I2C com o endereço 0x27 e tamanho de 20 colunas por 4 linhas
// timeOut = 2 * MAX_DISTANCE / 100 / 340 * 1000000 = MAX_DISTANCE * 58.8
float timeOut = MAX_DISTANCE * 58.8; // Define um limite de tempo para as leituras do sensor
int soundVelocity = 340; // Velocidade do som em metros por segundo (aproximadamente 340 m/s)
void setup() {
Wire.begin(SDA, SCL); // Inicializa a comunicação I2C
lcd.init(); // Inicializa o display LCD
lcd.backlight(); // Liga a luz de fundo do LCD
lcd.setCursor(1,0); // Move o cursor para a linha 0, coluna 1
lcd.print("Aguarde iniciando"); // Exibe uma mensagem no LCD
lcd.setCursor(1,1); // Move o cursor para a linha 1, coluna 1
lcd.print("Sistema de medicao");
lcd.setCursor(4,2); // Move o cursor para a linha 2, coluna 4
lcd.print("Ultrassonico");
delay(10000); // Aguarda 10 segundos
lcd.clear(); // Limpa o LCD
pinMode(trigPin, OUTPUT); // Configura o pino trigPin como saída
pinMode(echoPin, INPUT); // Configura o pino echoPin como entrada
Serial.begin(115200); // Inicializa a comunicação serial a 115200 baud para ver os resultados da medição.
}
void loop() {
// Imprime a distância medida em diferentes unidades (milímetros, centímetros, polegadas e metros).
if (getSonar()==0 || isnan(getSonar())){ // Verifica se a leitura do sensor é inválida ou NaN
lcd.setCursor(3,0); // Move o cursor para a linha 0, coluna 3
lcd.print("Falha ao ler o"); // Exibe uma mensagem no LCD
lcd.setCursor(0,1); // Move o cursor para a linha 1, coluna 0
lcd.print("Sensor Ultrassonico");
lcd.setCursor(1,2); // Move o cursor para a linha 2, coluna 1
lcd.print("Sensor com defeito");
lcd.setCursor(0,3); // Move o cursor para a linha 3, coluna 0
lcd.print("Ou Sensor obstruido");
delay(2000); // Aguarda 2 segundos
}
else
{
Serial.printf("Distancia: ");
Serial.print(getSonar() * 10); // Distância em milímetros
Serial.print("mm");
Serial.print(" | ");
Serial.print(getSonar()); // Distância em centímetros
Serial.print("cm");
Serial.print(" | ");
Serial.print(getSonar() / 2.54); // Distância em polegadas
Serial.print("in");
Serial.print(" | ");
Serial.print(getSonar() * 100); // Distância em metros
Serial.println("m");
lcd.setCursor(0,0); // Move o cursor para a linha 0, coluna 0
lcd.print("Distancia:"); // Exibe uma mensagem no LCD
lcd.setCursor(11,0); // Move o cursor para a linha 0, coluna 11
lcd.print(getSonar() * 10); // Distância em milímetros
lcd.print("mm");
lcd.setCursor(0,1); // Move o cursor para a linha 1, coluna 0
lcd.print("Distancia: "); // Exibe uma mensagem no LCD
lcd.setCursor(11,1); // Move o cursor para a linha 1, coluna 11
lcd.print(getSonar()); // Distância em centímetros
lcd.print("cm");
lcd.setCursor(0,2); // Move o cursor para a linha 2, coluna 0
lcd.print("Distancia: "); // Exibe uma mensagem no LCD
lcd.setCursor(11,2); // Move o cursor para a linha 2, coluna 11
lcd.print(getSonar()/2.54); // Distância em polegadas
lcd.print("pol");
lcd.setCursor(0,3); // Move o cursor para a linha 3, coluna 0
lcd.print("Distancia: "); // Exibe uma mensagem no LCD
lcd.setCursor(11,3); // Move o cursor para a linha 3, coluna 11
lcd.print(getSonar()*100); // Distância em metros
lcd.print("m");
delay(2000); // Aguarda 2 segundos
lcd.clear(); // Limpa o LCD
}
}
float getSonar() {
unsigned long pingTime;
float distance;
// Faz o pino trigPin ficar em nível alto por 10 microssegundos para disparar o sensor HC-SR04
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Espera o sensor HC-SR04 retornar a nível alto e mede esse tempo de espera
pingTime = pulseIn(echoPin, HIGH, timeOut);
// Calcula a distância com base no tempo medido
distance = (float)pingTime * soundVelocity / 2 / 10000; // Distância em centímetros
return distance; // Retorna o valor da distância medida
}