Sensor de Temperatura e Umidade DHT22 / AM2302: Manual Técnico Completo

DHT22 / AM2302 — manual técnico completo

Introdução

Neste manual, será apresentado como instalar, configurar e utilizar o Sensor de Temperatura e Umidade DHT22 / AM2302. Se desejar adquirir este produto, clique aqui.

Este conteúdo tem finalidade didática e de engenharia aplicada, sendo voltado a projetistas, técnicos, estudantes e entusiastas que necessitam integrar medições confiáveis de variáveis termo-higrométricas em sistemas embarcados. Ao longo deste guia, são apresentados os fundamentos do protocolo de comunicação digital proprietário, as especificações elétricas, o diagrama esquemático de ligação, a configuração de firmware em C++ e Python, além de exemplos práticos de automação e telemetria para bancada e indústria leve.

Descrição geral do produto

O que é o DHT22 / AM2302?

O DHT22 (também denominado AM2302) é um sensor digital de alta precisão projetado pela Aosong Electronics para a medição combinada de umidade relativa do ar e temperatura ambiente. O componente integra em um único invólucro plástico vazado um elemento resistivo de alta sensibilidade do tipo NTC (Negative Temperature Coefficient) para temperatura e um transdutor capacitivo de polímero dielétrico sensível à umidade.

Diferente de transdutores puramente analógicos, o DHT22 incorpora um microcontrolador interno de 8 bits dedicado à aquisição contínua, conversão analógica-digital e calibração de fábrica. Os coeficientes de ajuste são gravados de forma permanente em uma memória OTP (One-Time Programmable), garantindo que as leituras sejam entregues digitalmente já calibradas e prontas para uso por meio de um barramento serial de fio único (single-bus).

Para que serve?

O sensor monitora continuamente a temperatura e a concentração de vapor de água na atmosfera, convertendo essas grandezas físicas em frames digitais de 40 bits. É amplamente empregado em:

  • Sistemas de climatização residencial e comercial (HVAC), umidificadores e desumidificadores automáticos;
  • Estações meteorológicas compactas, estufas agrícolas, câmaras de germinação e hidroponia;
  • Ambientes críticos de tecnologia, como racks de servidores, centros de processamento de dados (CPD) e chocadeiras industriais.

Por que devo usar?

  • Alta precisão e ampla faixa de medição: opera de 0% a 100% de umidade relativa (precisão de ±2%\pm 2\%) e de −40∘C-40^\circ\text{C} a +80∘C+80^\circ\text{C} (precisão de ±0,5∘C\pm 0,5^\circ\text{C}), superando expressivamente o modelo básico DHT11;
  • Saída digital calibrada em barramento único: elimina a necessidade de conversores ADC externos e circuitos amplificadores operacionais de instrumentação, requisitando apenas um pino de GPIO do processador hospedeiro;
  • Excelente imunidade a ruídos: o protocolo digital e o encapsulamento industrial permitem transmissão segura de sinais em cabos de até 20 metros de comprimento com filtragem adequada.

Quando devo usar?

O DHT22 / AM2302 é a escolha ideal quando:

  • O projeto exige leitura combinada de temperatura e umidade em um único ponto com custo reduzido e precisão de bancada (±0,5∘C\pm 0,5^\circ\text{C} e ±2%\pm 2\% RH);
  • O microcontrolador hospedeiro possui quantidade restrita de pinos de entrada e saída (GPIO);
  • O intervalo de atualização requerido é igual ou superior a 2 segundos (taxa de amostragem de até 0,5 Hz).

Não é a melhor escolha quando:

  • A dinâmica térmica ou higrométrica exige taxas de amostragem ultrarrápidas (>1 Hz> 1\,\text{Hz}), caso em que sensores I2C de resposta rápida (como a família Sensirion SHT3x ou SHT4x) são mais indicados;
  • O sensor deve operar submerso em líquidos ou exposto a condensação constante (neste caso, prefira o DS18B20 encapsulado em sonda inox blindada para temperatura e sondas industriais seladas para umidade);
  • É requerida comunicação por barramento padrão industrial padronizado, como I2C com múltiplos endereços de hardware no mesmo par de fios ou RS-485 Modbus RTU.

Como funciona o protocolo de comunicação

O DHT22 emprega um protocolo proprietário bidirecional assíncrono em fio único (single-bus). O microcontrolador mestre atua como iniciador de cada transação, enquanto o sensor opera como escravo:

  1. Condição de repouso (Idle): o barramento permanece em nível lógico alto (VDDV_{DD}) mantido pelo resistor de pull-up externo;
  2. Sinal de partida do mestre (Start): o microcontrolador puxa a linha de dados para nível baixo (LOW) por um período de pelo menos 1 ms a 18 ms e em seguida a libera para nível alto por 20 a 40 µs;
  3. Resposta do sensor (Response): o DHT22 detecta o pulso de início, força o barramento para LOW por 80 µs e em seguida o libera para HIGH por mais 80 µs, indicando prontidão;
  4. Transmissão de dados (40 bits): o sensor transmite 40 pulsos consecutivos. Cada bit é composto por um pulso inicial em nível baixo de aproximadamente 50 µs, seguido por um pulso em nível alto cuja duração codifica o valor lógico:
    • Bit “0”: nível alto dura entre 26 µs e 28 µs;
    • Bit “1”: nível alto dura cerca de 70 µs;
  5. Fim de transmissão: após o quadragésimo bit, o sensor puxa a linha para LOW por 50 µs e retorna o barramento ao estado de repouso em nível alto.

💡 Dica: como o protocolo depende estritamente da medição precisa de larguras de pulsos em microssegundos (µs), sistemas multitarefa ou com interrupções frequentes devem desabilitar temporariamente as interrupções durante a janela de leitura para evitar corrupção de dados.

Variantes disponíveis

O sensor é comercializado em duas variantes principais no mercado de desenvolvimento:

  • Componente Avulso de 4 Pinos (RB0063): invólucro original com 4 terminais metálicos em passo de 2,54 mm. Requer a instalação de um resistor de pull-up externo de 4,7 kΩ a 10 kΩ entre o pino de dados e a alimentação positiva.
  • Módulo para Arduino em PCB (3 Pinos): o sensor montado sobre uma pequena placa de circuito impresso com conectores macho para jumpers (VCC, GND e OUT/DATA), já integrando resistor de pull-up SMD e capacitor cerâmico de desacoplamento de 100 nF.
Sensor de temperatura e umidade DHT22 AM2302 avulso de 4 pinos Módulo sensor DHT22 com placa PCB de 3 pinos para Arduino e microcontroladores

Especificações técnicas

Principais especificações

ParâmetroValor
Tensão de operação (VDDV_{DD})3,3 – 5,5 VDC (recomendado: 3,3V para ESP/Raspberry, 5V para Arduino)
Faixa de medição de umidade0 – 100% RH (Umidade Relativa)
Precisão na medição de umidade±2%\pm 2\% RH (típica a 25∘C25^\circ\text{C}); máx. ±5%\pm 5\% RH nos extremos
Resolução de umidade0,1% RH (16 bits)
Faixa de medição de temperatura−40∘C-40^\circ\text{C} a +80∘C+80^\circ\text{C}
Precisão na medição de temperatura±0,5∘C\pm 0,5^\circ\text{C}
Resolução de temperatura0,1∘C0,1^\circ\text{C} (16 bits com sinal)
Corrente em repouso (Standby)40 – 50 µA
Corrente durante medição1,0 – 1,5 mA
Intervalo mínimo de amostragem2,0 segundos (taxa máxima de 0,5 Hz)
Protocolo de comunicaçãoDigital proprietário de fio único (Single-bus)
Distância máxima de transmissãoAté 20 metros (com cabo blindado e pull-up ajustado)
Código de referência da lojaRB0063

Faixa de medição e precisão

GrandezaFaixa de OperaçãoPrecisão TípicaResoluçãoRepetibilidade
Umidade Relativa0% a 100% RH±2%\pm 2\% RH (25∘C25^\circ\text{C})0,1% RH±1%\pm 1\% RH
Temperatura−40∘C-40^\circ\text{C} a +80∘C+80^\circ\text{C}±0,5∘C\pm 0,5^\circ\text{C}0,1∘C0,1^\circ\text{C}±0,2∘C\pm 0,2^\circ\text{C}

⚠️ Atenção: respeite rigorosamente o intervalo mínimo de 2 segundos entre leituras consecutivas. Tentar interrogar o sensor em intervalos menores (como 500 ms) fará com que o componente retorne dados defasados da medição anterior ou gere falhas de timeout e leituras inválidas (NaN).

Protocolo de dados (Frame de 40 bits)

A mensagem transmitida pelo DHT22 é composta por 5 bytes sequenciais (40 bits no total), organizados no formato Big-Endian (bit mais significativo primeiro):

ByteCampoDescrição
Byte 1Umidade Inteira (MSB)Parte alta do valor de umidade relativa multiplicada por 10
Byte 2Umidade Decimal (LSB)Parte baixa do valor de umidade relativa multiplicada por 10
Byte 3Temperatura Inteira (MSB)Parte alta da temperatura multiplicada por 10 (bit 15 = sinal negativo)
Byte 4Temperatura Decimal (LSB)Parte baixa da temperatura multiplicada por 10
Byte 5Paridade (Checksum)Soma dos 4 primeiros bytes truncada para 8 bits

As equações para decodificação das grandezas físicas no firmware são:

UR=(Byte1×256)+Byte210 [%]\text{UR} = \frac{(\text{Byte}_1 \times 256) + \text{Byte}_2}{10} \, [\%]

T=((Byte3 & 0x7F)×256)+Byte410 [∘C]T = \frac{((\text{Byte}_3 \ \& \ 0x7F) \times 256) + \text{Byte}_4}{10} \, [^\circ\text{C}]

Se o bit mais significativo de Byte3\text{Byte}_3 (bit 7 de Byte3\text{Byte}_3, ou bit 15 da palavra de temperatura de 16 bits) for igual a 1, o valor térmico é negativo:

T=−TT = -T

A verificação de integridade dos dados (checksum) obedece à equação:

Checksum=(Byte1+Byte2+Byte3+Byte4)(mod256)\text{Checksum} = (\text{Byte}_1 + \text{Byte}_2 + \text{Byte}_3 + \text{Byte}_4) \pmod{256}

Pinagem e descrição dos terminais

Encapsulamento e identificação dos pinos

Observando o sensor de frente (com a grade de ventilação voltada para o usuário e os 4 terminais metálicos apontando para baixo), a contagem dos pinos é realizada da esquerda para a direita:

PinoIdentificadorFunçãoDetalhes Elétricos
1VDD / VCCAlimentação positiva3,3V a 5,5V DC
2DATA / SDABarramento de dadosLinha digital bidirecional com coletor aberto
3NCNão conectadoPino nulo (sem ligação interna no chip)
4GNDTerra de referênciaConectar ao 0V (GND) comum do circuito

⚠️ Atenção: o pino 3 (NC) não deve ser conectado a nenhum potencial elétrico. Deixe-o isolado mecanicamente e eletricamente.

⛔ Perigo: a inversão da polaridade entre o pino 1 (VDD) e o pino 4 (GND) provoca aquecimento imediato e destruição permanente do circuito integrado interno. Certifique-se da pinagem correta antes de energizar a fonte de bancada.

Por que o resistor de pull-up é obrigatório

O terminal de dados (DATA) do DHT22 opera com saída em dreno aberto (open-drain). Isso significa que tanto o sensor quanto o microcontrolador só conseguem ativamente puxar a linha para o nível lógico baixo (0V). Eles não conseguem injetar corrente para manter a linha em nível lógico alto de repouso.

O resistor de pull-up (valor típico de 4,7 kΩ a 10 kΩ) conectado entre o pino DATA e a linha positiva de alimentação (VDDV_{DD}) cumpre as seguintes funções essenciais:

  • Mantém a linha de dados estavelmente em nível lógico alto durante os períodos de repouso (idle);
  • Garante transições rápidas de subida de sinal (rise time), evitando que a capacitância parasita do cabo atrase a borda e cause erros de sincronismo;
  • Evita que a linha flutue eletricamente, o que geraria ruídos espúrios, perda de pacotes e erros constantes de checksum.

💡 Dica: para comprimentos de cabo de até 1 metro, utilize um resistor de 10 kΩ. Para distâncias entre 1 e 20 metros, reduza o resistor para 4,7 kΩ ou até 2,2 kΩ para compensar a capacitância do cabeamento e preservar as bordas de subida.

Instalação e conexão

Requisitos de hardware

Para a montagem dos circuitos apresentados neste manual, são necessários os seguintes itens:

  • Placa microcontroladora: Arduino Uno, Mega, Nano, ESP32, ESP8266 ou computador de placa única Raspberry Pi;
  • Sensor DHT22 / AM2302 (avulso com resistor de 4,7 kΩ a 10 kΩ ou módulo pronto com pull-up integrado);
  • Fonte de alimentação DC estável e regulada (3,3V ou 5V);
  • Protoboard e cabos jumpers para conexões de bancada;
  • Módulo relé optoacoplado de 1 canal (caso deseje acionar cargas AC de climatização).

Diagrama de ligação elétrica

A imagem abaixo ilustra a montagem esquemática recomendada para o sensor DHT22 com a placa controladora, o módulo relé para acionamento de exaustor e a rede elétrica:

Diagrama de ligação elétrica do Sensor de Temperatura e Umidade DHT22 / AM2302

A tabela a seguir apresenta o mapeamento de conexões “De →\to Para” demonstrado no diagrama:

Bloco de OrigemTerminal de OrigemDestino no SistemaObservação
Sensor DHT22 (AM2302)Pino 1 (VCC)Pino 5V ou 3.3V da PlacaAlimentação positiva (conforme lógica da placa)
Sensor DHT22 (AM2302)Pino 2 (DATA)Pino Digital (ex: D2 / GPIO 4)Linha de dados com resistor de pull-up
Resistor Pull-up (4,7 kΩ)Terminal A / Terminal BEntre Pino 1 (VCC) e Pino 2 (DATA)Obrigatório em sensor avulso
Sensor DHT22 (AM2302)Pino 3 (NC)Não ConectadoTerminal sem função interna
Sensor DHT22 (AM2302)Pino 4 (GND)Pino GND da PlacaTerra de referência comum
Módulo Relé 5VBorne VCCPino 5V da PlacaAlimentação da bobina do relé
Módulo Relé 5VBorne GNDPino GND da PlacaTerra de controle
Módulo Relé 5VBorne INPino Digital (ex: D8 / GPIO 16)Sinal de disparo lógico
Rede Elétrica ACFase (L)Borne COM do ReléChaveamento de fase na carga
Rede Elétrica ACNeutro (N)Terminal 1 da Carga / ExaustorRetorno neutro direto à carga
Carga / Exaustor ACTerminal 2 da CargaBorne NO do ReléContato Normalmente Aberto

Passo a passo da instalação

  1. Desenergize completamente o sistema retirando o cabo USB e desligando as fontes de bancada antes de realizar qualquer conexão;
  2. Posicione o sensor DHT22 na protoboard com espaço suficiente para fixação dos jumpers e do resistor de pull-up;
  3. Instale o resistor de pull-up de 4,7 kΩ conectando uma de suas extremidades ao pino 1 (VDD) e a outra extremidade ao pino 2 (DATA) do sensor;
  4. Conecte o pino 1 (VDD) à saída de tensão regulada do microcontrolador (5V no Arduino Uno; 3,3V no ESP32, ESP8266 ou Raspberry Pi);
  5. Conecte o pino 4 (GND) ao pino de terra (GND) comum do circuito;
  6. Conecte o pino 2 (DATA) ao pino digital escolhido para a leitura (por exemplo, pino digital 2 no Arduino Uno ou GPIO 4 no ESP32);
  7. Verifique visualmente todas as conexões contra curto-circuitos e energize a placa via USB para prosseguir com a gravação do firmware.

Conexão com microcontroladores

Terminal DHT22Arduino Uno / NanoESP32 (DevKit)ESP8266 (NodeMCU)Raspberry Pi 4 / 5
Pino 1 (VDD)5V3.3V3.3V (3V3)Pino Físico 1 (3.3V)
Pino 2 (DATA)Pino Digital 2 (D2)GPIO 4 (D4)GPIO 4 (D2)Pino Físico 7 (GPIO 4)
Pino 3 (NC)Não conectadoNão conectadoNão conectadoNão conectado
Pino 4 (GND)GNDGNDGNDPino Físico 6 (GND)
Resistor Pull-up4,7 kΩ (VDD a DATA)4,7 kΩ (VDD a DATA)4,7 kΩ (VDD a DATA)4,7 kΩ (VDD a DATA)

⚠️ Atenção (ESP32 / ESP8266 / Raspberry Pi): essas plataformas operam com nível lógico estrito de 3,3V em seus pinos de GPIO. Ao integrá-las ao DHT22, alimente o sensor exclusivamente na linha regulada de 3,3V para evitar sobretensão nas portas de entrada do processador.

Configuração de software

Bibliotecas necessárias

Para a plataforma Arduino e ESP32, a biblioteca consagrada pelo ecossistema é mantida pela Adafruit. São necessários dois pacotes instalados via Gerenciador de Bibliotecas da Arduino IDE (Sketch →\to Incluir Biblioteca →\to Gerenciar Bibliotecas):

  1. DHT sensor library (por Adafruit);
  2. Adafruit Unified Sensor (por Adafruit).

Código básico de leitura

O código abaixo realiza a inicialização da comunicação serial a 115200 bps, configura o sensor e executa a leitura periódica dos valores de temperatura e umidade, realizando o tratamento adequado para detecção de valores nulos (NaN — Not a Number):

#include <Adafruit_Sensor.h>         // biblioteca unificada de sensores da Adafruit
#include <DHT.h>                     // biblioteca de controle dos sensores DHT

#define DHTPIN 2                     // pino digital conectado ao terminal DATA do sensor
#define DHTTYPE DHT22                // define o modelo do sensor utilizado (DHT22 / AM2302)

DHT dht(DHTPIN, DHTTYPE);            // instancia o objeto de controle do sensor DHT22

void setup() {
  Serial.begin(115200);              // inicializa a interface serial para exibicao dos dados
  while (!Serial) {                  // aguarda a porta serial abrir (necessario em placas nativas)
    delay(10);                       // pausa curta de sincronismo
  }

  Serial.println(F("Iniciando comunicacao com o sensor DHT22...")); // mensagem de inicializacao
  dht.begin();                       // inicializa os registradores e a linha do sensor
}

void loop() {
  delay(2000);                       // aguarda o intervalo minimo obrigatorio de 2 segundos

  float umidade = dht.readHumidity();             // realiza a leitura da umidade relativa (%)
  float temperatura = dht.readTemperature();       // realiza a leitura da temperatura em Celsius (C)

  // verifica se alguma leitura falhou antes de processar os dados
  if (isnan(umidade) || isnan(temperatura)) {     // avalia se os valores retornados sao invalidos
    Serial.println(F("Falha ao ler dados do DHT22! Verifique a conexao e o resistor.")); // alerta de erro
    return;                          // encerra o ciclo atual do loop sem imprimir lixo
  }

  float indiceCalor = dht.computeHeatIndex(temperatura, umidade, false); // calcula sensacao termica em C

  Serial.print(F("Umidade Relativa: "));           // rotulo de umidade no monitor
  Serial.print(umidade, 1);                       // exibe a umidade com 1 casa decimal
  Serial.print(F(" %  |  "));                     // separador visual
  Serial.print(F("Temperatura: "));               // rotulo de temperatura no monitor
  Serial.print(temperatura, 1);                   // exibe a temperatura com 1 casa decimal
  Serial.print(F(" °C  |  "));                    // separador visual
  Serial.print(F("Sensacao Termica: "));          // rotulo de sensacao termica no monitor
  Serial.print(indiceCalor, 1);                   // exibe a sensacao termica calculada
  Serial.println(F(" °C"));                       // unidade de temperatura e quebra de linha
}

Leitura sem bloqueio e tratamento de erros (NaN)

Em aplicações profissionais de robótica e automação, o uso da função delay() deve ser evitado para não travar a execução de tarefas concorrentes (como controle de motores e comunicação de rede). O exemplo a seguir implementa leitura não bloqueante com temporização baseada na função millis():

#include <DHT.h>                     // inclui a biblioteca do sensor DHT

#define DHTPIN 4                     // pino de dados conectado ao GPIO 4
#define DHTTYPE DHT22                // modelo configurado: DHT22 (AM2302)

DHT dht(DHTPIN, DHTTYPE);            // cria a instancia do sensor

unsigned long tempoAnterior = 0;     // armazena o instante da ultima leitura bem-sucedida
const unsigned long intervalo = 2500;// intervalo de amostragem definido em 2,5 segundos
uint8_t falhasConsecutivas = 0;       // contador de erros de leitura para diagnostico

void setup() {
  Serial.begin(115200);              // configura taxa de transmissao serial para 115200 bps
  dht.begin();                       // inicializa a comunicacao com o sensor
  Serial.println(F("Monitoramento termo-higrometrico iniciado.")); // mensagem no log
}

void loop() {
  unsigned long tempoAtual = millis();// captura o tempo decorrido desde o boot da placa

  // verifica se o intervalo de 2,5 segundos transcorreu sem bloquear o processador
  if (tempoAtual - tempoAnterior >= intervalo) {  // temporizacao nao bloqueante por millis
    tempoAnterior = tempoAtual;       // atualiza a marca temporal de execucao

    float h = dht.readHumidity();     // requisita leitura de umidade
    float t = dht.readTemperature();  // requisita leitura de temperatura

    if (isnan(h) || isnan(t)) {       // testa se houve falha de resposta ou erro de checksum
      falhasConsecutivas++;           // incrementa a contagem de falhas detectadas
      Serial.print(F("[ERRO] Falha de comunicacao (#")); // exibe cabecalho de erro
      Serial.print(falhasConsecutivas);// exibe o numero acumulado de tentativas com erro
      Serial.println(F("). Reavaliando barramento...")); // mensagem explicativa

      if (falhasConsecutivas >= 5) {  // acao preventiva se 5 erros consecutivos ocorrerem
        Serial.println(F("[ALERTA CRITICO] Sensor desconectado ou barramento travado!")); // alarme
      }
    } else {
      falhasConsecutivas = 0;         // reinicia a contagem de falhas apos leitura valida
      Serial.print(F("[STATUS OK] Temp: ")); // cabecalho de telemetria
      Serial.print(t, 2);             // imprime temperatura com 2 casas decimais
      Serial.print(F(" °C, Umid: ")); // rotulo da umidade
      Serial.print(h, 2);             // imprime umidade com 2 casas decimais
      Serial.println(F(" %"));        // encerra linha com unidade
    }
  }

  // outras rotinas concorrentes podem rodar aqui livremente sem sofrer bloqueio
}

Integração com Raspberry Pi

No sistema operacional Linux da Raspberry Pi (Raspberry Pi OS), a leitura é simplificada através da biblioteca oficial da Adafruit para CircuitPython.

  1. Instale o ambiente virtual e os pacotes necessários via terminal:
sudo apt update                               # atualiza a lista de pacotes do sistema operacional
sudo apt install -y python3-pip python3-venv   # instala o gerenciador pip e ferramentas de venv
python3 -m venv ~/dht_env                     # cria um ambiente virtual isolado para o projeto
source ~/dht_env/bin/activate                 # ativa o ambiente virtual criado
pip install adafruit-circuitpython-dht         # instala a biblioteca de comunicacao com o sensor
sudo apt install -y libgpiod2                  # instala biblioteca nativa para acesso de baixo nivel aos GPIOs
  1. Crie o arquivo Python de leitura (leitura_dht22.py):
import time                       # importa modulo de temporizacao do sistema
import board                      # importa modulo com as definicoes de pinos da Raspberry Pi
import adafruit_dht               # importa a biblioteca oficial do sensor DHT

# inicializa o sensor DHT22 no pino GPIO 4 (pino fisico 7 da placa)
dht_device = adafruit_dht.DHT22(board.D4)

print("Iniciando monitoramento de temperatura e umidade com Raspberry Pi...")

while True:
    try:
        temperatura = dht_device.temperature  # requisita a temperatura em graus Celsius
        umidade = dht_device.humidity          # requisita a umidade relativa em porcentagem

        # imprime os valores capturados no console formatados com uma casa decimal
        print(f"Temperatura: {temperatura:.1f} °C  |  Umidade: {umidade:.1f} %")

    except RuntimeError as erro:
        # erros de leitura em Linux ocorrem pontualmente devido ao escalonamento de processos
        print(f"Aviso de leitura: {erro.args[0]}. Tentando novamente...")

    except Exception as erro_fatal:
        dht_device.exit()         # libera os pinos de GPIO do sistema antes de encerrar
        raise erro_fatal          # propaga a excecao caso seja um erro estrutural

    time.sleep(2.0)               # aguarda o intervalo obrigatorio de 2 segundos entre leituras

Exemplos de aplicação

Controle de ventilação e desumidificação com relé (Arduino)

Este projeto implementa um controle de automação completo para estufas ou armários de secagem de filamentos 3D. Quando a umidade relativa ultrapassa 65%, o microcontrolador aciona um módulo relé ligado a um exaustor elétrico. Um controle por histerese de 5% desliga a ventilação apenas quando o nível cai abaixo de 60%, prevenindo acionamentos frequentes da bobina do relé (chattering):

#include <DHT.h>                     // inclui a biblioteca de comunicacao do DHT22

#define DHTPIN 2                     // pino de dados conectado ao terminal 2 do DHT22
#define DHTTYPE DHT22                // modelo selecionado: DHT22 (AM2302)
#define PINO_RELE 8                  // pino digital de saida conectado ao modulo rele

#define SETPOINT_UMIDADE 65.0        // limite maximo desejado de umidade relativa (%)
#define HISTERESE_UMIDADE 5.0        // margem de tolerancia para desligamento da carga (%)

DHT dht(DHTPIN, DHTTYPE);            // cria o objeto gerenciador do sensor
bool estadoRele = false;             // variavel para rastrear o estado atual do rele

void setup() {
  Serial.begin(115200);              // inicializa monitor serial a 115200 bps
  pinMode(PINO_RELE, OUTPUT);        // configura o pino do rele como saida digital
  digitalWrite(PINO_RELE, HIGH);     // inicia com rele desativado (modulos ativos em nivel LOW)
  dht.begin();                       // inicializa o sensor de umidade e temperatura
  Serial.println(F("Sistema de Desumidificacao Automatica Ativado.")); // confirmacao
}

void loop() {
  delay(2000);                       // aguarda intervalo seguro de 2 segundos entre medicoes

  float umidade = dht.readHumidity();             // faz a leitura de umidade
  float temperatura = dht.readTemperature();       // faz a leitura de temperatura

  if (isnan(umidade) || isnan(temperatura)) {     // valida consistencia dos dados
    Serial.println(F("[FALHA] Leitura invalida do sensor. Mantendo estado do rele."));
    return;                          // aborta o processamento atual
  }

  Serial.print(F("Umid: "));         // exibe informacoes operacionais no monitor
  Serial.print(umidade, 1);
  Serial.print(F("% | Temp: "));
  Serial.print(temperatura, 1);
  Serial.print(F("°C | Exaustor: "));

  // logica de controle liga/desliga com histerese
  if (umidade >= SETPOINT_UMIDADE && !estadoRele) {
    estadoRele = true;               // atualiza a variavel de estado para ligado
    digitalWrite(PINO_RELE, LOW);    // energiza a bobina do rele (aciona o exaustor)
    Serial.println(F("LIGADO (Acima do Setpoint)"));
  } 
  else if (umidade <= (SETPOINT_UMIDADE - HISTERESE_UMIDADE) && estadoRele) {
    estadoRele = false;              // atualiza a variavel de estado para desligado
    digitalWrite(PINO_RELE, HIGH);   // desenergiza a bobina do rele (desliga exaustor)
    Serial.println(F("DESLIGADO (Dentro da margem segura)"));
  } 
  else {
    Serial.println(estadoRele ? F("MANTIDO LIGADO") : F("MANTIDO DESLIGADO"));
  }
}

Monitoramento IoT com ESP32 + MQTT

Neste exemplo avançado, a placa ESP32 lê os dados do DHT22 e os publica em formato JSON em um servidor (broker) MQTT remoto via Wi-Fi, permitindo a integração direta com painéis de controle do Node-RED, Grafana ou Home Assistant:

#include <WiFi.h>                    // biblioteca oficial de conexao Wi-Fi do ESP32
#include <PubSubClient.h>            // biblioteca para comunicacao do protocolo MQTT
#include <DHT.h>                     // biblioteca para leitura do sensor DHT22

#define DHTPIN 4                     // terminal de dados conectado ao GPIO 4 do ESP32
#define DHTTYPE DHT22                // especificacao do modelo: DHT22 (AM2302)

const char* redeWifi = "SUA_REDE_WIFI";       // nome SSID da sua rede sem fio
const char* senhaWifi = "SUA_SENHA_WIFI";     // senha de acesso a rede sem fio
const char* brokerMqtt = "broker.hivemq.com"; // endereco do servidor broker MQTT
const int portaMqtt = 1883;                   // porta de conexao TCP padrao do MQTT
const char* topicoPublicacao = "robobuilders/dht22/dados"; // topico para telemetria

WiFiClient clienteWifi;              // instancia cliente de socket TCP
PubSubClient clienteMqtt(clienteWifi); // associa o cliente MQTT a conexao de rede
DHT dht(DHTPIN, DHTTYPE);            // cria objeto do sensor DHT22

unsigned long ultimaMensagem = 0;    // temporizador para controle de publicacao
const unsigned long intervaloMqtt = 10000; // intervalo de envio definido em 10 segundos

void conectarWifi() {
  Serial.print(F("Conectando ao Wi-Fi")); // exibe mensagem de status
  WiFi.begin(redeWifi, senhaWifi);   // inicia negociacao com o ponto de acesso
  while (WiFi.status() != WL_CONNECTED) { // laco de espera por conexao ativa
    delay(500);                      // aguarda meio segundo
    Serial.print(F("."));            // ponto indicador de progresso
  }
  Serial.println(F("\nWi-Fi conectado com sucesso!")); // confirma conexao bem-sucedida
}

void reconectarMqtt() {
  while (!clienteMqtt.connected()) { // enquanto a conexao MQTT estiver desconectada
    Serial.print(F("Tentando conectar ao broker MQTT...")); // aviso no console
    String idCliente = "ESP32-DHT22-" + String(random(0xffff), HEX); // id unico de sessao
    if (clienteMqtt.connect(idCliente.c_str())) { // tenta estabelecer a sessao MQTT
      Serial.println(F(" Conectado ao broker!")); // confirmacao de sucesso
    } else {
      Serial.print(F(" Falha, rc=")); // relata codigo de retorno de erro
      Serial.print(clienteMqtt.state()); // exibe o estado da conexao
      Serial.println(F(" Tentando novamente em 5 segundos..."));
      delay(5000);                   // pausa antes de nova tentativa de conexao
    }
  }
}

void setup() {
  Serial.begin(115200);              // inicia o canal de depuracao serial
  dht.begin();                       // inicializa comunicacao com o DHT22
  conectarWifi();                    // conecta a placa a rede sem fio local
  clienteMqtt.setServer(brokerMqtt, portaMqtt); // define o endereco do broker MQTT
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) conectarWifi(); // recupera conexao de rede se cair
  if (!clienteMqtt.connected()) reconectarMqtt();    // recupera sessao MQTT se desconectar
  clienteMqtt.loop();                // mantem viva a comunicacao do cliente MQTT

  unsigned long agora = millis();    // verifica tempo atual para envio temporizado
  if (agora - ultimaMensagem >= intervaloMqtt) { // testa transcurso de 10 segundos
    ultimaMensagem = agora;          // reseta o temporizador de envio

    float h = dht.readHumidity();    // realiza leitura de umidade
    float t = dht.readTemperature(); // realiza leitura de temperatura

    if (!isnan(h) && !isnan(t)) {    // certifica-se de que a leitura e valida
      char bufferPayload[128];       // vetor para montagem da mensagem JSON
      snprintf(bufferPayload, sizeof(bufferPayload),
               "{\"temperatura\": %.1f, \"umidade\": %.1f}", t, h); // monta payload JSON

      clienteMqtt.publish(topicoPublicacao, bufferPayload); // publica a mensagem no broker
      Serial.print(F("Payload publicado no topico: "));     // exibe confirmacao
      Serial.println(bufferPayload);                        // exibe conteudo enviado
    }
  }
}

Conclusão

Este manual abordou de forma completa o sensor de temperatura e umidade DHT22 / AM2302, desde os conceitos básicos até aplicações avançadas em automação e IoT:

  • O que é e como funciona: transdutor capacitivo de umidade e elemento térmico NTC com microcontrolador integrado de 8 bits, transmitindo frames digitais de 40 bits calibrados de fábrica via barramento de fio único (single-bus).
  • Variantes disponíveis: componente avulso de 4 pinos (código de loja RB0063) e módulo pronto para desenvolvimento em PCB de 3 pinos com resistor pull-up e capacitor SMD integrados.
  • Especificações técnicas: faixa ampla de 0 a 100% RH (precisão de ±2%\pm 2\%) e −40∘C-40^\circ\text{C} a +80∘C+80^\circ\text{C} (precisão de ±0,5∘C\pm 0,5^\circ\text{C}), com taxa de amostragem mínima de 2 segundos.
  • Pinagem e instalação: identificação de terminais (VDD, DATA, NC, GND), obrigatoriedade e dimensionamento do resistor de pull-up (4,7 kΩ a 10 kΩ) e diagrama de ligação completo para cargas de potência.
  • Configuração de software: instalação das bibliotecas oficiais da Adafruit, leitura básica tratada contra valores nulos (NaN), temporização assíncrona não bloqueante via millis() e script em Python para Raspberry Pi.
  • Exemplos práticos: implementação de controlador de ventilação/desumidificação com relé e histerese para Arduino, além de telemetria completa via Wi-Fi e protocolo MQTT com payload JSON no ESP32.
  • Solução de problemas (FAQ): orientações práticas para diagnóstico de erros de checksum, falhas de timeout, flutuação em cabos extensos e limites de amostragem.

Com a instalação do resistor de pull-up adequado, o respeito ao intervalo mínimo de 2 segundos e a integração com as bibliotecas oficiais, o DHT22 / AM2302 oferece excelente confiabilidade e custo-benefício para qualquer aplicação termo-higrométrica embarcada.

Solução de problemas

Olá! Sou o assistente técnico da RoboBuilders. Descreva seu problema com o Sensor de Temperatura e Umidade DHT22 / AM2302: Manual Técnico Completo e eu ajudarei a encontrar a solução.

O assistente usa IA e pode errar. Confirme informações críticas no datasheet oficial do fabricante.