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
- Para fazer o projeto deste artigo você precisará de:
- Um módulo WiFi LoRa 32(V2)
- Um sensor de turbidez SKU: SEN0189
- Dois resistores de 18k 1/4W
- Dois resistores de 2k 1/4W
- Protoboard de 400 pontos ou maior
- Jumpers macho-macho
- Cabo micro-USB
- Opcional (caso quiser deixar o projeto rodar sem conexão com o computador): fonte chaveada 5V/2A micro-USB
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.
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.
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.
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.
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:
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).
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).