//############################ Sensor ultrassonico ############################
#include <Ultrasonic.h> //Inclui a biblioteca
Ultrasonic ultrasonic(8,9); // 1º pindo do Trigger || 2º pino do Echo
float cmMsec;
//############################ LCD ############################
#include <LiquidCrystal_I2C.h> //Inclui a biblioteca
LiquidCrystal_I2C lcd(0x27,16,2); //Endereço, tipo de display 16po2 colunas
//###################### Variaveis e Constantes #############################
const int altura_sensor = 8; //Altura que o sensor fica da água quando a caixa esta cheia
const int altura_total = 58; //Qual altura do sensor ate o fundo da caixa
int nivel_agua; //Variavel para calculos
const int buzzer = 8; //Porta digital do Beep/buzzer
void setup(){
Serial.begin(9600); //INICIALIZA A SERIAL
lcd.init(); //Inicializando o LCD
lcd.backlight(); //Ligando o BackLight do LCD
}
void loop(){
LerDados();
ImprimeNoLCD();
}
//#########################################################################################################
//#################################### LENDO DADOS DO SENSOR ##############################################
//#########################################################################################################
void LerDados(){
long microsec = ultrasonic.timing(); //Recebendo os dados do sensor
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM); //Convertendo a medida para cm
nivel_agua = 100 - (((cmMsec - altura_sensor) / altura_total)*100); //Calculando: 100 menos Nivel de água dividido pela altura x 100
Serial.print((String)"\n"+nivel_agua +"% de agua na caixa"); //Imprimindo na serial só pra acompanhar
}
//#########################################################################################################
//#################################### IMPRIMINDO NO LCD ##############################################
//#########################################################################################################
void ImprimeNoLCD(){
lcd.clear(); //Limpando o Display
lcd.setCursor(0, 0); //Primeiro Define a posicao depois a Linha
lcd.print(" CAIXA D'AGUA "); //IMPRIME O TEXTO
lcd.setCursor(0, 1); //Primeiro Define a posicao depois a Linha
int i = nivel_agua/8; //--Dividindo por 8 o nivel da agua: Por que 8? Dividindo 100 por 8 = 12,5 (pinto 12 posicoes do LCD),
while(i != 0 && i > 0){ //--Como o LCD tenho 16 posições as outras 4 fical para a os numeros da porcentagem: ex: (|||||||| 100%)
lcd.write(10010111); //Escrevendo no LCD em Binário as barrinhas '10010111'
i--;
}
if(nivel_agua < - 0){ //Se o nivel for MENOR que 0%
lcd.print("|"); //Imprimindo só uma Barrinha
lcd.print((String)" Vazia!"); //IMPRIME O TEXTO e concatena com espaços e %
}
if(nivel_agua < 97 and nivel_agua > 0){ //Arredondando valores (maior que 97 e menor que 106) ou seja entre 98 e 105
lcd.print((String)"" +nivel_agua +"%"); //IMPRIME O TEXTO e concatena com espaços e %
}
if(nivel_agua > 96 and nivel_agua < 104){ //Arredondando valores (maior que 97 e menor que 106) ou seja entre 98 e 105
nivel_agua = 100; //Setando um valor só pra deixar arredondado
lcd.print((String)"" +nivel_agua +"%"); //IMPRIME O TEXTO e concatena com espaços e %
}
if(nivel_agua > 103){ //Se o nivel for MAIOR que 105%
lcd.setCursor(0, 1);
lcd.print((String)"MUITO CHEIA!" +nivel_agua +"%"); //IMPRIME O TEXTO e concatena com espaços e %
}
delay(5000);
}