Como Monitorar a Turbidez da Água com Arduino e Sensor de Turbidez
A turbidez está relacionada à presença de partículas em suspensão na água. Quanto maior a quantidade dessas partículas, mais turva ela pode parecer. Com um sensor de turbidez e um Arduino, podemos acompanhar essa variação e criar uma classificação simples para representar diferentes condições da água.
Neste tutorial, vamos desenvolver um projeto utilizando um Arduino Uno, um Sensor de Turbidez, um Display LCD 16×2 com comunicação I2C e três LEDs. O LCD será responsável por informar o estado identificado pelo sensor, enquanto os LEDs funcionarão como uma indicação visual semelhante a um semáforo:
- LED verde: água cristalina;
- LED amarelo: água turva;
- LED vermelho: água muito suja.
Para demonstrar o funcionamento, começaremos colocando o sensor em um recipiente com água limpa. Em seguida, adicionaremos gradativamente água suja ao recipiente. Conforme a turbidez aumentar, a leitura analógica será alterada e o Arduino atualizará automaticamente o estado mostrado no display e o LED correspondente.
Importante: este projeto realiza uma classificação experimental com base na leitura do sensor. Ele não determina se uma água é potável ou própria para consumo.
Materiais Necessários
Para desenvolver o projeto, serão utilizados:
- 1 x Placa UNO SMD R3 Atmega328 compatível com Arduino UNO;
- 1x Módulo Sensor de Turbidez de Partículas Suspensas na Água;
- 1x Display LCD 16×02 com módulo I2C;
- 1x LED verde;
- 1x LED amarelo;
- 1x LED vermelho;
- 3x resistores de 220 Ω ou 330 Ω;
- Jumpers Macho x Macho;
- Jumpers Macho x Fêmea;
- Protoboard;
- Cabo USB Tipo A – B Compatível com Arduino Uno;
- 1 recipiente transparente;
- Água cristalina;
- Água com partículas ou impurezas para realização do teste.
Os resistores conectados aos LEDs são recomendados para limitar a corrente elétrica e proteger tanto os LEDs quanto as saídas digitais do Arduino.
Esquemático de Ligação dos Componentes
Para realizar a montagem, conecte os componentes ao Arduino Uno conforme a tabela abaixo.
| Componente | Pino do componente | Arduino Uno |
|---|---|---|
| Módulo Sensor de Turbidez | V – (VCC) | 5V |
| Módulo Sensor de Turbidez | G – (GND) | GND |
| Módulo Sensor de Turbidez | A – (Saída analógica) | A0 |
| LCD 16×2 I2C | VCC | 5V |
| LCD 16×2 I2C | GND | GND |
| LCD 16×2 I2C | SDA | A4 / SDA |
| LCD 16×2 I2C | SCL | A5 / SCL |
| LED Verde | Ânodo (+) | D5 |
| LED Amarelo | Ânodo (+) | D6 |
| LED Vermelho | Ânodo (+) | D7 |
| LEDs | Cátodo (-) | GND através de resistor |
Nos três LEDs, conecte o terminal negativo ao GND. O terminal positivo deve ser conectado ao respectivo pino digital utilizando um resistor limitador de corrente.
O sensor será lido pela entrada analógica A0. Já o display LCD utilizará a comunicação I2C do Arduino Uno por meio dos pinos SDA e SCL.

Caso o módulo do seu sensor possua saídas identificadas como A (Analóagico) e D (Digital), neste projeto utilizamos a saída A, pois precisamos acompanhar a variação da leitura analógica.
Configurações Iniciais
Antes de carregar o programa, conecte o Arduino Uno ao computador utilizando um cabo USB e abra a Arduino IDE. Dentro do Arduino IDE, siga o caminho:
Ferramentas > Placa > Arduino AVR Boards > Arduino Uno

Depois, em:
Ferramentas > Porta
selecione a porta correspondente ao Arduino conectado ao computador.
Instalando a biblioteca do LCD
O projeto utiliza a biblioteca “LiquidCrystal_I2C”, ela é responsável pela comunicação entre o Arduino e o módulo I2C conectado ao display LCD 16×2.
Na Arduino IDE, abra o Gerenciador de Bibliotecas, pesquise por LiquidCrystal_I2C e instale a biblioteca.

Neste projeto, o endereço I2C utilizado para o display é o “0x27”, mas o seu pode ser diferente. Para verificar qual o endereço do seu display, acesse nosso tutorial como-utilizar-o-display-lcd-16×02-com-modulo-i2c-no-arduino.
Elaborando o Código
O programa realiza continuamente uma leitura analógica do sensor e compara o valor encontrado com três intervalos.
Foram utilizados os seguintes valores de referência:
- Acima de 700: água cristalina;
- Entre 601 e 700: água turva;
- 600 ou menos: água muito suja.
Esses valores foram utilizados no teste deste projeto e podem variar de acordo com o sensor, montagem e condições utilizadas durante o experimento.
Código completo
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Endereço I2C mais comum para o display LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pino utilizado para leitura analógica do sensor
int sensorPin = A0;
// Armazena a leitura analógica do sensor
int leitura;
// LEDs de indicação
int LedVerde = 5;
int LedAmarelo = 6;
int LedVermelho = 7;
void setup() {
pinMode(LedVerde, OUTPUT);
pinMode(LedAmarelo, OUTPUT);
pinMode(LedVermelho, OUTPUT);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sensor Turbidez");
lcd.setCursor(0, 1);
lcd.print("Iniciando...");
delay(1000);
lcd.clear();
}
void loop() {
// Realiza a leitura analógica do sensor
leitura = analogRead(sensorPin);
lcd.setCursor(0, 0);
lcd.print("Estado da Agua:");
// Água cristalina
if (leitura > 700) {
lcd.setCursor(0, 1);
lcd.print("Cristalina ");
digitalWrite(LedVermelho, LOW);
digitalWrite(LedAmarelo, LOW);
digitalWrite(LedVerde, HIGH);
}
// Água turva
else if (leitura > 600) {
lcd.setCursor(0, 1);
lcd.print("Turva ");
digitalWrite(LedVermelho, LOW);
digitalWrite(LedVerde, LOW);
digitalWrite(LedAmarelo, HIGH);
}
// Água muito suja
else {
lcd.setCursor(0, 1);
lcd.print("Muito Suja ");
digitalWrite(LedAmarelo, LOW);
digitalWrite(LedVerde, LOW);
digitalWrite(LedVermelho, HIGH);
}
delay(500);
}
Entendendo o código
Primeiramente, são incluídas as bibliotecas necessárias para o funcionamento da comunicação I2C e do display:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
Em seguida, configuramos o LCD como um display de 16 colunas e 2 linhas, utilizando o endereço I2C 0x27:
LiquidCrystal_I2C lcd(0x27, 16, 2); //UTILIZE O ENDEREÇO DO SEU DISPLAY
O Sensor de Turbidez será conectado à entrada analógica A0:
int sensorPin = A0;
Também definimos os pinos utilizados pelos LEDs:
int LedVerde = 5;
int LedAmarelo = 6;
int LedVermelho = 7;
No setup(), os três pinos são configurados como saídas:
pinMode(LedVerde, OUTPUT);
pinMode(LedAmarelo, OUTPUT);
pinMode(LedVermelho, OUTPUT);
Depois, inicializamos o display e ativamos sua iluminação:
lcd.init();
lcd.backlight();
Ao ligar o projeto, uma mensagem é apresentada durante aproximadamente um segundo:
lcd.setCursor(0, 0);
lcd.print("Sensor Turbidez");
lcd.setCursor(0, 1);
lcd.print("Iniciando...");
Depois dessa inicialização, o Arduino passa a executar continuamente o conteúdo da função loop().
Realizando a leitura do sensor
A leitura analógica é realizada com:
leitura = analogRead(sensorPin);
Esse valor é armazenado na variável leitura e utilizado para determinar qual estado será apresentado.
Água cristalina
Quando a leitura for superior a 700, o programa classifica a água como Cristalina:
if (leitura > 700)
O display mostrará: “Cristalina”, e somente o LED verde permanece aceso.
Água turva
Quando a leitura estiver acima de 600 e não for maior que 700, a água será classificada como Turva:
else if (leitura > 600)
Nesse estado, o LED verde é desligado e o LED amarelo é aceso.
Água muito suja
Para valores iguais ou inferiores a 600, o programa entra na última condição:
else
O display apresentará: “Muito Suja”, e somente o LED vermelho ficará aceso.
Tempo entre as medições
Ao final do programa temos:
delay(500);
Isso faz com que uma nova atualização seja realizada aproximadamente a cada meio segundo, evitando que a informação apresentada no display seja alterada rapidamente demais.
Vídeo demonstrativo
“VÍDEO”
Dessa maneira, é possível observar visualmente a alteração da água e acompanhar simultaneamente a resposta do sensor, do LCD e dos LEDs.
Ajustando os valores do Sensor de Turbidez
Os limites 700 e 600 utilizados no programa foram definidos a partir do comportamento observado durante este experimento.
Isso significa que eles não devem ser considerados valores universais para todos os sensores ou amostras de água.
Se você estiver reproduzindo o projeto, pode realizar seus próprios testes com água limpa e água progressivamente mais turva para encontrar os valores que funcionam melhor com o seu sensor.
Por exemplo, os valores podem ser alterados diretamente nestas linhas:
if (leitura > 700)
e:
else if (leitura > 600)
Alterando esses números, você modifica os pontos nos quais o programa muda entre os estados Cristalina, Turva e Muito Suja.
Essa é também uma ótima forma de experimentar com o projeto e compreender melhor como uma leitura analógica pode ser transformada em informações úteis pelo Arduino.
Aplicações e Possíveis Melhorias
O projeto apresentado é uma forma prática de estudar sensores analógicos, leitura de dados e representação de informações utilizando Arduino.
Como evolução do projeto, é possível:
- realizar uma calibração mais detalhada do sensor;
- mostrar no LCD também o valor da leitura analógica;
- utilizar mais faixas de classificação;
- armazenar as leituras para acompanhar as alterações ao longo do tempo;
- adicionar alertas sonoros com um Buzzer;
- utilizar uma placa com conectividade para acompanhar os valores remotamente (IoT).
É importante lembrar que a classificação utilizada neste tutorial tem finalidade experimental e educacional. A indicação “Cristalina”, por exemplo, representa apenas a faixa de leitura definida no programa e não comprova que uma amostra seja própria para consumo.
Espero que tenha gostado do tutorial. Caso tenha dúvidas ou sugestões, deixe um comentário abaixo.
Valeu!
Graduando em Engenharia da Computação.

