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;
- 1 x Módulo Sensor de Turbidez de Partículas Suspensas na Água;
- 1 x Display LCD 16×02 com módulo I2C;
- 1 x LED verde, 1 x LED amarelo e 1 x LED vermelho;
- 3 x resistores de 220 Ω ou 330 Ω;
- Jumpers Macho x Macho e Jumpers Macho x Fêmea;
- Protoboard;
- Cabo USB Tipo A/B compatível com Arduino Uno;
- 1 recipiente transparente, água cristalina e água com impurezas para o teste.
Esquemático de Ligação dos Componentes
Para realizar a montagem, conecte os componentes ao Arduino Uno conforme a tabela abaixo.
O display LCD utiliza o protocolo I2C para se comunicar com o Arduino. Esse protocolo usa apenas dois fios: SDA (transferência de dados) e SCL (sinal de clock para sincronização). Cada dispositivo I2C possui um endereço único que o identifica na comunicação.
| 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 |
Os resistores conectados aos LEDs são obrigatórios para limitar a corrente elétrica. Sem eles, o LED pode queimar e o pino digital do Arduino pode ser danificado. Conecte o resistor em série entre o pino do Arduino e o ânodo (perna mais longa, polo positivo) do LED. O cátodo (perna mais curta, polo negativo) vai direto ao GND.
O sensor será lido pela entrada analógica A0. 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ógico) 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 da 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, responsável pela comunicação entre o Arduino e o módulo I2C do 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 é 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 módulo I2C no Arduino.
Testando o Sensor Antes de Montar Tudo
Antes de montar o circuito completo, vale testar o sensor de turbidez sozinho. Isso confirma que o sensor está funcionando corretamente e permite observar os valores que ele retorna com água limpa e com água turva, o que facilita a escolha dos limites usados no programa.
Para o teste, conecte apenas o sensor ao Arduino: VCC ao 5V, GND ao GND e o pino de saída analógica ao pino A0. Depois, carregue o sketch abaixo:
Atenção: o sketch abaixo serve apenas para verificar se o sensor está lendo corretamente. Ele não usa LCD nem LEDs e não é o programa final do projeto.
int sensorPin = A0;
int leitura;
void setup() {
Serial.begin(9600);
}
void loop() {
leitura = analogRead(sensorPin);
Serial.print("Leitura do sensor: ");
Serial.println(leitura);
delay(500);
}
Abra o Monitor Serial em Ferramentas > Monitor Serial e configure a velocidade para 9600 baud. Com o sensor na água limpa, observe o valor exibido. Em seguida, adicione impurezas à água e acompanhe a variação dos números. Se os valores mudarem conforme a turbidez aumenta, o sensor está funcionando corretamente e você está pronto para montar o projeto completo.
Elaborando o Código
Com o sensor testado e o circuito montado, é hora de programar o Arduino. O programa lê continuamente o sensor de turbidez e compara o valor encontrado com três faixas para determinar o estado da água.
Os valores de referência utilizados neste projeto são:
- Acima de 700: água cristalina;
- Entre 601 e 700: água turva;
- 600 ou menos: água muito suja.
Esses valores foram definidos a partir dos testes realizados neste projeto e podem variar de acordo com o sensor e as condições do experimento. A seguir, o código é apresentado em três blocos para facilitar o aprendizado. Cada bloco é um fragmento do programa completo e serve apenas para estudo da lógica. O código final, pronto para carregar no Arduino, está ao final desta seção.
Bloco 1: Declarações e Bibliotecas
O programa começa incluindo as bibliotecas necessárias e declarando todas as variáveis usadas ao longo do código.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Endereço I2C e configuração do display (16 colunas, 2 linhas)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pino de leitura analógica do sensor
int sensorPin = A0;
int leitura;
// Pinos dos LEDs
int LedVerde = 5;
int LedAmarelo = 6;
int LedVermelho = 7;
A biblioteca Wire.h gerencia a comunicação I2C e a LiquidCrystal_I2C.h controla o display. A linha LiquidCrystal_I2C lcd(0x27, 16, 2) cria o objeto do display informando o endereço I2C e o tamanho da tela (16 colunas e 2 linhas). Os pinos 5, 6 e 7 são reservados para os LEDs verde, amarelo e vermelho.
Bloco 2: Inicialização no setup()
A função setup() é executada uma única vez quando o Arduino é ligado. Ela configura os pinos dos LEDs como saída e inicializa o display com uma mensagem de boas-vindas.
void setup() {
// Configurar pinos dos LEDs como saída
pinMode(LedVerde, OUTPUT);
pinMode(LedAmarelo, OUTPUT);
pinMode(LedVermelho, OUTPUT);
// Inicializar o display e ligar a iluminação de fundo
lcd.init();
lcd.backlight();
lcd.clear();
// Exibir mensagem de inicialização
lcd.setCursor(0, 0);
lcd.print("Sensor Turbidez");
lcd.setCursor(0, 1);
lcd.print("Iniciando...");
delay(1000);
lcd.clear();
}
Os três pinos dos LEDs são configurados como saída com pinMode(). O display é inicializado com lcd.init() e a iluminação de fundo é ligada com lcd.backlight(). A mensagem “Iniciando…” fica visível por 1 segundo. Atenção: a função delay() recebe o tempo em milissegundos, portanto delay(1000) equivale a 1 segundo e delay(500) equivale a meio segundo.
Bloco 3: Lógica Principal no loop()
A função loop() é executada continuamente enquanto o Arduino estiver ligado. A cada ciclo, ela lê o sensor e decide qual estado exibir no LCD e qual LED acender.
void loop() {
leitura = analogRead(sensorPin);
lcd.setCursor(0, 0);
lcd.print("Estado da Agua:");
if (leitura > 700) {
lcd.setCursor(0, 1);
lcd.print("Cristalina ");
digitalWrite(LedVermelho, LOW);
digitalWrite(LedAmarelo, LOW);
digitalWrite(LedVerde, HIGH);
}
else if (leitura > 600) {
lcd.setCursor(0, 1);
lcd.print("Turva ");
digitalWrite(LedVermelho, LOW);
digitalWrite(LedVerde, LOW);
digitalWrite(LedAmarelo, HIGH);
}
else {
lcd.setCursor(0, 1);
lcd.print("Muito Suja ");
digitalWrite(LedAmarelo, LOW);
digitalWrite(LedVerde, LOW);
digitalWrite(LedVermelho, HIGH);
}
delay(500);
}
A leitura do sensor é feita com analogRead(sensorPin), que retorna um número entre 0 e 1023. Quanto mais turva a água, menor o valor retornado. O programa usa três condições if/else if/else para comparar o valor lido com os limites definidos e atualizar o LCD e os LEDs. Os dois LEDs que não correspondem ao estado atual são sempre apagados antes de acender o correto, garantindo que apenas um LED fique aceso por vez.
Código Completo
Com a lógica compreendida em partes, veja abaixo o programa completo pronto para carregar no Arduino:
#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);
}
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 e não devem ser considerados valores universais para todos os sensores ou amostras de água.
Se você estiver reproduzindo o projeto, realize seus próprios testes com água limpa e água progressivamente mais turva para encontrar os valores que funcionam melhor com o seu sensor. Use o sketch de teste da seção anterior para observar os valores antes de montar o circuito completo.
Para ajustar, altere diretamente os números nestas linhas do programa:
if (leitura > 700) // altere 700 conforme seus testes
else if (leitura > 600) // altere 600 conforme seus testes
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 entender 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, é 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!
📅 Última atualização: 21/08/2026 às 11:25
Graduando em Engenharia da Computação.

