Desenvolvimento De Sistema Para Monitoramento Remoto De Nível De Líquido Em Bombonas.
by adlehs in Circuits > Arduino
35 Views, 1 Favorites, 0 Comments
Desenvolvimento De Sistema Para Monitoramento Remoto De Nível De Líquido Em Bombonas.
 
      A logística de coleta de óleo de cozinha usado enfrenta um desafio recorrente: a verificação manual do nível nas bombonas distribuídas em restaurantes e estabelecimentos parceiros. Essa prática, além de ineficiente, gera deslocamentos desnecessários, gastos com combustível e perda de tempo por parte dos coletores e pequenos produtores.
Este projeto nasceu a partir da observação dessa dor real, relatada por um professor durante as aulas de outra disciplina de Logística no IFB – Campus Gama.
Diante da necessidade de apresentar uma solução funcional e aplicável, nossa equipe desenvolveu um sistema de monitoramento remoto de nível de óleo com baixo custo, fácil manutenção e acesso local via Wi-Fi.
O projeto utiliza um sensor ultrassônico HC-SR04 para medir a distância entre o nível do líquido e o topo do reservatório. Essa medida é processada por um ESP32, que calcula a porcentagem de preenchimento, aciona LEDs indicadores e exibe os dados em uma interface web simples, acessível por qualquer dispositivo conectado à rede criada pelo próprio ESP32.
Além de permitir testes na vida real, a ideia foi simulada com sucesso na plataforma Wokwi, validando a lógica do sistema antes da montagem física.
Este Instructable apresenta o passo a passo do desenvolvimento, os materiais usados, os códigos, os testes realizados e os aprendizados do processo. A proposta é contribuir com soluções reais e acessíveis para problemas cotidianos, incentivando a inovação sustentável e a aplicação prática da tecnologia.
Supplies
 
       
      Para montagem do circuito foi utilizado:
1 ESP32
1 Sensor HC-SR04
4 LEDs
4 Resistores 220Ω
1 Protoboard
1 Fonte de alimentação 5V
Vários jumpers
Para a estrutura física foi utilizado um pote simples e uma estrutura de madeira.
Do Correio Inteligente a Um Sistema Prático De Logística
O projeto original da equipe era uma Caixa de Correio Inteligente, pensada para resolver um problema do dia a dia: a dificuldade de saber exatamente quando uma correspondência ou encomenda chega em casa. A ideia era usar sensores para detectar a presença de cartas e pacotes e, por meio de um sistema web, notificar o usuário em tempo real.
Porém durante o desenvolvimento, surgiram dificuldades técnicas:
- Integração de sensores com a comunicação web foi mais complexa do que o previsto;
- Tempo limitado para realizar testes e calibração;
- A curva de aprendizado com múltiplos módulos atrasou a evolução do protótipo.
Diante disso, com a proximidade do prazo e a necessidade de entregar algo funcional, aplicável e bem fundamentado, optamos por mudar o foco do projeto para algo mais simples, porém igualmente útil no contexto real.
A partir dessa decisão, nasceu a ideia de um sistema de monitoramento remoto de nível de óleo, inspirado em uma situação real relatada por um professor da turma.
Novo Desafio: Monitoramento De Nível De Óleo
 
      Após abandonar a ideia da Caixa de Correio Inteligente, buscamos uma alternativa viável que fosse tecnicamente mais simples, mas ainda assim relevante e aplicável. Foi então que, durante uma outra aula, surgiu a inspiração a partir do relato de um professor.
O relato contava que um pequeno produtor artesanal de sabão coleta óleo de cozinha usado em bombonas deixadas em restaurantes parceiros. No entanto, ele não sabe quando essas bombonas estão cheias, o que o obriga a circular entre os locais de forma aleatória, resultando em:
- Deslocamentos desnecessários;
- Perda de tempo com verificações manuais;
- Aumento de custos logísticos.
A proposta que surgiu foi criamos um sistema de monitoramento de nível de óleo com foco em simplicidade, baixo custo e funcionalidade prática. O sistema permite:
- Medição precisa do nível de óleo na bombona (sem contato com o líquido);
- Indicação visual local por LEDs em faixas de 20%;
- Acesso remoto via navegador, por meio de Wi-Fi.
Esse novo projeto atende tanto à exigência técnica da disciplina quanto à aplicabilidade no mundo real, sendo ideal para produtores, catadores ou qualquer operação logística que envolva coleta de líquidos em recipientes distribuídos.
A referencia utilizada foi: Sensor de nível com porcentagem do volume por edsongde, público.
https://www.tinkercad.com/things/ckgV1KvzCML-sensor-de-nivel-caixa-de-agua-
Os objetivos para esse novo projeto foram estabelecidos como:
- Medir o nível do óleo na bombona com precisão e sem contato físico com o líquido.
- Exibir, fisicamente, a porcentagem de preenchimento em tempo real por meio de LEDs.
- Oferecer uma visualização remota acessível via navegador.
- Simular e validar o sistema usando a plataforma Wokwi para garantir a funcionalidade.
- Utilizar componentes simples e acessíveis, respeitando o prazo e o nível técnico da equipe.
Para ambos os projetos foram elaborados fluxogramas para facilitar a visualização da lógico do projeto.
Funcionamento Do Sistema
O sistema foi pensado para oferecer monitoramento local e remoto do nível de óleo em uma bombona, utilizando componentes de baixo custo e fácil acesso. A seguir, explicamos cada parte do funcionamento:
1.Leitura do Nível com o Sensor Ultrassônico
O sensor HC-SR04 mede a distância entre o topo da bombona (onde o sensor está fixado) e a superfície do líquido (óleo).
Como funciona o sensor:
- Ele envia um pulso sonoro de 40kHz.
- Esse som bate no líquido e retorna ao sensor.
- O tempo de ida e volta é usado para calcular a distância:
- distância=(tempo×velocidadedosom)÷2distância
O sensor é conectado ao ESP32, que lê esse tempo e converte em distância, em centímetros.
2.Conversão da Distância em Porcentagem:
Sabendo a distância mínima (quando a bombona está cheia) e a distância máxima (quando está vazia), podemos transformar essa leitura em porcentagem de preenchimento.
Exemplo de lógica no código:
int nivel = map(distancia, distanciaCheio, distanciaVazio, 100, 0);
nivel = constrain(nivel, 0, 100);
Se o sensor ler uma distância de 5 cm (cheio), a porcentagem será 100%.
Se ler 30 cm (vazio), será 0%.
3.Indicação com LEDs
O sistema tem 4 LEDs, ligados a pinos digitais do ESP32.
Cada LED representa um nível de 20%:
- 1º LED: ≥ 20%
- 2º LED: ≥ 40%
- 3º LED: ≥ 60%
- 4º LED: ≥ 80%
O código compara o valor da porcentagem e acende os LEDs correspondentes.
Assim, é possível saber rapidamente, olhando para a bombona, o quanto ela está cheia.
4.Interface Web (Wi-Fi local)
Além da indicação por LEDs, o ESP32 cria uma rede Wi-Fi própria (modo Access Point).
Ao se conectar a essa rede com um celular ou notebook, o usuário acessa uma página web simples que mostra a porcentagem do nível da bombona em tempo real.
Vantagens:
- Não precisa de internet externa.
- Funciona em qualquer lugar (restaurantes, cozinhas, pontos de coleta).
- Não exige aplicativos, basta um navegador.
Em resumo:
- Sensor HC-SR04 mede a distância até o óleo.
- ESP32 converte a distância em porcentagem.
- A porcentagem:
- Acende os LEDs de 20% a 80%.
- É exibida em uma página web local criada pelo ESP32.
Esquema De Montagem E Simulação
 
       
       
       
      A montagem foi dividida em duas frentes: circuito eletrônico e estrutura física simples (um pote representando a bombona).
Com os competentes já apresentados acima, o circuito foi primeiro simulado no Wokwi com o seguinte esquema de ligação:
- O sensor HC-SR04 está ligado ao ESP32 nos pinos TRIG e ECHO.
- Os LEDs estão conectados a quatro GPIOs configuradas como saída.
Inicialmente foi utilizado um divisor de tensão que reduz o sinal de 5V do ECHO para um nível seguro (≈1.56V) antes de entrar no ESP32, que opera em 3.3V, mas era uma medida preventiva que se mostrou não necessaria.
A simulação no Wokwi foi fundamental para validar o funcionamento do código e da lógica sem a necessidade de hardware físico imediato. A escolha desse simulador se deu por sua compatibilidade com o ESP32.
Link do projeto no Wokwi: https://wokwi.com/projects/437281992938747905
Antes da simulação no wokwi foram feita duas tentativas diferentes no tinkercard utilizando o módulo de WI-FI (ESP8266) e o Arduino Uno, mas ambos foram descartados.
Código Do Projeto
Reforçando o que já foi descrito este código tem a função de medir a distância do líquido com o sensor HC-SR04, converter o valor em porcentagem de preenchimento da bombona e acender os LEDs correspondentes ao nível atual e utiliza o ESP32 para transforma em um ponto de acesso Wi-Fi local, permitindo ao usuário conectar-se diretamente ao dispositivo e acessar uma página web que exibe o nível de preenchimento da bombona.
#include <WiFi.h> // Biblioteca para gerenciar o Wi-Fi do ESP32
#include <WebServer.h> // Biblioteca para criar um servidor web no ESP32
// --- Configurações do Ponto de Acesso (AP) ---
const char* ssid_ap = "MonitorReservatorio"; // Nome da rede Wi-Fi que o ESP32 vai criar
const char* password_ap = "senhasupersegura"; // Senha da rede Wi-Fi (mínimo 8 caracteres)
// Objeto do servidor web na porta 80 (porta padrão para HTTP)
WebServer server(80);
// --- Conteúdo da Página Web (HTML e CSS) ---
// Este é o mesmo conteúdo HTML/CSS que você já tem, sem modificações.
// Ele será enviado como uma única string para o navegador.
const char HTML_CONTENT[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<title>Nível do Reservatório</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #fffbe7;
color: #000000;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
min-height: 100vh; /* Ocupa a altura total da tela */
margin: 0;
box-sizing: border-box; /* Inclui padding na altura/largura */
}
.container {
background-color: #464849;
border-radius: 12px;
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.4);
padding: 30px 40px;
text-align: center;
width: 100%;
max-width: 480px;
margin-bottom: 20px;
}
h1 {
color: #4ac005;
font-size: 2.2em;
margin-bottom: 15px;
border-bottom: 2px solid #4ac005;
padding-bottom: 10px;
}
.info-texts{
font-size: 1.2em;
color: #e4dfdf; /* Cinza claro para informações adicionais */
margin-top: 20px;
}
.visor {
background-color: #272a2c; /* Quase preto, para o fundo do visor */
border: 4px solid #4ac005; /* Borda do visor */
border-radius: 8px;
padding: 30px 20px;
margin: 25px auto;
font-size: 3.5em; /* Tamanho grande para o número */
font-weight: bold;
color: #fffb09; /* Amarelo vibrante para o nível */
display: flex;
justify-content: center;
align-items: center;
height: 150px;
box-shadow: inset 0 0 15px rgba(0, 255, 0, 0.3); /* Efeito de brilho interno */
}
.unidade {
font-size: 0.5em; /* Tamanho menor para o símbolo de percentual */
vertical-align: super;
}
.info-text {
font-size: 1.1em;
color: #bdc3c7; /* Cinza claro para informações adicionais */
margin-top: 20px;
}
.footer {
font-size: 0.9em;
color: #697070; /* Cinza mais escuro para o rodapé */
margin-top: 30px;
}
.footer a {
color: #1abc9c;
text-decoration: none;
}
.footer a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<div class="container">
<h1>Nível do Reservatório</h1>
<p class=info-texts>Informações em tempo real sobre o volume de óleo.</h3>
<p class="info-text">
O reservatório está com a seguinte capacidade:
</p>
<div class="visor">
%NIVEL_OLEO%<span class="unidade">%</span>
</div>
<p class="info-text">
Monitore regularmente!
</p>
</div>
<div class="footer">
Confira o projeto completo <a href="#" target="_blank">aqui</a>
</div>
</body>
</html>
)rawliteral";
// Definição dos pinos para o sensor ultrassônico
const int trigPin = 25; // Pino GIOP25
const int echoPin = 26; // Pino GIOP26
// Definição dos pinos para os LEDs
const int ledPins[] = {18, 19, 23, 5}; // Pinos GIOP18, GIOP19, GIOP23, GIOP5, GIOP17
const int numLeds = 4;
// Variáveis para o sensor
long duration;
int distance;
// Variável global para armazenar o percentual do nível
float percentualNivelGlobal = 0.0;
// ---- MEDIDAS DO SEU RESERVATÓRIO ----
// Distância do sensor até o fundo do reservatório em cm
const int ALTURA_TOTAL_RESERVATORIO = 28;
// =================================================================
// --- Funções Auxiliares ---
// =================================================================
/**
* @brief Acende a quantidade de LEDs correspondente ao percentual do nível.
* @param percentual O nível atual do reservatório (0 a 100).
*/
void atualizarLeds(int percentual) {
// Apaga todos os LEDs antes de acender os corretos
for (int i = 0; i < numLeds; i++) {
digitalWrite(ledPins[i], LOW);
}
// Acende os LEDs com base no percentual
if (percentual >= 20) {
digitalWrite(ledPins[0], HIGH);
}
if (percentual >= 40) {
digitalWrite(ledPins[1], HIGH);
}
if (percentual >= 60) {
digitalWrite(ledPins[2], HIGH);
}
if (percentual >= 80) { // quase cheio
digitalWrite(ledPins[3], HIGH);
}
// if (percentual >= 90) { // cheio
// digitalWrite(ledPins[4], HIGH);
// }
}
/**
* @brief Função para tratar a requisição HTTP da página principal ("/")
* Ela envia o HTML com o valor atual do nível do óleo.
*/
void handleRoot() {
String html = HTML_CONTENT; // Copia o conteúdo HTML para uma String modificável
// Substitui o placeholder %NIVEL_OLEO% pelo valor atual da variável percentualNivelGlobal
html.replace("%NIVEL_OLEO%", String(percentualNivelGlobal, 1));
// Envia a página processada para o navegador com o status 200 (OK)
server.send(200, "text/html", html);
}
// =================================================================
// --- Setup e Loop ---
// =================================================================
void setup() {
Serial.begin(115200); // Inicia a comunicação serial
delay(100);
Serial.println();
Serial.println("Iniciando monitor de reservatório no Wemos D1 R32 (ESP32)...");
// Configura os pinos do sensor
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Configura os pinos dos LEDs como saída e os apaga inicialmente
for (int i = 0; i < numLeds; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW); // CORREÇÃO: Usando 'ledPins'
}
// --- Configura o Ponto de Acesso (AP) ---
Serial.print("Configurando Ponto de Acesso: ");
Serial.println(ssid_ap);
if (WiFi.softAP(ssid_ap, password_ap)) {
Serial.println("Ponto de Acesso criado com sucesso!");
Serial.print("SSID: ");
Serial.println(ssid_ap);
Serial.print("IP do AP: ");
Serial.println(WiFi.softAPIP());
} else {
Serial.println("Falha ao criar o Ponto de Acesso.");
}
// --- Configura o Servidor Web ---
server.on("/", handleRoot);
server.begin();
Serial.println("Servidor Web Iniciado!");
Serial.println("Conecte-se à rede '" + String(ssid_ap) + "' e acesse http://" + WiFi.softAPIP().toString() + " no seu navegador.");
}
void loop() {
// Processa as requisições do servidor web (ESSENCIAL PARA A PÁGINA FUNCIONAR)
server.handleClient();
// Limpa o pino de trigger
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Envia o pulso ultrassônico
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Lê o tempo de retorno do pulso
duration = pulseIn(echoPin, HIGH, 30000);
if (duration > 0) {
distance = duration * 0.0343 / 2;
// --- Lógica de cálculo do nível (Simplificada e corrigida) ---
// A altura do líquido é a altura total do reservatório menos a distância lida.
float alturaLiquido = ALTURA_TOTAL_RESERVATORIO - distance;
// Garante que a altura não seja negativa ou maior que a altura total
alturaLiquido = constrain(alturaLiquido, 0.0, (float)ALTURA_TOTAL_RESERVATORIO);
// Calcula o percentual do nível da água
percentualNivelGlobal = (alturaLiquido / ALTURA_TOTAL_RESERVATORIO) * 100.0;
Serial.print("Distancia: ");
Serial.print(distance);
Serial.print(" cm");
Serial.print(" - Nivel do Reservatorio: ");
Serial.print(percentualNivelGlobal, 1);
Serial.println(" %");
atualizarLeds(static_cast<int>(percentualNivelGlobal));
} else {
Serial.println("Erro na leitura do sensor ou objeto fora de alcance.");
}
delay(1000); // Espera 1 segundo antes da próxima medição/atualização
}
Testes, Resultados, Próximas Etapas E Aprendizado
 
       
      Como já foi dito anteriormente, antes de montar fisicamente o sistema, realizamos todos os testes na plataforma Wokwi.
Na simulação:
- O sensor HC-SR04 respondeu com precisão à variação da distância.
- Os LEDs acenderam corretamente conforme a porcentagem de preenchimento simulada.
- A interface web foi exibida com sucesso, mostrando o nível do reservatório em tempo real por meio de uma rede Wi-Fi criada pelo ESP32.
A simulação foi essencial para garantir que o código e a lógica do sistema estavam corretos antes de passar à montagem real.
Porém, durante a transição para o protótipo físico, enfrentamos algumas dificuldades:
- Inconsistência nas medições do sensor (provavelmente por reflexos ou posicionamento incorreto na bombona).
- Falta de resposta ao conectar o ESP32 com os componentes na protoboard.
- Alguns LEDs não acenderam corretamente (possivelmente por erros na fiação ou GPIOs mal conectadas).
Esses obstáculos estão sendo analisados e corrigidos com base em testes contínuos e feedbacks.
Próximas Etapas:
- Melhorar o design físico da estrutura para garantir um melhor posicionamento do sensor e dos LEDs.
- Implementar um sistema que permita o monitoramento de múltiplas bombonas simultaneamente com diferentes sensores conectados ao mesmo ESP32.
Aprendizados:
- A simulação digital (Wokwi) é uma ferramenta poderosa e confiável para validar ideias antes de investir em hardware.
- O desenvolvimento físico exige atenção redobrada à montagem elétrica, testes de campo e ajustes de calibração.
- A troca de projeto mostrou como a adaptação e o foco na solução prática são essenciais na engenharia e na inovação.