Neste tutorial, você vai aprender como DHT11 e DHT22/AM2302 sensores digitais de temperatura e humidade funcionam e como pode usá-los com Arduino. Estes sensores são muito populares para projetos de eletrónica DIY e são perfeitos para estações meteorológicas remotas, projetos de automação doméstica e sistemas de monitorização de plantas/jardins.
Neste artigo, incluí diagramas de ligação e vários exemplos de código para que possa começar a experimentar com o seu sensor. Após cada exemplo, explico detalhadamente como o código funciona, para que não tenha problemas em modificá-lo conforme as suas necessidades.
Primeiro, vamos analisar a biblioteca Adafruit DHT. Depois, vou mostrar como pode combinar o sensor com um LCD 16×2 para criar uma estação meteorológica simples.
Materiais
Componentes de hardware
| 4 pin DHT11 sensor | × 1 | Amazon |
| 4 pin DHT22/AM2302 sensor | × 1 | Amazon |
| 3 pin DHT11 sensor (recomendado) | × 1 | Amazon |
| 3 pin DHT22/AM2302 sensor (recomendado) | × 1 | Amazon |
| 5 – 10 kΩ resistor (apenas para sensores de 4 pinos) | × 1 | Amazon |
| Arduino Uno Rev3 | × 1 | Amazon |
| Breadboard | × 1 | Amazon |
| Jumper wires | ~ 10 | Amazon |
| USB cable type A/B | × 1 | Amazon |
| 16×2 character I2C LCD (opcional) | × 1 | Amazon |
Software
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Como funcionam os sensores de temperatura e humidade DHT11 e DHT22/AM2302?
Se abrir um DHT11 ou DHT22/AM2302 sensor, verá que contém dois elementos de deteção: um elemento para humidade e um NTC (termístor).
O elemento de deteção de humidade consiste em dois eletrodos com um substrato que retém humidade entre eles. O sensor mede a resistência entre os eletrodos, que varia conforme a quantidade de humidade no ar.
Na parte de trás do sensor, encontrará um pequeno CI que mede e processa o sinal analógico. Também armazena os coeficientes de calibração e faz a conversão analógico-digital.
O que é a humidade relativa?
Ao consultar a folha de dados dos sensores DHTxx, verá que medem a humidade relativa (HR) do ar e não a humidade absoluta. Mas qual é a diferença? A humidade absoluta é a quantidade de vapor de água no ar (expressa em g/m³), independentemente da temperatura. A humidade relativa considera a temperatura.
A humidade relativa é a razão entre a quantidade real de vapor de água presente no ar e a quantidade máxima de vapor de água que o ar pode conter a uma dada temperatura.
O ar quente pode conter mais água do que o ar frio. Isto significa que, para a mesma quantidade de vapor de água no ar, a humidade relativa no ar frio será maior do que no ar quente. A 100% de humidade relativa, o ar está saturado e atinge o ponto de orvalho.
Especificações do DHT11
| Tensão de funcionamento | 3.3 – 5.5 V |
| Corrente de funcionamento | Medição: 0.3 mA, standby: 60 μA |
| Intervalo de medição de humidade | 5 – 95 % HR ± 5 % HR |
| Intervalo de medição de temperatura | -20 – 60 °C ± 2 °C |
| Protocolo de comunicação | 1-Wire |
| Período de amostragem | > 2 segundos |
| Dimensões do corpo | 15.5 x 12 x 5.5 mm |
| Dimensões dos pinos | 8 mm de comprimento, espaçamento de 2.54 mm |
| Vantagem | Custo ultra baixo |
| Preço | Check price |
Para mais informações, pode consultar a folha de dados abaixo:
Especificações do DHT22/AM2302
| Tensão de funcionamento | 3.3 – 5.5 V |
| Corrente de funcionamento | Medição: 0.5 mA, standby: 15 μA |
| Intervalo de medição de humidade | 0 – 99.9 % HR ± 2 % HR |
| Intervalo de medição de temperatura | -40 – 80 °C ± 1 °C |
| Protocolo de comunicação | Protocolo de barramento 1-Wire |
| Período de amostragem | 2 segundos |
| Dimensões do corpo | 25 x 15 x 7 mm, furo de montagem ⌀ 3 mm |
| Dimensões dos pinos | 7 mm de comprimento, espaçamento de 2.54 mm |
| Vantagem | Mais preciso |
| Preço | Check price |
Pode descarregar a folha de dados do DHT22/AM2302 abaixo:
Note que o AM2302 é simplesmente uma versão com fios do sensor DHT22 com 3 ligações.

Como pode ver, as especificações do DHT11 e do DHT22/AM2302 são bastante semelhantes. A principal diferença é que o DHT22 é mais preciso e tem um intervalo de medição maior. O DHT11 é um pouco mais pequeno que o DHT22 e também mais barato.
O bom destes sensores é que são intercambiáveis, ou seja, pode simplesmente substituir o DHT11 por um DHT22 ou vice-versa, a ligação é exatamente a mesma. Só terá de fazer uma pequena alteração no código, como verá mais adiante.
Ligação – Conectar DHT11 e DHT22/AM2302 ao Arduino Uno
Os diagramas/esquemas abaixo mostram como ligar sensores de temperatura e humidade de 3 ou 4 pinos ao Arduino Uno. É necessário um resistor pull-up de 10 kΩ entre a linha de sinal e os 5 V para garantir que o nível do sinal se mantém alto por defeito (consulte a folha de dados para mais informações).


Note que o sensor DHT22/AM2302 é ligado exatamente da mesma forma que o DHT11. As ligações também estão indicadas na tabela abaixo. Numerei os pinos de 1 a 4 da esquerda para a direita, com os furos do sensor virados para si.
Ligações dos pinos 4 do DHT11 e DHT22
| DHT11/DHT22 | Arduino |
|---|---|
| Pino 1 | 5 V |
| Pino 2 | Ligar ao pino digital 2 e aos 5 V via resistor de 10 kΩ |
| Pino 3 | Não ligado |
| Pino 4 | GND |
Também pode comprar os sensores montados numa pequena PCB (sensores de 3 pinos). Estas placas breakout facilitam a ligação do sensor ao Arduino e já incluem um resistor pull-up. Certifique-se de verificar o rótulo do sensor, a ordem dos pinos pode variar consoante o fabricante.

Ligações dos pinos 3 do DHT11
| DHT11 de 3 pinos | Arduino |
|---|---|
| s | Pino digital 2 |
| + | 5 V |
| – | GND |
Os exemplos de código abaixo usam o pino digital 2 para receber os dados do sensor, mas pode alterar para qualquer pino digital que desejar.

Ligações dos pinos 3 do DHT22/AM2302
| DHT22 de 3 pinos | Arduino |
|---|---|
| DAT | Pino digital 2 |
| VCC | 5 V |
| GND | GND |
Instalar as bibliotecas Arduino necessárias
O código abaixo usa a biblioteca Adafruit DHT sensor que pode descarregar em GitHub. Esta biblioteca só funciona se também tiver instalada a biblioteca Adafruit Unified Sensor , que também está disponível em GitHub.
Também pode descarregar as duas bibliotecas clicando nos botões abaixo:
Pode instalar a biblioteca indo a Sketch > Include Library > Add .ZIP Library no Arduino IDE.
Outra opção é navegar até Tools > Manage Libraries… ou pressionar Ctrl + Shift + I no Windows. O Gestor de Bibliotecas abrirá e atualizará a lista de bibliotecas instaladas.

Pode procurar por ‘dht’ e ‘adafruit unified sensor’ e procurar a biblioteca da Adafruit. Selecione a versão mais recente e clique em Instalar.

Exemplo de código Arduino para sensor de temperatura e humidade DHT11/DHT22
Pode carregar o seguinte código de exemplo para o seu Arduino usando o Arduino IDE. A seguir, explicarei como o código funciona.
Pode copiar o código clicando no botão no canto superior direito do campo de código.
/* Arduino example code for DHT11, DHT22/AM2302
and DHT21/AM2301 temperature and humidity sensors.
www.www.makerguides.com */
#include "Adafruit_Sensor.h"
#include "DHT.h"
// Set DHT pin:
#define DHTPIN 2
// Set DHT type, uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Initialize DHT sensor for normal 16mhz Arduino:
DHT dht = DHT(DHTPIN, DHTTYPE);
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Setup sensor:
dht.begin();
}
void loop() {
// Wait a few seconds between measurements:
delay(2000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
// Read the humidity in %:
float h = dht.readHumidity();
// Read the temperature as Celsius:
float t = dht.readTemperature();
// Read the temperature as Fahrenheit:
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again):
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Compute heat index in Fahrenheit (default):
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius:
float hic = dht.computeHeatIndex(t, h, false);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(f);
Serial.print(" \xC2\xB0");
Serial.print("F ");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(hif);
Serial.print(" \xC2\xB0");
Serial.println("F");
}
Deverá ver a seguinte saída no monitor serial (Ctrl + Shift + M):

Explicação do código
O primeiro passo é incluir as bibliotecas Adafruit DHT e Unified Sensor.
#include "Adafruit_Sensor.h" #include "DHT.h"
De seguida, precisamos definir o pino de ligação do DHT ao Arduino e também o tipo de sensor DHT. No nosso exemplo, usamos um sensor DHT11 ligado ao pino 2.
A instrução #define é usada para dar um nome a um valor constante. O compilador substituirá todas as referências a esta constante pelo valor definido quando o programa for compilado. Assim, sempre que mencionar DHTPIN, o compilador substituirá pelo valor 2 na compilação.
// Set DHT pin: #define DHTPIN 2 // Set DHT type, uncomment whatever type you're using! #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301)
Depois, precisa criar uma nova instância da classe DHT com o tipo e ligação apropriados. Para isso, usamos a função DHT(pin,type).
Neste caso, chamei o sensor de ‘dht’, mas pode usar outros nomes, como ‘temperature_sensor’ ou ‘dht11’, etc. DHT temperature_sensor = DHT(DHTPIN, DHTTYPE);. Pode criar múltiplas instâncias da classe DHT com nomes, pinos e tipos diferentes. Isto permite usar facilmente 2 ou mais sensores ao mesmo tempo.
// Initialize DHT sensor for normal 16mhz Arduino: DHT dht = DHT(DHTPIN, DHTTYPE);
Função setup
Na setup(), iniciamos a comunicação serial a 9600 baud. Certifique-se de que o Monitor Serial também está configurado para 9600! Também inicializamos o sensor com dht.begin().
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Setup sensor:
dht.begin();
}
Função loop
A loop() do código começa com um atraso de 2 segundos. Este atraso serve para dar tempo ao sensor para fazer as leituras. A taxa máxima de medição do DHT22 é a cada 2 segundos e do DHT11 é uma vez por segundo.
// Wait a few seconds between measurements: delay(2000);
Fazer leituras de temperatura e humidade é muito fácil porque a biblioteca tem várias funções integradas. Para obter uma leitura de humidade em ‘%’, pode usar a função readHumidity(). Neste caso, guardamos a leitura na variável ‘h’. Note que é do tipo float.
Quando quiser usar uma função no objeto DHT, primeiro precisa especificar o nome que deu ao sensor. No nosso caso, é ‘dht’.
// Read the humidity in %: float h = dht.readHumidity();
Fazer leituras de temperatura é tão fácil quanto com a função readTemperature().
// Read the temperature as Celsius: float t = dht.readTemperature();
Se quiser obter a temperatura em Fahrenheit em vez de Celsius, tem duas opções. Pode passar true para a função readTemperature, ou pode usar a função convert:
// Read the temperature as Fahrenheit: float f = dht.readTemperature(true); // Alternative, use convert function: float f = dht.convertCtoF(t);
De seguida, há uma pequena secção de código que verifica se o sensor está ligado corretamente e está a devolver uma leitura. Caso contrário, uma mensagem de erro será mostrada no Monitor Serial.
// Check if any reads failed and exit early (to try again):
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
A biblioteca também tem uma função integrada que pode calcular o índice de calor combinando as leituras de temperatura e humidade. O heat index é também conhecido como “temperatura aparente” ou “temperatura sentida”.
// Compute heat index in Fahrenheit (default): float hif = dht.computeHeatIndex(f, h); // Compute heat index in Celsius: float hic = dht.computeHeatIndex(t, h, false);
Finalmente, as leituras são mostradas no Monitor Serial. Note que a linha Serial.print(" \xC2\xB0"); é usada para imprimir o símbolo de grau.
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(f);
Serial.print(" \xC2\xB0");
Serial.print("F ");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(hif);
Serial.print(" \xC2\xB0");
Serial.println("F");
Exemplo de código para sensor de temperatura e humidade DHT11 e DHT22/AM2302 com LCD I2C e Arduino
Ao combinar um sensor de temperatura e humidade com um pequeno LCD, pode criar uma estação meteorológica barata.
No exemplo seguinte, vou usar um LCD de caracteres I2C. Será necessário fazer algumas ligações extra ao Arduino para controlar o LCD 16×2. O sensor DHT11 ou DHT22/AM2302 é ligado da mesma forma que antes.
O diagrama de ligação abaixo mostra como ligar um LCD I2C ao Arduino.

As ligações também estão indicadas na tabela seguinte:
Ligações do LCD I2C
| LCD I2C | Arduino |
|---|---|
| GND | GND |
| VCC | 5 V |
| SDA | A4 |
| SCL | A5 |
Se não estiver a usar um Arduino Uno, os pinos SDA e SCL podem estar noutro local. Um Arduino UNO com layout R3 (pinout 1.0) também tem os pinos SDA (linha de dados) e SCL (linha de relógio) perto do pino AREF. Consulte a tabela abaixo para mais detalhes.
| Placa | SDA | SCL |
|---|---|---|
| Arduino Uno | A4 | A5 |
| Arduino Nano | A4 | A5 |
| Arduino Micro | 2 | 3 |
| Arduino Mega 2560 | 20 | 21 |
| Arduino Leonardo | 2 | 3 |
| Arduino Due | 20 | 21 |
O código usa a biblioteca LiquidCrystal_I2C , que pode descarregar em GitHub. Inclui também a biblioteca Wire.h , que permite comunicar com dispositivos I2C. Esta biblioteca já vem pré-instalada no Arduino IDE.
O código abaixo é quase igual ao anterior, mas agora mostramos a temperatura e humidade no LCD em vez do Monitor Serial.
Pode copiar o código clicando no botão no canto superior direito do campo de código.
/* Arduino example code for DHT11, DHT22/AM2302
and DHT21/AM2301 temperature and humidity sensors
with I2C LCD. More info: www.www.makerguides.com */
#include "Adafruit_Sensor.h"
#include "DHT.h"
#include "Wire.h"
#include "LiquidCrystal_I2C.h"
// Set DHT pin:
#define DHTPIN 2
// Define SDA and SCL pin for LCD:
#define SDAPin A4 // Data pin
#define SCLPin A5 // Clock pin
// Set DHT type, uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Initialize DHT sensor for normal 16mhz Arduino:
DHT dht = DHT(DHTPIN, DHTTYPE);
// Connect to LCD via I2C, default address 0x27 (A0-A2 not jumpered):
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); //Change to (0x27,20,4) for 2004 LCD
void setup() {
// Setup sensor:
dht.begin();
// Initiate the LCD:
lcd.init();
lcd.backlight();
}
void loop() {
// Wait a few seconds between measurements:
delay(2000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
// Read the humidity in %:
float h = dht.readHumidity();
// Read the temperature as Celsius:
float t = dht.readTemperature();
// Read the temperature as Fahrenheit:
float f = dht.readTemperature(true);
// Compute heat index in Fahrenheit (default):
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius:
float hic = dht.computeHeatIndex(t, h, false);
// Print the temperature and the humidity on the LCD:
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" " "\xDF" "C");
lcd.setCursor(0, 1);
lcd.print("Humid: ");
lcd.print(h);
lcd.print(" %");
}
Guia de resolução de problemas DHT11/DHT22
Ao trabalhar com estes sensores, pode receber as seguintes mensagens de erro:
“Falha ao ler do sensor DHT!”
Esta mensagem pode aparecer no monitor serial quando o sensor não devolve uma leitura. Isto pode ter várias causas:
- Tipo de sensor: Certifique-se de que descomentou o DHTTYPE correto no código. Verifique o exemplo acima.
- Taxa de amostragem: Os sensores DHT são relativamente lentos, a taxa máxima de amostragem é cerca de 2 segundos. Aumentar o atraso entre as medições pode resolver este erro.
- Alimentação: Embora os sensores DHTxx possam funcionar entre 3.3 e 5 V, o fabricante recomenda 5 V. Em alguns casos, alimentar o sensor com 5 V resolve o problema. Certifique-se de que o seu microcontrolador também suporta 5 V nos pinos GPIO.
“Erro fatal: Adafruit_Sensor.h: Ficheiro ou diretório não encontrado”
Pode receber este erro ao tentar compilar o código. Isto significa que não instalou (ou não instalou corretamente) a biblioteca Adafruit Unified Sensor .
Basta subir um pouco neste post e verá onde e como pode descarregar e instalar a biblioteca.
Conclusão
Neste artigo, mostrei como funcionam os sensores de temperatura e humidade DHT11 e DHT22/AM2302 e como pode usá-los com Arduino.
Espero que tenha achado útil e informativo. Para outros sensores de temperatura, dê uma vista de olhos ao nosso LM35 analog temperature sensor with Arduino e TMP36 analog temperature sensor with Arduino tutorial.
Se tiver alguma dúvida, sugestão ou se achar que falta algo neste tutorial, por favor deixe um comentário abaixo.

