Sensor de Temperatura e Umidade 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 ) e de a (precisão de ), 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 ( e 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 (), 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:
- Condição de repouso (Idle): o barramento permanece em nível lógico alto () mantido pelo resistor de pull-up externo;
- 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;
- 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;
- 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;
- 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.
Especificações técnicas
Principais especificações
| Parâmetro | Valor |
|---|---|
| Tensão de operação () | 3,3 – 5,5 VDC (recomendado: 3,3V para ESP/Raspberry, 5V para Arduino) |
| Faixa de medição de umidade | 0 – 100% RH (Umidade Relativa) |
| Precisão na medição de umidade | RH (típica a ); máx. RH nos extremos |
| Resolução de umidade | 0,1% RH (16 bits) |
| Faixa de medição de temperatura | a |
| Precisão na medição de temperatura | |
| Resolução de temperatura | (16 bits com sinal) |
| Corrente em repouso (Standby) | 40 – 50 µA |
| Corrente durante medição | 1,0 – 1,5 mA |
| Intervalo mínimo de amostragem | 2,0 segundos (taxa máxima de 0,5 Hz) |
| Protocolo de comunicação | Digital proprietário de fio único (Single-bus) |
| Distância máxima de transmissão | Até 20 metros (com cabo blindado e pull-up ajustado) |
| Código de referência da loja | RB0063 |
Faixa de medição e precisão
| Grandeza | Faixa de Operação | Precisão Típica | Resolução | Repetibilidade |
|---|---|---|---|---|
| Umidade Relativa | 0% a 100% RH | RH () | 0,1% RH | RH |
| Temperatura | a |
⚠️ 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):
| Byte | Campo | Descrição |
|---|---|---|
| Byte 1 | Umidade Inteira (MSB) | Parte alta do valor de umidade relativa multiplicada por 10 |
| Byte 2 | Umidade Decimal (LSB) | Parte baixa do valor de umidade relativa multiplicada por 10 |
| Byte 3 | Temperatura Inteira (MSB) | Parte alta da temperatura multiplicada por 10 (bit 15 = sinal negativo) |
| Byte 4 | Temperatura Decimal (LSB) | Parte baixa da temperatura multiplicada por 10 |
| Byte 5 | Paridade (Checksum) | Soma dos 4 primeiros bytes truncada para 8 bits |
As equações para decodificação das grandezas físicas no firmware são:
Se o bit mais significativo de (bit 7 de , ou bit 15 da palavra de temperatura de 16 bits) for igual a 1, o valor térmico é negativo:
A verificação de integridade dos dados (checksum) obedece à equação:
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:
| Pino | Identificador | Função | Detalhes Elétricos |
|---|---|---|---|
| 1 | VDD / VCC | Alimentação positiva | 3,3V a 5,5V DC |
| 2 | DATA / SDA | Barramento de dados | Linha digital bidirecional com coletor aberto |
| 3 | NC | Não conectado | Pino nulo (sem ligação interna no chip) |
| 4 | GND | Terra de referência | Conectar 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 () 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:

A tabela a seguir apresenta o mapeamento de conexões “De Para” demonstrado no diagrama:
| Bloco de Origem | Terminal de Origem | Destino no Sistema | Observação |
|---|---|---|---|
| Sensor DHT22 (AM2302) | Pino 1 (VCC) | Pino 5V ou 3.3V da Placa | Alimentaçã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 B | Entre Pino 1 (VCC) e Pino 2 (DATA) | Obrigatório em sensor avulso |
| Sensor DHT22 (AM2302) | Pino 3 (NC) | Não Conectado | Terminal sem função interna |
| Sensor DHT22 (AM2302) | Pino 4 (GND) | Pino GND da Placa | Terra de referência comum |
| Módulo Relé 5V | Borne VCC | Pino 5V da Placa | Alimentação da bobina do relé |
| Módulo Relé 5V | Borne GND | Pino GND da Placa | Terra de controle |
| Módulo Relé 5V | Borne IN | Pino Digital (ex: D8 / GPIO 16) | Sinal de disparo lógico |
| Rede Elétrica AC | Fase (L) | Borne COM do Relé | Chaveamento de fase na carga |
| Rede Elétrica AC | Neutro (N) | Terminal 1 da Carga / Exaustor | Retorno neutro direto à carga |
| Carga / Exaustor AC | Terminal 2 da Carga | Borne NO do Relé | Contato Normalmente Aberto |
Passo a passo da instalação
- Desenergize completamente o sistema retirando o cabo USB e desligando as fontes de bancada antes de realizar qualquer conexão;
- Posicione o sensor DHT22 na protoboard com espaço suficiente para fixação dos jumpers e do resistor de pull-up;
- 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;
- 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);
- Conecte o pino 4 (GND) ao pino de terra (GND) comum do circuito;
- 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);
- 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 DHT22 | Arduino Uno / Nano | ESP32 (DevKit) | ESP8266 (NodeMCU) | Raspberry Pi 4 / 5 |
|---|---|---|---|---|
| Pino 1 (VDD) | 5V | 3.3V | 3.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 conectado | Não conectado | Não conectado | Não conectado |
| Pino 4 (GND) | GND | GND | GND | Pino Físico 6 (GND) |
| Resistor Pull-up | 4,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 Incluir Biblioteca Gerenciar Bibliotecas):
- DHT sensor library (por Adafruit);
- 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.
- 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
- 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 ) e a (precisão de ), 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 viamillis()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.