Escrito por: Pedro Bertoleti

A medição de vazão de reservatórios é uma tarefa muito importante. Em ambiente industrial, é fundamental para o monitoramento de capacidade e consumo de reservatórios de fluidos essenciais para os processos industriais. Já no ambiente residencial, o monitoramento da vazão de uma caixa d’água, por exemplo, pode sinalizar vazamentos ou, na ausência deles, demonstrar o consumo de água. Ou seja, o monitoramento de vazão de reservatórios é algo fundamental para a saúde operacional de uma indústria ou uma residência.

 

Neste artigo, você aprenderá a medir a vazão e volume total retirado de água de um reservatório, além de mandar estes dados para a nuvem, de forma a tornar possível um monitoramento on-line de qualquer lugar do mundo com conectividade à Internet.

 

Material necessário

Para realizar o projeto aqui proposto, você precisará de:

Um ESP32. Você pode utilizar qualquer placa que possua um ESP32, dentre elas a ESP32 Devkit 1 (uma das mais acessíveis do mercado neste quesito), mostrada na figura 1.

Um cabo micro-USB para programação e alimentação

Um sensor ultrassônico HC-SR04 (figura 2)

Um módulo conversor de nível lógico 3,3-5V bidirecional (exemplo: https://www.filipeflop.com/produto/conversor-de-nivel-logico-33-5v-bidirecional/  )

Jumpers macho-fêmea e fêmea-fêmea

Opcional: suporte para o sensor ultrassônico (figura 3)

 

Figura 1 - ESP32 Devkit 1 (fonte da imagem: https://www.filipeflop.com/produto/modulo-wifi-esp32-bluetooth/ )
Figura 1 - ESP32 Devkit 1 (fonte da imagem: https://www.filipeflop.com/produto/modulo-wifi-esp32-bluetooth/ )

 

 

 

Figura 2 - sensor ultrassônico  HC-SR04 (fonte da imagem: https://www.filipeflop.com/produto/sensor-de-distancia-ultrassonico-hc-sr04/)
Figura 2 - sensor ultrassônico HC-SR04 (fonte da imagem: https://www.filipeflop.com/produto/sensor-de-distancia-ultrassonico-hc-sr04/)

 

 

 

 

Figura 3 - suporte para o sensor ultrassônico (fonte da imagem: https://www.filipeflop.com/produto/suporte-sensor-ultrassonico-hc-sr04/)
Figura 3 - suporte para o sensor ultrassônico (fonte da imagem: https://www.filipeflop.com/produto/suporte-sensor-ultrassonico-hc-sr04/)

 

 

Ainda, como utilizaremos a Arduino IDE para programar o ESP32, é necessário a ter instalada em seu computador. Recomendo a instalação da versão mais recente da Arduino IDE para seu sistema operacional (Windows, Linux ou Mac OS X). Para fazer o download, acesse o link https://www.arduino.cc/en/Main/Software .

 

 

Maneiras de monitorar a vazão de um reservatório

A maneira mais intuitiva para monitorar a vazão de um reservatório é utilizar um sensor de fluxo na saída de consumo de tal reservatório. Essa é uma forma muito confiável de medição de vazão, uma vez que todo e qualquer fluido que sai do reservatório passa pelo sensor e é contabilizado. Entretanto, este método apresenta algumas desvantagens que podem prejudicar ou inviabilizar seu uso em alguns casos:

 

Calibração: este tipo de sensor precisa, obrigatoriamente, ser calibrado antes de seu uso. O processo de calibração visa estabelecer uma relação entre pulsos lidos e volume de fluido passante pelo sensor. Portanto, este processo pode envolver utilizar o reservatório real que se deseja medir a vazão no processo de calibração, o que vai torná-lo indisponível para uso enquanto este processo é realizado. Isso pode acarretar um custo alto se aplicado numa indústria, sobretudo se o reservatório for de grande capacidade e se o fluido que possuir for insumo para um importante produto a ser fabricado.

Custo alto: como o fluido passante pode ser corrosivo, há sensores de fluxo específicos para cada tipo de material (água, gasolina, álcool, etc.). Isso pode elevar muito o custo do sensor frente a outros mais simples (para medição de vazão de água, por exemplo), a depender do fluido que ele deve suportar.

Manutenção preventiva e corretiva: por estar em contato com o fluido 100% do tempo de operação, o sensor de fluxo pode se deteriorar com o tempo, exigindo sua manutenção preventiva, corretiva ou até mesmo troca completa do sensor. Isso leva a necessidade de parar a utilização daquele reservatório e requer uma nova calibração, tornando o reservatório indisponível por um certo tempo e elevando o custo do procedimento.

Limitação de vazão: como todo fluido consumido do reservatório passará pelo sensor de fluxo, este vai ser um gargalo de vazão. Ou seja, ele vai limitar, mesmo que minimamente, a vazão máxima daquele reservatório, o que dependendo do uso de tal reservatório pode ser algo muito ruim ou inviável.

 

Como alternativa ao uso do sensor de fluxo e eliminação (ou minimização) dos problemas acima citados se pode utilizar um sensor ultrassônico de distância para estimar a vazão de um reservatório.

 

Como funciona a medição de vazão com sensor ultrassônico?

O sensor ultrassônico de distância consiste em um sensor contendo um transmissor e um receptor ultrassônico. Este sensor é capaz de ser usado para mensurar distâncias com base na velocidade do som no ar e no tempo transcorrido entre emissão e recepção de um sinal ultrassônico. Observe a figura 4.

 

 

Figura 4 - caminho do sinal ultrassônico
Figura 4 - caminho do sinal ultrassônico

 

 

Em resumo, seu funcionamento pode ser descrito da seguinte maneira: ao ser dado o "gatilho" (trigger), o transmissor ultrassônico emite um determinado sinal sonoro, em frequência ultrassônica (ou seja, acima da audível por seres humanos). Ao atingir um objeto, este sinal sonoro é refletido novamente para o sensor, onde é captado pelo receptor ultrassônico. No momento da recepção, é gerado um sinal de eco (echo), indicando que um sinal ultrassônico foi captado com sucesso. Tendo conhecimento da diferença de tempo entre o trigger e o echo e considerando a velocidade de propagação do som no ar (340m/s), é possível determinar a distância entre o sensor ultrassônico e o objeto.

Em termos matemáticos, a distância do sensor ultrassônico ao objeto (Dobj) pode ser determinado utilizando as fórmulas da figura 5.

 

 

Figura 5 - fórmulas para determinação da distância do sensor ultrassônico ao objeto
Figura 5 - fórmulas para determinação da distância do sensor ultrassônico ao objeto

 

 

Há duas observações importantes sobre este método de determinação de distância entre objetos e o sensor ultrassônico:

 

1. O motivo do fator 1/2 no cálculo da distância do objeto é devido ao fato de que o tempo mensurado considera a ida e volta do sinal ultrassônico ao sensor. Portanto, somente metade deste tempo foi necessário para o sinal ultrassônico ser emitido pelo transmissor e atingir o objeto.

2. O sinal ultrassônico é refletido tanto no caso de atingir objetos sólidos ou líquidos. Portanto, este tipo de técnica pode ser utilizada para mensurar a distância entre sensor e linha d´água de um reservatório, por exemplo.

 

 

Sendo assim, a vazão de um reservatório com um sensor ultrassônico pode ser estimada conforme mostra a situação ilustrada na figura 6.

 

 

Figura 6 - medição de vazão de um reservatório com sensor ultrassônico de distância
Figura 6 - medição de vazão de um reservatório com sensor ultrassônico de distância

 

 

 

Neste caso, tem-se um reservatório cilíndrico, de área superior circular de raio R. Sendo assim, a área superior seria dada pela fórmula da figura 7.

 

 

 

 

Figura 7 - fórmula da área superficial do reservatório
Figura 7 - fórmula da área superficial do reservatório

 

 

 

Considere agora que, ao longo do tempo, o nível do líquido no reservatório vai descendo ( o fluido vai sendo consumido). Para medir este desnível, em intervalos de tempo definidos são feitas medidas de distância entre sensor e linha d'água do reservatório. Ou seja, neste intervalo de tempo descrito, o nível desce d metros. Logo, em termos matemáticos, o volume que é decrescido ao longo do tempo será calculado conforme mostra a fórmula da figura 8.

 

 

 

Figura 8 - fórmula do volume decrescido em função da distância medida pelo sensor ultrassônico
Figura 8 - fórmula do volume decrescido em função da distância medida pelo sensor ultrassônico

 

 

Matematicamente, a vazão é definida como volume (ou variação de volume) por tempo (ou intervalo de tempo). No caso deste exemplo, a vazão é o Volume decrescido (figura 8) no período de tempo da medição das distâncias do sensor à linha d'água (representado aqui pord).

Portanto, se o período de tempo entre as medições de distância com o sensor ultrassônico for de um segundo e a unidade métrica da medida for em metros, a vazão do reservatório (determinada por medidas de distâncias com sensor ultrassônico) pode ser expressa na fórmula da figura 9.

 

 

Figura 9 - vazão do reservatório
Figura 9 - vazão do reservatório

 

 

Em suma, para calcular a vazão em um reservatório, o procedimento resumido é:

 

Determinar a área superior do seu reservatório (seja do formato que for).

Medir, segundo a segundo, o quanto o nível decresceu.

Calcular o volume decrescido neste período de tempo.

Para um segundo de tempo de medição de distância, a vazão calculada é igual à razão do volume calculado pelo intervalo de tempo.

 

Há algumas observações importantes sobre este método:

 

Este mesmo procedimento vale para reservatórios enchendo (o que resultará em uma vazão negativa nos cálculos).

Não há restrição de forma da área superior do reservatório. Portanto, este pode ser um reservatório com área superior igual a um retângulo, círculo, etc. O que variará é a forma de calcular a área superior de acordo com a sua forma.

É extremamente recomendável algum tipo de filtragem na leitura das distâncias, já que a leitura pode variar um pouco, sobretudo se o líquido estiver agitado e com ondas em sua superfície / linha d’água.

 

Projeto

Com base no método de medição de vazão com sensor ultrassônico aqui explicado, será feito um projeto que mede a vazão (m³/s) e o volume total retirado / consumido (m³) de um reservatório de água utilizando um sensor de distância ultrassônico e um ESP32. Tais medições serão enviadas via Internet (usando protocolo MQTT) para a nuvem, de forma que poderão ser visualizadas de qualquer lugar do mundo com conectividade à Internet.

 

Para mais informações de como utilizar MQTT no ESP32, clique aqui para ler um artigo sobre isso.

 

 

Circuito esquemático

O circuito esquemático do projeto pode ser visto na figura 10. Observe que o sensor trabalhar com tensão de 5V, enquanto o ESP32 trabalha somente com tensão de 3,3V. Logo, um circuito conversor de tensão precisa ser utilizado para compatibilizar a comunicação entre sensor e ESP32.

 

 

Figura 10 - circuito esquemático do projeto
Figura 10 - circuito esquemático do projeto

 

 

Se desejar, você pode utilizar um suporte para o sensor ultrassônico para fixar o sensor na borda do reservatório de água, de forma que o sensor fique “mirando” diretamente para a linha d’água do reservatório.

 

 

Código-fonte

 

O código-fonte do projeto está disponível a seguir.

 

IMPORTANTE: para total compreensão do código-fonte, leia atentamente todos os seus comentários.

 

/* Projeto: medição de vazão de reservatório com ESP32 e 
 *          sensor de distância ultrassônico
 * Autor: Pedro Bertoleti
 * Data: Dezembro/2019
 */
/* Headers */ 
/* Header para uso das funcionalidades de wi-fi do ESP32 */
#include <WiFi.h> 
/* Header para uso da biblioteca PubSubClient */
#include <PubSubClient.h>  
/* Header para uso da biblioteca do sensor de distância ultrassônico */
#include <Ultrasonic.h>
/* Definições - serial de debug */
#define SERIAL_DEBUG_BAUDRATE          115200
#define NUM_PULA_LINHAS_SERIAL_DEGUB   80
/* Definições - sensor ultrassônico */
#define GPIO_TRIGGER    23
#define GPIO_ECHO       22
/* Definições - medição de vazão */
#define PI_APROXIMADO            3.1415927
#define NUM_MEDIDAS_DISTANCIA    100
/* Definições - área do reservatório: */
/* descomentar somente o tipo de área do seu reservatório 
   (circulo ou retângulo */
//#define RETANGULO
#define CIRCULO
 
/* Medidas se for um retangulo: */
#define RETANGULO_BASE       1  //[m]
#define RETANGULO_ALTURA     1  //[m]
 
/* Medidas se for um circulo: */
#define CIRCULO_RAIO         0.05  //[m]
/* Definições - MQTT */
/* IMPORTANTE: recomendamos fortemente alterar os nomes
               desses tópicos. Caso contrário, há grandes
               chances de você enviar e receber mensagens de um ESP32
               de outra pessoa.
*/
/* Tópico MQTT para envio de informações do ESP32 para broker MQTT */
#define TOPICO_PUBLISH   "INCB_ESP32_envia_vazao_volume"  
/* id mqtt (para identificação de sessão) */
/* IMPORTANTE: este deve ser único no broker (ou seja, 
               se um client MQTT tentar entrar com o mesmo 
               id de outro já conectado ao broker, o broker 
               irá fechar a conexão de um deles).
*/
#define ID_MQTT  "INCB_Cliente_MQTT_vazao_volume"     
/* Variáveis e objetos globais */
Ultrasonic ultrasonic(GPIO_TRIGGER, GPIO_ECHO);
float area_perfil_reservatorio;  
float volume_total_retirado = 0.0;
float vazao_calculada = 0.0;
/*  Variáveis e constantes globais */
/* SSID / nome da rede WI-FI que deseja se conectar */
const char* SSID = " "; 
/*  Senha da rede WI-FI que deseja se conectar */
const char* PASSWORD = " "; 
  
/* URL do broker MQTT que deseja utilizar */
const char* BROKER_MQTT = "broker.hivemq.com"; 
/* Porta do Broker MQTT */
int BROKER_PORT = 1883;
/* wi-fi */
WiFiClient espClient;
/* MQTT */
PubSubClient MQTT(espClient);
 
/* Prototypes */
float calcula_area_perfil_reservatorio(void);
float mede_distancia_em_metros(void);
float media_distancias(void);
float calcula_vazao_e_volume_retirado(void);
void init_wifi(void);
void init_mqtt(void);
void reconnect_wifi(void); 
void verifica_conexoes_wifi_mqtt(void);
/*
 * Implementações
 */
 
/* Função: cálculo da área do perfil do reservatório
 * Parâmetros: nenhum
 * Retorno: área calculada
 */
 float calcula_area_perfil_reservatorio(void)
 {
    float area_calc = 0.0;
    
    #ifdef RETANGULO
      area_calc = RETANGULO_BASE * RETANGULO_ALTURA;    
    #endif
 
    #ifdef CIRCULO
      area_calc = PI_APROXIMADO * CIRCULO_RAIO * CIRCULO_RAIO;    
    #endif
 
    return area_calc; 
 }
 
 /* Função: Média de medidas de distância
  * Parâmetros: nenhum
  * Retorno: média das medidas de distância
  */
float media_distancias(void)
{
    int i;
    float soma_medidas = 0.0;
    float media = 0.0;
    for(i=0; i<NUM_MEDIDAS_DISTANCIA; i++)
        soma_medidas = soma_medidas + mede_distancia_em_metros();     
 
    media = (soma_medidas / NUM_MEDIDAS_DISTANCIA);    
    return media;    
}
 
 
 /* Função: mede distancia em metros
  * Parametros: nenhum
  * Retorno: distancia (m)
 */
float mede_distancia_em_metros(void) 
{
    float cm_msec = 0.0;
    float dist_metros = 0.0;
    long microsec = ultrasonic.timing();
 
    cm_msec = ultrasonic.convert(microsec, Ultrasonic::CM);
    dist_metros = (cm_msec / 100.0);
    
    return dist_metros; 
}
 
 
/*  Função: calcula vazão e volume total retirado do reservatório
 *  Parâmetros: nenhum
 *  Retorno: nenhum
 */
float calcula_vazao_e_volume_retirado(void)
{
    float distancia_t2;
    float distancia_t1;    
    float variacao_distancia;
    float volume_em_litros;
    char i;
        
    /* faz as medições de distancias */
    distancia_t1 = media_distancias(); 
    delay(1000);   
    distancia_t2 = media_distancias();
    /* Calcula vazão e volume total retirado */
    variacao_distancia = ((distancia_t2 - distancia_t1) / 100);   //[m]
    vazao_calculada = (area_perfil_reservatorio * variacao_distancia); //[m³/s]
    volume_total_retirado = volume_total_retirado + vazao_calculada; //[m³]
    volume_em_litros = (volume_total_retirado*1000.0); //[l]
    /* Escreve medições no Serial monitor (serial de debug) */
    for (i=0; i<NUM_PULA_LINHAS_SERIAL_DEGUB; i++)
        Serial.println(""); 
      
    Serial.println("[DADOS DA MEDIÇÃO]");
    Serial.print("Vazao calculada: ");
    Serial.print(vazao_calculada);
    Serial.print(" m^3/s");
    Serial.println("");
    Serial.print("Variacao de distancia: ");
    Serial.print(variacao_distancia*100);
    Serial.print(" cm");    
    Serial.println("");
    Serial.print("Volume total retirado: ");
    Serial.print(volume_em_litros);
    Serial.print(" l");
    Serial.println("");
}
/* Função: inicializa e conecta-se na rede WI-FI desejada
 * Parâmetros: nenhum
 * Retorno: nenhum
 */
void init_wifi(void) 
{
    delay(10);
    Serial.println("------Conexao WI-FI------");
    Serial.print("Conectando-se na rede: ");
    Serial.println(SSID);
    Serial.println("Aguarde");
    reconnect_wifi();
}
  
/* Função: inicializa parâmetros de conexão MQTT(endereço do  
 *         broker, porta e seta função de callback)
 * Parâmetros: nenhum
 * Retorno: nenhum
 */
void init_mqtt(void) 
{
    /* informa a qual broker e porta deve ser conectado */
    MQTT.setServer(BROKER_MQTT, BROKER_PORT); 
}
  
/* Função: reconecta-se ao broker MQTT (caso ainda não esteja conectado ou em caso de a conexão cair)
 *          em caso de sucesso na conexão ou reconexão, o subscribe dos tópicos é refeito.
 * Parâmetros: nenhum
 * Retorno: nenhum
 */
void reconnect_mqtt(void) 
{
    while (!MQTT.connected()) 
    {
        Serial.print("* Tentando se conectar ao Broker MQTT: ");
        Serial.println(BROKER_MQTT);
        if (MQTT.connect(ID_MQTT)) 
        {
            Serial.println("Conectado com sucesso ao broker MQTT!");
        } 
        else
        {
            Serial.println("Falha ao reconectar no broker.");
            Serial.println("Havera nova tentatica de conexao em 2s");
            delay(2000);
        }
    }
}
  
/* Função: reconecta-se ao WiFi
 * Parâmetros: nenhum
 * Retorno: nenhum
*/
void reconnect_wifi() 
{
    /* se já está conectado a rede WI-FI, nada é feito. 
       Caso contrário, são efetuadas tentativas de conexão */
    if (WiFi.status() == WL_CONNECTED)
        return;
         
    WiFi.begin(SSID, PASSWORD);
     
    while (WiFi.status() != WL_CONNECTED) 
    {
        delay(100);
        Serial.print(".");
    }
   
    Serial.println();
    Serial.print("Conectado com sucesso na rede ");
    Serial.print(SSID);
    Serial.println("IP obtido: ");
    Serial.println(WiFi.localIP());
}
 
/* Função: verifica o estado das conexões WiFI e ao broker MQTT. 
 *         Em caso de desconexão (qualquer uma das duas), a conexão
 *         é refeita.
 * Parâmetros: nenhum
 * Retorno: nenhum
 */
void verifica_conexoes_wifi_mqtt(void)
{
    /* se não há conexão com o WiFI, a conexão é refeita */
    reconnect_wifi(); 
    /* se não há conexão com o Broker, a conexão é refeita */
    if (!MQTT.connected()) 
        reconnect_mqtt(); 
} 
void setup()
{
    Serial.begin(SERIAL_DEBUG_BAUDRATE);
 
    /* calcula área do perfil (com base em parametros fornecidos) 
       nas definições */
    area_perfil_reservatorio = calcula_area_perfil_reservatorio();
    /* Inicializa variável de volume total retirado */
    volume_total_retirado = 0.0;
    /* Conecta-se no wi-fi e MQTT */
    init_wifi();
    init_mqtt();
}
 
void loop()
{
    char msg_mqtt[100]={0};
    
    /* Calcula vazão e volume total retirado do reservatório */ 
    calcula_vazao_e_volume_retirado();
    /* garante que haja conectividade wi-fi e MQTT */  
    verifica_conexoes_wifi_mqtt();
    /* envia vazão e volume total retirado do reservatório 
       via MQTT pra nuvem */
    sprintf(msg_mqtt, "Vazao: %.2fm^3/s - Volume: %.2fm^3", vazao_calculada, volume_total_retirado);
    MQTT.publish(TOPICO_PUBLISH, msg_mqtt);
    /* Faz keep alive do MQTT */
    MQTT.loop();
}

 

Como testar?

Para fazer o teste do projeto, utilize qualquer cliente MQTT disponível, como por exemplo o MQTTLens ( https://chrome.google.com/webstore/detail/mqttlens/hemojaaeigabkbcookmlgmdigohjobjm?hl=pt-BR ).

No cliente MQTT de sua escolha, faça subscribe no tópico “INCB_ESP32_envia_vazao_volume” e observe as medições de vazão e volume total retirado chegarem.

 

Conclusão

Neste artigo, vimos como utilizar um sensor de distância ultrassônico para medir a vazão de um reservatório de água. Tal medida apresenta algumas vantagens com relação ao uso de sensores de fluxo, tais como: ausência da necessidade de calibração, não interrupção a operação do reservatório na instalação e em caso de manutenção do sensor e nenhuma influência exercida na vazão máxima permitida pelo reservatório.

Com os conhecimentos aqui adquiridos, você poderá monitorar, via Internet, as medições de reservatórios de água e, ainda, conseguirá determinar se há vazamentos ou se o consumo de água de um reservatório está dentro do esperado ou não. Dessa forma, projetos interessantes e de grande uso real podem ser feitos, utilizando para isso os benefícios da Internet das Coisas.