Introdução
O sensor ‘DHT’ (Digital output relative Humidity & Temperature), ou também conhecido como AM2302, possui um pino bidirecional, responsável por enviar as medidas de temperatura e umidade relativa, bem como receber comandos, tudo isso apenas por um fio. Nesse tipo de comunicação, não existe presença do clock, o que torna a troca de informações lenta devido aos delays dentro do enlace. O protocolo que rege a comunicação é conhecido como One Wire. No invólucro interno do dispositivo, há dois sensores: um de temperatura (NTC) e outro de umidade relativa capacitivo, ambos conectados a um microcontrolador de 8 bits, o qual é responsável por capturar as leituras analógicas e torná-las digitais.
Ao consultar a temperatura ambiente ou nível de umidade relativa no ar, procuramos atender ao conforto térmico ou realizar o monitoramento de um ambiente. Para isso, é necessário ter em mãos um sensor de qualidade.
Neste artigo vamos desenvolver um exemplo prático para leitura de temperatura e umidade usando o DHT22 com a Franzininho WiFi.
Instalação da Biblioteca para leitura do DHT22
Antes de iniciar nosso projeto, vamos instalar no Arduino IDE a biblioteca responsável por comunicar-se com o DHT22.
Acesse: Ferramenta -> Gerenciador de Bibliotecas (Tools -> Manager Libraries)

Após acessar o Gerenciador de biblioteca vai surgir uma janela como apresentada abaixo e vamos digitar no campo de texto: “dht”. Aguarde carregar a lista de bibliotecas e procure por: DHT sensor library by Adafruit. Por fim clique no botão install.
Biblioteca DHT sensor library by Adafruit
Nesta seção vamos abordar os métodos presentes dentro da biblioteca “DHT.h” .
begin()
Configura o pino conectado ao sensor em pull up e tempo
void dht.begin(uint8_t usec);
- usec : parâmetro opcional(pode ser omitido ao chamar o método) usado para aguardar o tempo antes de iniciar as leituras.
readTemperatura()
Pega as leituras de temperatura.
float dht.readTemperatura(bool S,bool force);
- S : seleciona a escala da temperatura (Celsius – false e Fahrenheit – true).
- force : força para entrar no modo leitura.
Retorna o valor de temperatura na escala selecionada.
readHumidity()
Pega as leituras de umidade relativa do ar.
float dht.readHumidity(bool force);
- force : força para entrar no modo leitura.
Retorna valor de umidade.
Materiais necessários
Para desenvolver nossa aplicação os materiais utilizados foram:
- Placa Franzininho WiFi
- DHT22
- Resistor 4,7k ohms.
- Jumpers
- Arduino IDE
Circuito para leitura do DHT22
No nosso circuito, é importante ter em mente que o sensor DHT22 possui quatro pinos: um para dados, dois para alimentação (VCC e GND) e outro que não é conectado. Vamos conectar o pino de dados à GPIO4 e utilizar um resistor de pull-up. A imagem abaixo ilustra a conexão para nos auxiliar
Para mais informações sobre o sensor consulte o datasheet. Na imagem abaixo temos a referência de cada pino.
Código
No projeto proposto, realizaremos a leitura da temperatura e umidade relativa do ar utilizando o sensor DHT22. Abaixo está o código comentado. Caso surjam dúvidas em relação aos métodos utilizados, consulte a seção sobre os detalhes da biblioteca DHT para obter mais informações.
/*
Autor : Equipe Embarcados
*/
// Inclui a biblioteca do DHT
#include "DHT.h"
// Define o pino
#define DHTPIN 4
// Declara o construtor e insere os pâmetros
DHT dht22(DHTPIN,DHT22);
// Estrutura de dados para receber as váriaveis
// relacionadas ao DHT22
struct data_t
{
float hum;
float temp;
};
//Delcara a estrutura de dados
struct data_t dht;
void setup()
{
// Inicializa comunicação Serial com baudrate de 115200 bps
Serial.begin(115200);
// Inicializa o driver One Wire para comunica-se com o sensor
dht22.begin();
Serial.println("Iniciando demo DTH");
}
void loop()
{
// Recebe o valor de umidade
dht.hum = dht22.readHumidity();
// Recebe o valor de temperatura
dht.temp = dht22.readTemperature();
// Caso as leituras não recebam valores válido, então
// imprime a informação ("Falha na leitura")
if (isnan(dht.hum) || isnan(dht.temp))
{
Serial.println(F("Falha na leitura!"));
}
// Caso contrário então mostra as informações de temperarura e umidade
else
{
Serial.println("Dados climáticos ");
Serial.print(F("Umidade: "));
Serial.print(dht.hum);
Serial.println("% ");
Serial.print(F("Temperatura: "));
Serial.print(dht.temp);
Serial.println(F(" °C "));
}
// Aguarda 2 segundos
delay(2000);
}Simule esse exemplo no Wokwi: https://wokwi.com/projects/366181593139899393
Explicação do Código
Nesta seção, explicaremos o código linha por linha, para garantir uma compreensão completa e entender a finalidade de cada função utilizada.
Incluiu-se a biblioteca do DHT para acessar a classe que inclui todos os métodos utilizados para iniciar a comunicação com o dispositivo.
// Inclui a biblioteca do DHT
#include "DHT.h"Define-se o pino físico utilizado para conectar-se ao sensor.
// Define o pino
#define DHTPIN 4Declaramos o construtor junto aos seus parâmetros de pino (DHTPIN) e o tipo de DHT (DHT11, DHT22 ou DHT21).
// Declara o construtor e insere os parâmetros
DHT dht22(DHTPIN,DHT22);Criamos uma estrutura de dados para organizar todos os dados referentes ao DHT (temperatura e umidade). Logo em seguida declaramos a estrutura de dados.
// Estrutura de dados para receber as variáveis
// relacionadas ao DHT22
struct data_t
{
float hum;
float temp;
};
//Declara a estrutura de dados
struct data_t dht;No setup, configuramos o canal de comunicação serial com Baud Rate de 115200 (bps).
// Inicializa comunicação Serial com baudrate de 115200 bps
Serial.begin(115200);Inicializamos o driver do sensor e imprimimos na tela informando que estamos prontos para rodar o programa. Entenda por driver, um código que abstrai muitas a camada mais baixo nível entre o DHT e o Franzininho WiFi.
// Inicializa o driver One Wire para comunicar-se com o sensor
dht22.begin();
Serial.println("Iniciando demo DTH");No loop, onde vamos rodar repetidamente o programa, recebemos a leitura da umidade e da temperatura.
// Recebe o valor de umidade
dht.hum = dht22.readHumidity();
// Recebe o valor de temperatura
dht.temp = dht22.readTemperature();Caso uma das leituras não seja valores numéricos, então consideramos a leitura inválida e imprime no Monitor Serial a frase “Falha na leitura!”.
if (isnan(dht.hum) || isnan(dht.temp))
{
Serial.println(F("Falha na leitura!"));
}Caso contrário, as leituras sendo válidas, imprimiremos os valores de temperatura e umidade. Após essa etapa aguardamos dois segundos, pois a taxa de amostragem de dados é 0.5 Hz (2 segundos).
else
{
Serial.println(" Dados climáticos ");
Serial.print(F("# Umidade: "));
Serial.print(dht.hum);
Serial.println("% ");
Serial.print(F("#Temperatura: "));
Serial.print(dht.temp);
Serial.println(F(" °C "));
}
// Aguarda 2 segundos
delay(2000);Conclusão
Neste artigo, abordamos o módulo DHT22 e apresentamos um exemplo simples de projeto para realizar a leitura de temperatura e umidade em um ambiente. No entanto, esse módulo possui diversas possibilidades de aplicação, como a criação de algoritmos para controlar o acionamento de refrigeradores ou aquecedores, monitorar estufas e muito mais. Encorajamos os leitores a explorar ao máximo o potencial desse módulo e compartilhar seus resultados e projetos com a comunidade.




