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.

Neste artigo: o que é o HW-038, como ele funciona, ligação com a Wemos D1 R1, análise linha a linha do programa de exemplo, calibração, cuidados para o sensor durar e ideias de projetos.

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ísticaValor típico
Tensão de operação3,3 V a 5 V
Tipo de saídaAnalógica (pino S)
PinosS (sinal), + (VCC), − (GND)
PrincípioCondutividade entre trilhas expostas
Área de detecçãoPoucos centímetros (a altura da placa)
Limitação importante: o HW-038 mede a condutividade da água sobre as trilhas, então o valor varia com o tipo de água (destilada, da torneira, com sal) e não é um sensor de precisão. Ele serve muito bem para indicar níveis aproximados, alarmes de transbordamento e projetos didáticos.

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).

Atenção à tensão: alimente o HW-038 com 3,3 V (pino 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-038Wemos D1 R1
S (sinal)A0
+ (VCC)3V3
− (GND)GND
Dica: mantenha a parte eletrônica do módulo (onde ficam os pinos) sempre fora da água. Apenas a região das trilhas deve ser mergulhada.

5. Configurando a Arduino IDE

  1. Em Arquivo > Preferências, adicione a URL do gerenciador de placas ESP8266 (http://arduino.esp8266.com/stable/package_esp8266com_index.json).
  2. Em Ferramentas > Placa > Gerenciador de Placas, instale esp8266.
  3. Selecione a placa LOLIN(WEMOS) D1 R1.
  4. 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.

  1. Carregue o programa e abra o Monitor Serial.
  2. Com o sensor seco, anote o valor lido (ex.: VALOR_SECO).
  3. Mergulhe o sensor até a marca máxima e anote o valor (ex.: VALOR_MOLHADO).
  4. 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).

Dica de ouro: faça a calibração com a mesma água que será usada no projeto final. Água da torneira, de poço ou da chuva têm condutividades diferentes.

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.

Dica: o Tinkercad é ótimo para entender a lógica, mas o comportamento do HW-038 real (faixa de valores, tipo de água) só aparece no circuito físico. Por isso, calibre sempre com o seu sensor, como visto no item 8.

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

SintomaCausa provávelSolução
Leitura sempre 0Sinal em pino errado ou sensor sem alimentaçãoConfira S → A0 e +/− ligados
Leitura oscila muitoRuído ou trilhas com bolhas/sujeiraUse média de leituras e limpe o sensor
Porcentagem invertidaFaixa do map() ao contrárioTroque os valores de seco e molhado
Valores mudam com o tempoCorrosão das trilhasAlimente só durante a leitura (item 9)
Porta COM não apareceCabo só de carga ou driver ausenteUse 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:

Profissional engajado com as últimas tendências tecnológicas e de gestão, buscando continuamente aprimorar suas competências e compartilhar seu conhecimento.

Publicar comentário