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.

circuito.jpg

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

componetsrs.jpg
componetes.PNG

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:

  1. Integração de sensores com a comunicação web foi mais complexa do que o previsto;
  2. Tempo limitado para realizar testes e calibração;
  3. 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

_Fluxograma.png

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:

  1. Deslocamentos desnecessários;
  2. Perda de tempo com verificações manuais;
  3. 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:

  1. Medição precisa do nível de óleo na bombona (sem contato com o líquido);
  2. Indicação visual local por LEDs em faixas de 20%;
  3. 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:

  1. Medir o nível do óleo na bombona com precisão e sem contato físico com o líquido.
  2. Exibir, fisicamente, a porcentagem de preenchimento em tempo real por meio de LEDs.
  3. Oferecer uma visualização remota acessível via navegador.
  4. Simular e validar o sistema usando a plataforma Wokwi para garantir a funcionalidade.
  5. 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:

  1. Ele envia um pulso sonoro de 40kHz.
  2. Esse som bate no líquido e retorna ao sensor.
  3. O tempo de ida e volta é usado para calcular a distância:
  4. 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. 1º LED: ≥ 20%
  2. 2º LED: ≥ 40%
  3. 3º LED: ≥ 60%
  4. 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:

  1. Não precisa de internet externa.
  2. Funciona em qualquer lugar (restaurantes, cozinhas, pontos de coleta).
  3. Não exige aplicativos, basta um navegador.

Em resumo:

  1. Sensor HC-SR04 mede a distância até o óleo.
  2. ESP32 converte a distância em porcentagem.
  3. A porcentagem:
  4. Acende os LEDs de 20% a 80%.
  5. É exibida em uma página web local criada pelo ESP32.

Esquema De Montagem E Simulação

Capturar.PNG
Capturar1.PNG
esp32.PNG
Capturar.PNG

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:

  1. O sensor HC-SR04 está ligado ao ESP32 nos pinos TRIG e ECHO.
  2. 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

IMG-20250728-WA0005.jpg
1000022025.jpg

Como já foi dito anteriormente, antes de montar fisicamente o sistema, realizamos todos os testes na plataforma Wokwi.

Na simulação:

  1. O sensor HC-SR04 respondeu com precisão à variação da distância.
  2. Os LEDs acenderam corretamente conforme a porcentagem de preenchimento simulada.
  3. 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:

  1. Inconsistência nas medições do sensor (provavelmente por reflexos ou posicionamento incorreto na bombona).
  2. Falta de resposta ao conectar o ESP32 com os componentes na protoboard.
  3. 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:

  1. Melhorar o design físico da estrutura para garantir um melhor posicionamento do sensor e dos LEDs.
  2. Implementar um sistema que permita o monitoramento de múltiplas bombonas simultaneamente com diferentes sensores conectados ao mesmo ESP32.

Aprendizados:

  1. A simulação digital (Wokwi) é uma ferramenta poderosa e confiável para validar ideias antes de investir em hardware.
  2. O desenvolvimento físico exige atenção redobrada à montagem elétrica, testes de campo e ajustes de calibração.
  3. 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.