Sensor de Nível de Água HW-038 com ESP8266
Saber se um reservatório está cheio, pela metade ou quase vazio é uma das aplicações mais úteis (e mais simples) da eletrônica embarcada. Neste artigo você vai aprender a conectar o sensor de nível de água HW-038 a uma placa Wemos D1 R1 (ESP8266), ler o valor analógico e convertê-lo em porcentagem de nível no Monitor Serial.
1. O que é o sensor HW-038?
O HW-038 é um módulo barato de detecção de nível de água. Ele possui uma placa com várias trilhas de cobre expostas, intercaladas entre trilhas de alimentação e trilhas de sinal. Quanto mais da placa estiver mergulhada, mais trilhas são “curto-circuitadas” pela água, e maior a condutividade entre elas. Esse efeito é convertido em uma tensão analógica no pino de sinal (S).
| Característica | Valor típico |
|---|---|
| Tensão de operação | 3,3 V a 5 V |
| Tipo de saída | Analógica (pino S) |
| Pinos | S (sinal), + (VCC), − (GND) |
| Princípio | Condutividade entre trilhas expostas |
| Área de detecção | Poucos centímetros (a altura da placa) |
2. Materiais necessários
- 1 placa Wemos D1 R1 (ESP8266)
- 1 sensor de nível de água HW-038
- 3 jumpers macho-fêmea
- Cabo USB para programação
- Arduino IDE com o suporte à placa ESP8266 instalado
- Um copo ou recipiente com água para os testes
3. Sobre a entrada analógica da Wemos D1 R1
A Wemos D1 R1 tem o formato da Arduino UNO, mas o cérebro é um ESP8266, que possui apenas uma entrada analógica (A0). O ADC do chip lê internamente de 0 a 1 V; a placa já traz um divisor de tensão que amplia a faixa de entrada para 0 a 3,3 V, e o resultado é um valor inteiro de 0 a 1023 (10 bits).
3V3 da placa). Assim, o sinal do sensor nunca ultrapassa a faixa suportada pela entrada A0. Alimentar com 5 V pode levar o sinal acima de 3,3 V e danificar a entrada analógica.4. Ligação (esquema de conexão)
| HW-038 | Wemos D1 R1 |
|---|---|
| S (sinal) | A0 |
| + (VCC) | 3V3 |
| − (GND) | GND |
5. Configurando a Arduino IDE
- Em Arquivo > Preferências, adicione a URL do gerenciador de placas ESP8266 (
http://arduino.esp8266.com/stable/package_esp8266com_index.json). - Em Ferramentas > Placa > Gerenciador de Placas, instale esp8266.
- Selecione a placa LOLIN(WEMOS) D1 R1.
- Escolha a porta COM correta e defina o Monitor Serial em 115200 baud.
6. O programa de exemplo
const int pinoSensor = A0;
int valorLido = 0;
void setup() {
Serial.begin(115200);
pinMode(pinoSensor, INPUT);
}
void loop() {
// Lê o valor analógico (0 a 1023)
valorLido = analogRead(pinoSensor);
// Converte para porcentagem aproximada (opcional)
// 1023 costuma ser totalmente seco e valores baixos (~300) totalmente molhado
int porcentagem = map(valorLido, 1023, 300, 0, 100);
porcentagem = constrain(porcentagem, 0, 100);
Serial.print("Valor Analógico: ");
Serial.print(valorLido);
Serial.print(" | Nivel: ");
Serial.print(porcentagem);
Serial.println("%");
delay(2000); // Aguarda 2 segundos para a próxima leitura
}7. Entendendo o código linha a linha
Declaração das variáveis
const int pinoSensor = A0; dá um nome ao pino de leitura, o que deixa o código mais legível. valorLido guarda o resultado bruto do conversor analógico-digital.
setup()
Serial.begin(115200) inicia a comunicação serial na velocidade padrão do ESP8266. A linha pinMode(pinoSensor, INPUT) é opcional no ESP8266, pois A0 já é exclusivamente entrada, mas deixa explícita a intenção do programa.
analogRead()
analogRead(pinoSensor) retorna um número de 0 a 1023, proporcional à tensão no pino A0 (0 V a 3,3 V).
map() e constrain()
A função map(valor, deMin, deMax, paraMin, paraMax) converte uma faixa de valores em outra. No exemplo, o intervalo 1023 → 300 é convertido para 0 → 100 %. Como o sensor pode ler valores fora desse intervalo, o constrain(porcentagem, 0, 100) garante que o resultado nunca saia de 0 a 100.
Saída serial e delay()
O programa imprime o valor bruto e a porcentagem, e aguarda 2 segundos antes de repetir. Como o nível de um reservatório muda devagar, uma leitura a cada 2 s é suficiente.
8. Calibração: o passo mais importante
Os valores 1023 e 300 usados no map() são estimativas. Cada sensor, cada tipo de água e cada tensão de alimentação resultam em números diferentes. Além disso, em muitos módulos HW-038 a leitura aumenta conforme o sensor é mergulhado (mais água, mais condução, mais tensão no pino S), o que é o contrário do que o comentário do código sugere. Por isso, teste o seu e ajuste.
- Carregue o programa e abra o Monitor Serial.
- Com o sensor seco, anote o valor lido (ex.:
VALOR_SECO). - Mergulhe o sensor até a marca máxima e anote o valor (ex.:
VALOR_MOLHADO). - Troque os números no
map()pelos valores que você mediu:
int porcentagem = map(valorLido, VALOR_SECO, VALOR_MOLHADO, 0, 100);O map() funciona nos dois sentidos: se o valor sobe com a água, basta colocar o menor número primeiro (por exemplo, map(valorLido, 0, 600, 0, 100), se o seco for 0 e o molhado for 600).
9. Versão melhorada: média de leituras e alimentação sob demanda
O HW-038 tem um ponto fraco: com corrente contínua passando pelas trilhas, o cobre sofre oxidação e corrosão (eletrólise), e o sensor perde a precisão com o tempo. Uma solução simples é alimentá-lo por um pino digital e ligá-lo apenas no instante da leitura. Aproveitamos também para tirar a média de várias amostras e reduzir o ruído.
const int pinoSensor = A0;
const int pinoPower = D7; // GPIO13: alimenta o sensor só na leitura
// Ajuste com os valores medidos na sua calibração
const int VALOR_SECO = 0;
const int VALOR_MOLHADO = 600;
int lerSensor() {
digitalWrite(pinoPower, HIGH); // liga o sensor
delay(10); // estabiliza a leitura
long soma = 0;
for (int i = 0; i < 10; i++) {
soma += analogRead(pinoSensor);
delay(5);
}
digitalWrite(pinoPower, LOW); // desliga o sensor
return soma / 10;
}
void setup() {
Serial.begin(115200);
pinMode(pinoPower, OUTPUT);
digitalWrite(pinoPower, LOW);
}
void loop() {
int valorLido = lerSensor();
int porcentagem = map(valorLido, VALOR_SECO, VALOR_MOLHADO, 0, 100);
porcentagem = constrain(porcentagem, 0, 100);
Serial.print("Valor Analógico: ");
Serial.print(valorLido);
Serial.print(" | Nivel: ");
Serial.print(porcentagem);
Serial.println("%");
delay(2000);
}Nesta versão, o fio + do sensor vai ligado ao pino D7 em vez do 3V3. O pino digital do ESP8266 fornece corrente suficiente para esse módulo.
10. Simulação no Tinkercad
Antes de montar o circuito real, você pode testar a lógica de nível com indicador LED no Tinkercad Circuits. A simulação abaixo é interativa: clique em Iniciar simulação e altere o sensor para ver os LEDs responderem.
Quer ter a sua própria cópia para editar? Abra o circuito no Tinkercad e clique em Copiar e editar.
11. Saída esperada no Monitor Serial
Valor Analógico: 0 | Nivel: 0%
Valor Analógico: 310 | Nivel: 52%
Valor Analógico: 585 | Nivel: 97%Os números acima são ilustrativos; os seus dependerão da calibração.
12. Problemas comuns
| Sintoma | Causa provável | Solução |
|---|---|---|
| Leitura sempre 0 | Sinal em pino errado ou sensor sem alimentação | Confira S → A0 e +/− ligados |
| Leitura oscila muito | Ruído ou trilhas com bolhas/sujeira | Use média de leituras e limpe o sensor |
| Porcentagem invertida | Faixa do map() ao contrário | Troque os valores de seco e molhado |
| Valores mudam com o tempo | Corrosão das trilhas | Alimente só durante a leitura (item 9) |
| Porta COM não aparece | Cabo só de carga ou driver ausente | Use cabo de dados e instale o driver CH340 |
13. Ideias de projetos
- Alarme de caixa d’água: um buzzer ou LED é acionado quando o nível passa de um limite.
- Monitor de nível via Wi-Fi: como a D1 R1 tem Wi-Fi, o ESP8266 pode servir uma página web com a porcentagem em tempo real, no mesmo estilo do projeto da Trena Digital, do artigo Medindo distância com o ESP8266 e o sensor ultrassônico HC-SR04.
- Aviso de transbordamento em bandejas de ar-condicionado ou aquários.
- Irrigação automática com um relé controlando uma bomba.
Conclusão
Com apenas três fios e poucas linhas de código, o HW-038 transforma a Wemos D1 R1 em um medidor de nível de água. O segredo está em três pontos: alimentar com 3,3 V, calibrar os valores do map() para o seu sensor e proteger as trilhas da corrosão alimentando-o só durante a leitura. A partir daqui, o próximo passo natural é publicar o nível via Wi-Fi e acompanhar o reservatório pelo celular.
Ofertas TECH GUIADO
Gosta de tecnologia? Fique de olho nas ofertas
Selecionamos todos os dias ofertas de smartwatches, fones, suportes de celular e acessórios. Veja no site ou receba direto no WhatsApp.
Gostou? Deixe sua dúvida nos comentários e acompanhe os próximos projetos da série ESP8266.
Compartilhe:






Publicar comentário