Escrito por: Pedro Bertoleti

A água é vida. Parece cliché, mas nunca é demais reforçar a importância daquilo que compõe de 60 a 65% do nosso corpo e 70% da área da superfície do nosso planeta. Logo, não é exagero dizer que monitorar a qualidade da água é algo mais do que fundamental para a vida. Uma das maneiras de se medir a qualidade da água é através de sua turbidez, propriedade física relacionada com a sua transparência. Neste artigo, iremos te mostrar como se medir a turbidez da água utilizando um sensor apropriado, indo desde os fundamentos de turbidez e leitura pura do sensor até a medição da turbidez da água propriamente dita.

 

Material necessário

 

O que é turbidez da água?

A turbidez de um líquido é uma propriedade física do mesmo que determina o quão transparente este é. No caso da turbidez da água, esta tem como utilidade indicar o quão cheia de partículas em suspensão ela está. A turbidez é comumente medida na unidade NTU.

Para o caso da água, partículas em suspensão indicam fatores prejudiciais à sua qualidade para consumo e usos diversos, dos quais podemos citar: crescimento de colônia de bactérias, presença de terra, presença de lama, presença de resíduos químicos danosos à saúde, etc. Portanto, considera-se a turbidez um importante parâmetro físico na avaliação da qualidade da água, seja para consumo humano, irrigação de plantas, piscicultura (quanto mais turva a água, menor a penetração de luz solar na mesma e, por consequência, menor a taxa de desenvolvimento de fitoplânctons, essenciais para a vida e crescimento dos peixes) e demais usos.

A turbidez da água fornecida por distribuidoras é algo garantido em caráter legal, de acordo com a Portaria 1469, de 29/12/2000. A título de exemplo, de acordo com o site Síntese Natural ( http://www.snatural.com.br/ ), fabricante de equipamentos relacionados com tratamento de água, os níveis de turbidez de água recomendados água potável, água subterrânea e piscicultura são expressos na tabela 1.

 UTILIZAÇÃO LIMITES RECOMENDÁVEIS DE TURBIDEZ DA ÁGUA 
 Água Potável  < 0,5 até 5,0 NTU
 Água Subterrânea  < 1,0 NTU
Piscicultura   10 a 40 NTU

Tabela 1 - limites recomendáveis de turbidez de água para usos diversos, de acordo com site http://www.snatural.com.br/ 

 

Sensor de turbidez de água

Para este projeto, será utilizado o sensor de turbidez SKU: SEN0189 ( link: https://www.dfrobot.com/wiki/index.php/Turbidity_sensor_SKU:_SEN0189 ). Este sensor é ilustrado na figura 1.

 

Figura 1 - sensor de turbidez SKU: SEN0189 (imagem obtida de: https://www.dfrobot.com/wiki/index.php/Turbidity_sensor_SKU:_SEN0189)
Figura 1 - sensor de turbidez SKU: SEN0189 (imagem obtida de: https://www.dfrobot.com/wiki/index.php/Turbidity_sensor_SKU:_SEN0189)

 

Trata-se de um sensor comumente encontrado no mercado maker, o que facilita com que hobbistas e makers consigam ter acesso ao mesmo.

Este sensor é composto de duas partes:

 

1. Probe/ponta de prova (parte transparente do sensor, a qual deve ser imersa no líquido que se deseja medir a turbidez).

 

2. Placa de interface e condicionamento de sinal.

De forma simplificada, o funcionamento do sensor pode ser explicado da seguinte maneira: ele possui um emissor e um receptor de luz infravermelha, um em cada lado, conforme ilustra a figura 2.

 

Figura 2 - emissor e receptor de luz infravermelha no sensor de turbidez
Figura 2 - emissor e receptor de luz infravermelha no sensor de turbidez

 

Ao se emitir luz infravermelha, mede-se qual foi o nível de recepção da mesma no receptor, localizado logo à frente do emissor (em um ângulo de 180° com o mesmo). Quanto maior a quantidade de partículas em suspensão na água, maior é a absorção e reflexão da luz infravermelha por parte do líquido e, portanto, mais escura a água tende a ser, elevando-se assim a turbidez da água.

No sensor de turbidez aqui utilizado, tal nível de luz infravermelha capturado é manifestado na forma de uma tensão de saída, variante de 0 a 5V, sendo esta tensão de saída lida na placa de interface e condicionamento de sinal do sensor.

 

Calibração do sensor de turbidez

Antes de seguir em frente com o procedimento de medição de turbidez da água e com o projeto deste artigo em si, precisamos fazer a calibração do sensor de turbidez.

A calibração é um procedimento obrigatório para obtermos medições confiáveis, o que é o coração deste projeto. Em resumo, o procedimento de calibração do sensor consiste em ajustar, através de um trimmer contido no sensor (em destaque na figura 3), a saída de tensão do mesmo para 4,2V em situação de turbidez zero.

 

 

Figura 3 - trimmer para calibração do sensor de turbidez (ajuste da tensão de saída do sensor)
Figura 3 - trimmer para calibração do sensor de turbidez (ajuste da tensão de saída do sensor)

 

 

Você pode ver o procedimento completo de calibração a seguir:

1. Primeiramente, o sensor não deve estar imerso em quaisquer líquidos (deve estar “no ar”).

2. Abra cuidadosamente a ponta de prova / probe sensor. A ponta de prova contém uma proteção para sua placa circuito na forma de um invólucro plástico, que é preso por encaixes plásticos. Tome muito cuidado para não danificar os encaixes ou qualquer parte do invólucro. Tais danos invalidam o uso do sensor, uma vez que com o invólucro danificado este não pode ser mais inserido em quaisquer líquidos.

3. Com a placa circuito da ponta de prova em mãos, conecte-a a placa de interface e condicionamento de sinal e alimente a mesma com 5V.

4. Meça a saída de tensão do sensor (disponível na placa de interface e condicionamento de sinal) enquanto gira o trimmer com a ajuda de uma pequena chave de fenda ou faca de ponta fina. Faça este procedimento até que a tensão medida na saída do sensor seja igual a 4,2V. Atingida esta tensão de saída, a calibração está finalizada.

5. Remonte a ponta de prova (coloque a sua placa de circuito no invólucro). O sensor está calibrado e pronto para uso.

 

 

Procedimento de medição da turbidez da água

De acordo com as informações do fabricante no site https://www.dfrobot.com/wiki/index.php/Turbidity_sensor_SKU:_SEN0189  , a turbudez em NTU pode ser obtida através de uma função de parábola, conforme mostrado na figura 4.

No caso, a variável X da parábola corresponde à tensão medida do sensor e a variável Y a turbidez propriamente dita (em NTU). Logo, o cálculo da turbidez no qual o líquido está inserido é simples e facilmente executado por qualquer processador.

 

Figura 4 - turbidez (eixo y) em função da tensão de saída do sensor (eixo x). Imagem obtida de: https://www.dfrobot.com/wiki/index.php/Turbidity_sensor_SKU:_SEN0189
Figura 4 - turbidez (eixo y) em função da tensão de saída do sensor (eixo x). Imagem obtida de: https://www.dfrobot.com/wiki/index.php/Turbidity_sensor_SKU:_SEN0189

 

 

Porém, como no caso de qualquer sensor com saída analógica, a leitura do sensor de turbidez pode apresentar uma certa oscilação/ruído, o qual deve ser minimizado o quanto for possível em prol de uma boa medição. Para filtrar esta tensão de saída do sensor de turbidez, vamos utilizar um método chamado média móvel.

A média móvel funciona, de forma simplificada e objetiva, da seguinte maneira:

 

Figura 5 – Média móvel
Figura 5 – Média móvel

 

1. Primeiro, ao se iniciar o programa, carrega-se um conjunto de medições de tensão (um buffer, representado por um array de float) com leituras sucessivas da tensão de saída do sensor.

É muito importante que estas informações sejam valores reais das saídas de tensão do sensor.

2. Feito este preenchimento, na próxima medição (medição útil) de tensão de saída, o buffer deve ser todas suas medições deslocadas para a posição imediatamente anterior, fazendo com que a medição na posição 0 seja descartada e a medição útil inserida na última posição do buffer.

3. Uma vez composto o buffer conforme o item anterior, é feita a média simples de todos os valores do array, resultando assim na média móvel ou, neste caso, do valor filtrado da tensão de saída do sensor a ser considerado.

 

Para entender melhor o conceito da média móvel como filtragem, pense na mesma de forma macro. Em um nível mais macro, este procedimento faz com que o buffer de medições vá acompanhando a tendência do sinal ao longo do tempo (com um pequeno atraso, proporcional ao tamanho do buffer), utilizando do cálculo da média para minimizar picos/spikes, filtrando assim o sinal.

Este método é bastante utilizado em tratamento de leituras de sensores diversos com saídas analógicas, pois trata-se de um método eficaz, matematicamente e computacionalmente simples (logo, com menor tempo de execução por parte do processador, algo valioso em se tratando de sistemas embarcados) e de fácil e rápida implementação. Para mais detalhes de como a média móvel funciona, recomendo fortemente assistir a este ótimo vídeo do Wagner Rambo: https://youtu.be/cxPQ0AMQ5bo

Para o projeto deste artigo, um buffer de 50 medições para cálculo da média móvel se mostrou eficaz e eficiente. Você também pode testar diferentes valores e observar o comportamento final.

 

Medição da turbidez com Arduino

Para a medição da turbidez, será utilizado o módulo WiFi LoRa 32(V2), que pode ser visto em detalhes neste nosso artigo ( http://www.newtoncbraga.com.br/index.php/microcontrolador/143-tecnologia/16326-moduloesp32-heltech-mec218 ).

 

Circuito esquemático

O circuito esquemático do projeto deste artigo encontra-se na figura 6.

 

Importante:

1) NÃO SE ESQUEÇA (NEM ALTERE OS VALORES) do divisor resistivo ligado ao canal do ADC. Ele faz com que a tensão de saída do sensor não ultrapasse os limites suportados pelo ADC do módulo (3,3V). A conversão da tensão lida para o range real de 0 a 5V é feita via software.

2) Os canais do ADC 1 (ADC_1) do módulo se mostrou inadequado para medições de precisão como a exigida neste artigo. Já os canais do ADC 2 (ADC_2) se mostraram muito melhores e muito mais estáveis (inclusive na resolução máxima do ADC, 12 bits). Por esse motivo, o sensor de turbidez é lido no ADC 2 (canal 4 do mesmo).

 

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

 

 

Código-fonte

O código-fonte do projeto está abaixo.

Leia atentamente os comentários para maior compreensão do mesmo.

/* Includes para header files das bibliotecas do OLED */
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
/* Endereço I2C do display */
#define OLED_ADDR 0x3c
/* distância, em pixels, de cada linha em relação ao topo do display */
#define OLED_LINE1 0
#define OLED_LINE2 10
#define OLED_LINE3 20
#define OLED_LINE4 30
#define OLED_LINE5 40
/* Configuração da resolução do display (este módulo possui display 128x64) */
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
/* Definições do buffer (para filtro de média móvel) */
#define TAMANHO_BUFFER 50
/* Definições da leitura do sensor de turbidez */
#define ADC_MAX 4095 /* ADC do modulo WiFi LoRa 32(V2) tem 12 bits de resolucao */
#define ENTRADA_ANALOGICA_SENSOR_TURBIDEZ 13 /* GPIO 13 => ADC2_CH4 */
#define TENSAO_MAXIMA_SAIDA_SENSOR_TURBIDEZ 5 /* Sensor apresenta saida analogica de 0 a 5V */
#define FATOR_DIVISOR_TENSAO 10 /* No projeto, para serem respeitados os limites de operaçao do 
ADC e fazer com que a tensão do sensor excursione corretamente em
todo seu range, ha um divisor resistivo para que a tensão lida pelo
canal do ADC utilizado seja igual a 10% da tensão real de saída do sensor. 
Portanto, no cálculo da tensão real, este fator é utilizado
para se recuperar corretamente este valor */
#define NUM_LEITURAS_OVERSAMPLING 512 
/* Objeto do display */
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, 16);
/* Variáveis globais */
float buffer_tensao_sensor_turbidez[TAMANHO_BUFFER];
/* Protótipos */
float le_tensao_sensor_turbidez_sem_filtro(void);
float le_tensao_sensor_turbidez_com_filtro(void);
float le_turbidez_da_agua(void);
/* Função: faz a leitura da tensão de saída do sensor de turbidez (sem filtro)
* Parâmetros: nenhum 
* Retorno: tensão de saída (de 0 até 5V)
*/
float le_tensao_sensor_turbidez_sem_filtro(void)
{
   float tensao_saida_sensor = 0.0;
   int leitura_adc = 0;
   /* Faz a leitura do canal do ADC do modulo que a saida do sensor de turbidez está ligado */
   leitura_adc = analogRead(ENTRADA_ANALOGICA_SENSOR_TURBIDEZ);
   /* converte a leitura do ADC (canal onde está ligada a saída do sensor de turbidez) em uma tensão de leitura de 0 a 5V */
   tensao_saida_sensor = ((leitura_adc/(float)ADC_MAX)*(float)TENSAO_MAXIMA_SAIDA_SENSOR_TURBIDEZ);
   Serial.print("Tensao de saida (no divisor): ");
   Serial.print(tensao_saida_sensor);
   Serial.println("V");
   tensao_saida_sensor = tensao_saida_sensor*FATOR_DIVISOR_TENSAO; /* Corrige a leitura com base no divisor resistivo utilizado */
   return tensao_saida_sensor;
}
/* Função: faz a leitura da tensao de saida do sensor de turbidez (com filtro)
* Parâmetros: nenhum 
* Retorno: tensão de saída (de 0 até 5V)
*/
float le_tensao_sensor_turbidez_com_filtro(void)
{
   float tensao_saida_sensor = 0.0;
   int leitura_adc = 0;
   long soma_leituras_adc = 0; 
   int i = 0;
   float soma = 0.0;
   float tensao_filtrada = 0.0;
   /* Faz a leitura do canal do ADC do modulo que a saída do sensor de turbidez está ligado */
   /* Para amenizar efeitos de leituras ruidosas / com oscilações, um oversampling é feito */
   soma_leituras_adc = 0;
   for (i=0; i<NUM_LEITURAS_OVERSAMPLING; i++)
      soma_leituras_adc = soma_leituras_adc + analogRead(ENTRADA_ANALOGICA_SENSOR_TURBIDEZ);
   leitura_adc = soma_leituras_adc/NUM_LEITURAS_OVERSAMPLING;
   /* converte a leitura do ADC (canal onde está ligada a saída do sensor de turbidez) em uma tensão de leitura de 0 a 5V */
   tensao_saida_sensor = ((leitura_adc/(float)ADC_MAX)*(float)TENSAO_MAXIMA_SAIDA_SENSOR_TURBIDEZ);
   Serial.print("Counts de ADC: ");
   Serial.println(leitura_adc);
   Serial.print("Tensao de saida (no divisor): ");
   Serial.print(tensao_saida_sensor);
   Serial.println("V");
   tensao_saida_sensor = tensao_saida_sensor*FATOR_DIVISOR_TENSAO; /* Corrige a leitura com base no divisor resistivo utilizado */
   /* Desloca para a esquerda todas as medidas de tensão já feitas */
   for(i=1; i<TAMANHO_BUFFER; i++)
      buffer_tensao_sensor_turbidez[i-1] = buffer_tensao_sensor_turbidez[i];
   /* Insere a nova medida na última posição do buffer */
   buffer_tensao_sensor_turbidez[TAMANHO_BUFFER-1] = tensao_saida_sensor;
   /* Calcula a média do buffer (valor da média móvel, ou valor filtrado) */
   soma = 0.0;
   tensao_filtrada = 0.0;
   for(i=0; i<TAMANHO_BUFFER; i++)
      soma = soma + buffer_tensao_sensor_turbidez[i];
   tensao_filtrada = soma/TAMANHO_BUFFER;
   return tensao_filtrada;
}
/* Função: faz a leitura da turbidez da agua
* Parâmetros: nenhum 
* Retorno: turbidez da água (em NTU)
*/
float le_turbidez_da_agua(void)
{
   float turbidez_agua = 0.0;
   float tensao_filtrada = 0.0;
   float primeiro_fator = 0.0;
   float segundo_fator = 0.0;
   float terceiro_fator = 0.0;
   /* Faz a leitura da tensão filtrada do sensor de turbidez */
   tensao_filtrada = le_tensao_sensor_turbidez_com_filtro();
   /* Limita a tensão a máxima permitida pelo sensor */
   if (tensao_filtrada > 4.2)
      tensao_filtrada = 4.2;
   Serial.print("Tensao de saida do sensor de turbidez: ");
   Serial.print(tensao_filtrada);
   Serial.println("V");
   /* Calcula a turbidez */
   primeiro_fator = ((-1)*(1120.4) * tensao_filtrada * tensao_filtrada);
   segundo_fator = (5742.3 * tensao_filtrada);
   terceiro_fator = ((-1)*4352.9);
   turbidez_agua = primeiro_fator + segundo_fator + terceiro_fator;
   return turbidez_agua; 
}
/* Função setup */
void setup()
{
   int i;
   Serial.begin(115200);
   /* Configura ADC em sua resolução máxima (12 bits) */
   analogReadResolution(12);
   /* Inicializa buffer de leituras de tensão do sensor de turbidez  (para inicializar o buffer do filtro de média móvel)*/
   for(i=0; i<TAMANHO_BUFFER; i++)
      buffer_tensao_sensor_turbidez[i] = le_tensao_sensor_turbidez_sem_filtro(); 
   /* inicializa display OLED */
   Wire.begin(4, 15);
   if(!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR))
      Serial.println("Display OLED: falha ao inicializar");
   else
      {
         Serial.println("Display OLED: inicializacao ok");
        /* Limpa display e configura tamanho de fonte */
        display.clearDisplay();
        display.setTextSize(1);
        display.setTextColor(WHITE);
      }
}
/* Programa principal */
void loop()
{
   float turbidez_da_agua = 0.0;
   char str_turbidez_agua[30] = {0};
   /* Faz a leitura da turbidez da água (em NTU) */
   turbidez_da_agua = le_turbidez_da_agua();
   /* Cria uma string do valor da turbidez da água lida (com 2 casas decimais) */
   sprintf(str_turbidez_agua, "%.2fNTU", turbidez_da_agua);
   /* Exibe a turbidez da agua no display OLED */
   display.clearDisplay();
   display.setCursor(0, OLED_LINE1);
   display.println("Turbidez da agua:");
   display.setCursor(0, OLED_LINE2);
   display.print(str_turbidez_agua);
   display.display();
}

 

Conclusão

Neste artigo, vimos o que significa e o quão importante é a turbidez da água. Além disso, foi demonstrado com detalhes como se utilizar um sensor comum do mercado maker para medir a turbidez em NTU.

Em suma, este artigo serve como base para sistemas mais complexos e abrangentes, como por exemplo sistemas de monitoramento de qualidade da água com IoT e monitoramento de rios em caso de desastres de alto impacto ambiental (como foi o caso recente de Brumadinho-MG).