#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definições do sensor ultrassônico
#define TRIGGER_PIN 5 // Pino do Trigger
#define ECHO_PIN 4 // Pino do Echo
#define MAX_DISTANCE 200 // Distância máxima que o sensor pode medir (em cm)
// Definição da bomba (Pino de controle)
#define PUMP_PIN 8
// Definição do LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Endereço 0x27, 16 colunas e 2 linhas
// Volume do reservatório
float volumeMaximo = 125600; // cm³ (125.6 litros)
float volumeMinimo = volumeMaximo * 0.15; // 15% do volume máximo
float volumeMaximoAcionamento = volumeMaximo * 0.98; // 98% do volume máximo
void setup() {
// Inicializa o LCD
lcd.begin(16, 2);
lcd.setBacklight(1);
lcd.clear();
// Configura o pino da bomba como saída
pinMode(PUMP_PIN, OUTPUT);
digitalWrite(PUMP_PIN, LOW); // A bomba começa desligada
// Configura os pinos do sensor ultrassônico
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop() {
// Envia um pulso para o Trigger
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2); // Aguarda 2 microsegundos
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10); // Envia um pulso de 10 microsegundos
digitalWrite(TRIGGER_PIN, LOW);
// Mede o tempo de retorno do Eco
long duracao = pulseIn(ECHO_PIN, HIGH); // Tempo em microsegundos
// Calcula a distância em cm (tempo de ida e volta / 2 para a ida)
float distancia = (duracao / 2) / 29.1; // A velocidade do som é 343 m/s (29.1 microsegundos por cm)
// Verifica se a leitura foi bem-sucedida
if (distancia <= 0 || distancia > MAX_DISTANCE) {
lcd.clear();
lcd.print("Erro sensor!");
delay(1000);
return;
}
// Calcula a altura da água (distância do sensor até a água)
float alturaDaAgua = 100 - distancia + 10; // A altura total do reservatório é 100cm e o sensor está a 10cm do topo
// Calcula o volume de água armazenado com base na altura da água
float volumeAtual = 3.14 * pow(20, 2) * alturaDaAgua; // V = π * r² * h
// Verifica o estado da bomba
if (volumeAtual >= volumeMaximoAcionamento) {
// Desliga a bomba
digitalWrite(PUMP_PIN, LOW);
}
else if (volumeAtual <= volumeMinimo) {
// Liga a bomba
digitalWrite(PUMP_PIN, HIGH);
}
// Exibe as informações no LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Vol: ");
lcd.print(volumeAtual / 1000); // Mostra volume em litros
lcd.print("L");
lcd.setCursor(0, 1);
lcd.print("Bomba: ");
if (digitalRead(PUMP_PIN) == HIGH) {
lcd.print(" ON ");
} else {
lcd.print(" OFF ");
}
// Aguarda um pouco antes da próxima leitura
delay(1000);
}