Skip to Content

Como usar os sensores DHT11 e DHT22 com Arduino

Como usar os sensores DHT11 e DHT22 com Arduino

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× 1Amazon
4 pin DHT22/AM2302 sensor× 1Amazon
3 pin DHT11 sensor (recomendado)× 1Amazon
3 pin DHT22/AM2302 sensor (recomendado)× 1Amazon
5 – 10 kΩ resistor (apenas para sensores de 4 pinos)× 1Amazon
Arduino Uno Rev3× 1Amazon
Breadboard× 1Amazon
Jumper wires~ 10Amazon
USB cable type A/B× 1Amazon
16×2 character I2C LCD (opcional)× 1Amazon

Software

Arduino IDEArduino IDE

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 funcionamento3.3 – 5.5 V
Corrente de funcionamentoMedição: 0.3 mA, standby: 60 μA
Intervalo de medição de humidade5 – 95 % HR ± 5 % HR
Intervalo de medição de temperatura-20 – 60 °C ± 2 °C
Protocolo de comunicação1-Wire
Período de amostragem> 2 segundos
Dimensões do corpo15.5 x 12 x 5.5 mm
Dimensões dos pinos8 mm de comprimento, espaçamento de 2.54 mm
VantagemCusto ultra baixo
PreçoCheck price

Para mais informações, pode consultar a folha de dados abaixo:

Especificações do DHT22/AM2302

Tensão de funcionamento3.3 – 5.5 V
Corrente de funcionamentoMedição: 0.5 mA, standby: 15 μA
Intervalo de medição de humidade0 – 99.9 % HR ± 2 % HR
Intervalo de medição de temperatura-40 – 80 °C ± 1 °C
Protocolo de comunicaçãoProtocolo de barramento 1-Wire
Período de amostragem2 segundos
Dimensões do corpo25 x 15 x 7 mm, furo de montagem ⌀ 3 mm
Dimensões dos pinos7 mm de comprimento, espaçamento de 2.54 mm
VantagemMais preciso
PreçoCheck 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.

AM2302 Sensor
AM2302 Sensor

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

DHT11-with-Arduino-UNO-wiring-diagram-schematic
Ligação do sensor de temperatura e humidade DHT11 de 4 pinos ao Arduino Uno
DHT22-with-Arduino-UNO-wiring-diagram-schematic
Ligação do sensor de temperatura e humidade DHT22 de 4 pinos ao Arduino Uno

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/DHT22Arduino
Pino 15 V
Pino 2Ligar ao pino digital 2 e aos 5 V via resistor de 10 kΩ
Pino 3Não ligado
Pino 4GND

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.

DHT11-3-pin-with-Arduino-UNO-wiring-diagram-schematic
Ligação do sensor de temperatura e humidade DHT11 de 3 pinos ao Arduino Uno

Ligações dos pinos 3 do DHT11

DHT11 de 3 pinosArduino
sPino 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.

DHT22-3-pin-with-Arduino-UNO-wiring-diagram-schematic
Ligação do sensor de temperatura e humidade DHT22 de 3 pinos ao Arduino Uno

Ligações dos pinos 3 do DHT22/AM2302

DHT22 de 3 pinosArduino
DATPino digital 2
VCC5 V
GNDGND

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.

Installing an Arduino library step 1 open Library Manager
Gestor de Bibliotecas

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

Installing an Arduino library step 2 DHT Adafruit
Instalar a Biblioteca DHT Adafruit

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

DHT11 temperature and humidity sensor Serial Monitor output
Saída do monitor serial

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

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.

DHT11-with-I2C-LCD-and-Arduino-UNO-wiring-diagram-schematic
Diagrama de ligação do sensor de temperatura e humidade DHT11 com LCD de caracteres 16×2 I2C e Arduino

As ligações também estão indicadas na tabela seguinte:

Ligações do LCD I2C

LCD I2CArduino
GNDGND
VCC5 V
SDAA4
SCLA5

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.

PlacaSDASCL
Arduino UnoA4A5
Arduino NanoA4A5
Arduino Micro23
Arduino Mega 25602021
Arduino Leonardo23
Arduino Due2021
Localização dos pinos I2C para diferentes placas Arduino

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.