Guia de como usar sensores DHT11 e DHT22 com Arduino

Tempo de leitura: 12 minutes

Neste tutorial, você aprenderá como os sensores digitais de temperatura e umidade DHT11 e DHT22 / AM2302 funcionam e como você pode usá-los com o Arduino. Esses sensores são muito populares para projetos eletrônicos DIY e são perfeitos para estações meteorológicas remotas, projetos de automação residencial e sistemas de monitoramento de plantas/jardins.

Neste artigo, incluí diagramas de ligação’ e vários códigos de exemplo para que você possa começar a fazer experiências com seu sensor. Após cada exemplo, eu analiso e explico como o código funciona, então você não deve ter problemas para modificá-lo para atender às suas necessidades.

Primeiro, daremos uma olhada na biblioteca Adafruit DHT. A seguir, mostrarei como você pode combinar o sensor com um LCD 16×2 para criar uma estação meteorológica simples.

 

Suprimentos

Componentes de hardware

Sensor DHT11 de 4 pinos × 1
Sensor DHT22/AM2302 de 4 pinos × 1
Sensor DHT11 de 3 pinos (recomendado) × 1
Sensor DHT22/AM2302 de 3 pinos (recomendado) × 1
Resistor 5 e 10 kΩ  (apenas para sensores de 4 pinos) × 1
Arduino Uno Rev3 × 1
ProtoBoard × 1
Fios de jumpers ~ 10
Cabo USB tipo A/B × 1
LCD I2C de 16×2 caracteres (opcional) × 1

 

Como funcionam os sensores de temperatura e umidade DHT11 e DHT22/AM2302?

Se você abrir um sensor DHT11 ou DHT22/AM2302, verá que ele contém dois elementos sensores: um elemento sensor de umidade e um NTC (termistor).

O elemento sensor de umidade consiste em dois eletrodos com um substrato de retenção de umidade entre eles. O sensor mede a resistência entre os eletrodos, que muda dependendo da quantidade de umidade do ar.

Na parte traseira do sensor, você encontrará um pequeno CI que mede e processa o sinal analógico. Ele também armazena os coeficientes de calibração e faz a conversão de analógico para digital.

 

O que é umidade relativa?

Quando você olhar a ficha técnica dos sensores DHTxx, verá que eles medem a umidade relativa (UR) do ar e não a umidade absoluta. Mas qual é a diferença? A umidade absoluta é a quantidade de vapor d’água no ar (expressa em g/m³), independente da temperatura. A umidade relativa leva a temperatura em consideração.

A umidade relativa é a razão entre a quantidade real de vapor d’água presente no ar e a quantidade máxima de vapor d’água que o ar pode conter em uma determinada temperatura.

O ar quente pode reter mais água do que o ar frio. Isso significa que, para a mesma quantidade de vapor d’água no ar, a umidade relativa do ar frio será maior do que a do ar quente. Com 100 por cento de umidade relativa, o ar está saturado e está em seu ponto de orvalho.

 

Especificações DHT11

Tensão operacional 3.3 – 5.5 V
Corrente operacional Medindo: 0,3 mA, espera: 60 μA
Faixa de medição de umidade 5 – 95 % RH ± 5 % RH
Faixa de medição de temperatura -20 – 60 °C ± 2 °C
Protocolo de comunicação 1-Wire
Período de amostragem > 2 seconds
Dimensões corporais 15.5 x 12 x 5.5 mm
Dimensões do pino 8 mm de comprimento, espaçamento de 2,54 mm
Vantagem Custo ultrabaixo
Custo Custo Aproximado 15 a 30R$

Para mais informações, você pode verificar o datasheet aqui:

 

Especificações DHT22/AM2302

Tensão operacional 3.3 – 5.5 V
Corrente operacional Medindo: 0,5 mA, espera: 15 μA
Faixa de medição de umidade 0 – 99.9 % RH ± 2 % RH
Faixa de medição de temperatura -40 – 80 °C ± 1 °C
Protocolo de comunicação 1-Wire bus protocolo
Período de amostragem 2 segundos
Dimensões corporais 25 x 15 x 7 mm, ⌀ 3 mm orifício de montagem
Dimensões do pino 7 mm de comprimento, espaçamento de 2,54 mm
Vantagem Mais preciso
Custo Custo Aproximado 15 a 30R$

Você pode baixar o datesheet do DHT22/AM2302 aqui:

Observe que o AM2302 é simplesmente uma versão com fio do sensor DHT22 com 3 condutores.

Como você 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 possui uma faixa de medição maior.

O DHT11 é um pouco menor que o DHT22 e também é mais barato.

O bom desses sensores é que eles são intercambiáveis, o que significa que você pode simplesmente substituir o DHT11 por um DHT22 ou vice-versa, a ligação é exatamente a mesma. Você só terá que fazer uma pequena mudança na configuração do código, como verá mais tarde.

 

Conectando DHT11 e DHT22/AM2302 ao Arduino Uno

Os diagramas de ligação/esquemas abaixo mostram como conectar sensores de temperatura e umidade de 3 ou 4 pinos ao Arduino Uno. Um resistor pull-up de 10 kΩ é necessário entre a linha de sinal e 5 V para garantir que o nível do sinal permaneça alto por padrão (consulte a ficha técnica para obter mais informações).

Ligação do sensor de temperatura e umidade DHT11 de 4 pinos para o Arduino Uno
Ligação do sensor de temperatura e umidade DHT22 de 4 pinos para o Arduino Uno

Observe que o sensor DHT22/AM2302 é conectado exatamente da mesma maneira que o DHT11. As conexões também são fornecidas na tabela abaixo. Numerei os pinos de 1 a 4 da esquerda para a direita quando os orifícios do sensor estão voltados para você.

 

Conexões DHT11 e DHT22 de 4 pinos

DHT11/DHT22 Arduino
Pino 1 5 V
Pino 2 Conecte ao pino digital 2 e 5 V via resistor de 10 kΩ
Pino 3 Não conectado
Pino 4 GND

Você também pode comprar os sensores montados em um pequeno PCB (sensores de 3 pinos). Essas placas breakout facilitam a conexão do sensor ao Arduino e também já incluem um resistor pull-up. Certifique-se de verificar a etiqueta do sensor, a ordem dos pinos pode ser diferente dependendo do fabricante.

Ligação do sensor de temperatura e umidade DHT11 de 3 pinos para o Arduino Uno

 

Conexões DHT11 de 3 pinos

3 pinos DHT11 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 você pode alterá-lo para qualquer pino digital que desejar.

Ligação do sensor de temperatura e umidade DHT22 de 3 pinos para o Arduino Uno

Conexões DHT22/AM2302 de 3 pinos

3 pinos DHT22 Arduino
DAT Pino digital 2
VCC 5 V
GND GND

 

Instalando as bibliotecas necessárias do Arduino

O código abaixo usa a biblioteca de sensores Adafruit DHT, que você pode baixar aqui no GitHub. Esta biblioteca só funciona se você também tiver a biblioteca Adafruit Unified Sensor instalada, que também está disponível no GitHub.

Você pode instalar a biblioteca acessando Sketch > Include Library > Add .ZIP Library no IDE do Arduino.

Outra opção é navegar para ools > Manage Libraries… ou digite Ctrl + Shift + I no Windows. O Manage Libraries irá abrir e atualizar a lista de bibliotecas instaladas.

Você pode pesquisar por ‘dht‘ e ‘sensor unificado adafruit‘ e procurar a biblioteca de Adafruit. Selecione a versão mais recente e clique em Instalar.

 

Código de exemplo Arduino do sensor de temperatura e umidade DHT11/DHT22

Você pode fazer o upload do seguinte código de exemplo para seu Arduino usando o IDE do Arduino. A seguir, explicarei como o código funciona.

Você pode copiar o código clicando no botão no canto superior direito do campo do código.

/* Código de exemplo do Arduino para sensores de temperatura e umidade DHT11, DHT22/AM2302 e DHT21/AM2301. */
// Incluir as bibliotecas:
#include <Adafruit_Sensor.h>
#include <DHT.h>
// Definir pino DHT:
#define DHTPIN 2
// Defina o tipo DHT, descomente qualquer tipo que você está usando!
#define DHTTYPE DHT11   // DHT 11 
// #define DHTTYPE DHT22 // DHT 22 (AM2302)
// #define DHTTYPE DHT21 // DHT 21 (AM2301)
// Inicialize o sensor DHT para Arduino de 16 MHz normal:
DHT dht = DHT(DHTPIN, DHTTYPE);
void setup() {
  // Comece a comunicação serial a uma taxa de transmissão de 9600:
  Serial.begin(9600);
  // Configuração do sensor:
  dht.begin();
}
void loop() {
  // Aguarde alguns segundos entre as medições:
  delay(2000);
  // A leitura da temperatura ou umidade leva cerca de 250 milissegundos!
  // As leituras do sensor também podem ser de até 2 segundos 'antigas' (é um sensor muito lento)
  // Leia a umidade em%:
  float h = dht.readHumidity();
  // Leia a temperatura em graus Celsius:
  float t = dht.readTemperature();
  // Leia a temperatura como Fahrenheit:
  float f = dht.readTemperature(true);
  // Verifique se alguma leitura falhou e saia mais cedo (para tentar novamente):
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Falha ao ler do sensor DHT!");
    return;
  }
  // Calcula o índice de calor em Fahrenheit (padrão):
  float hif = dht.computeHeatIndex(f, h);
  // Calcule o índice de calor em Celsius:
  float hic = dht.computeHeatIndex(t, h, false);
  Serial.print("Umidade: ");
  Serial.print(h);
  Serial.print(" % ");
  Serial.print("Temperatura: ");
  Serial.print(t);
  Serial.print(" \xC2\xB0");
  Serial.print("C | ");
  Serial.print(f);
  Serial.print(" \xC2\xB0");
  Serial.print("F ");
  Serial.print("Índice de calor: ");
  Serial.print(hic);
  Serial.print(" \xC2\xB0");
  Serial.print("C | ");
  Serial.print(hif);
  Serial.print(" \xC2\xB0");
  Serial.println("F");
}

Você deve ver a seguinte saída no monitor serial (Ctrl + Shift + M):

Explicação do código

A primeira etapa é incluir a biblioteca Adafruit DHT e Unified Sensor.

// Incluir as bibliotecas:
#include <Adafruit_Sensor.h>
#include <DHT.h>

Em seguida, precisamos definir o pino de conexão DHT para Arduino e também definir o tipo de sensor DHT. Em nosso exemplo, estamos usando um sensor DHT11 conectado 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. Portanto, sempre que você mencionar DHTPIN, o compilador o substituirá pelo valor 2 quando o programa for compilado.

//Definir pino DHT:
#define DHTPIN 2
//Defina o tipo DHT, descomente qualquer tipo que você está usando!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)

Em seguida, você precisa criar uma nova instância da classe DHT com o tipo e a conexão DHT apropriados. Para isso, usamos a função DHT(pin,type).

Neste caso, chamei o sensor de ‘dht’, mas você também pode usar outros nomes, como ‘temperatura_sensor’ ou ‘dht11’ etc. DHT temperature_sensor = DHT(DHTPIN, DHTTYPE);. Você pode criar várias instâncias da classe DHT com diferentes nomes e pinos/tipos. Isso permite que você use facilmente 2 ou mais sensores ao mesmo tempo.

// Inicialize o sensor DHT para Arduino de 16 MHz normal:
DHT dht = DHT(DHTPIN, DHTTYPE);

No setup(), iniciamos a comunicação serial a uma taxa de transmissão de 9600. Certifique-se de que o Monitor Serial também esteja definido como 9600! Também inicializamos o sensor com dht.begin()

void setup() {
 // Comece a comunicação serial a uma taxa de transmissão de 9600:
  Serial.begin(9600);
  // Configuração do sensor:
  dht.begin();
}

A seção loop() do código começa com um atraso de 2 segundos. Este atraso existe para dar ao sensor algum tempo para fazer as leituras. A taxa de detecção máxima do DHT22 é a cada 2 segundos e a do DHT11 é uma vez a cada segundo.

// Aguarde alguns segundos entre as medições:
delay(2000)

Fazer leituras de temperatura e umidade é super fácil porque a biblioteca tem várias funções integradas. Para obter uma leitura de umidade em ‘%’, você pode usar a função readHumidity(). Neste caso, estamos salvando a leitura como a variável ‘h’. Observe que é do tipo float.

Quando você deseja usar uma função no objeto DHT, primeiro você precisa especificar o nome que deu ao sensor. Portanto, no nosso caso, é ‘dht’.

// Leia a umidade em%:
float h = dht.readHumidity();

Fazer leituras de temperatura também é fácil com a função readTemperature().

// Leia a temperatura em graus Celsius:
float t = dht.readTemperature();

Se quiser obter a temperatura em Fahrenheit em vez de Celsius, você tem duas opções. Você pode passar true para a função readTemperature ou pode usar a função de conversão:

// Leia a temperatura como Fahrenheit:
float f = dht.readTemperature(true);
// Alternativa, use a função de conversão:
float f = dht.convertCtoF(t);

Em seguida, há uma pequena seção de código que verifica se o sensor está conectado corretamente e retornando uma leitura. Caso contrário, uma mensagem de erro será impressa no Monitor Serial.

// Verifique se alguma leitura falhou e saia mais cedo (para tentar novamente):
if (isnan(h) || isnan(t) || isnan(f)) {
  Serial.println("Falha ao ler do sensor DHT!");
  return;
}

A biblioteca também possui uma função incorporada que pode calcular o índice de calor combinando as leituras de temperatura e umidade. O índice de calor também é conhecido como “temperatura do ar sentido” ou “temperatura aparente”.

// Calcula o índice de calor em Fahrenheit (padrão):
float hif = dht.computeHeatIndex(f, h);
// Calcule o índice de calor em Celsius:
float hic = dht.computeHeatIndex(t, h, false);

Por fim, as leituras são exibidas no Monitor Serial. Observe que a linha Serial.print(" \xC2\xB0"); é usado 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");

 

Código de exemplo para sensor de temperatura e umidade DHT11 e DHT22/AM2302 com LCD I2C e Arduino

Ao combinar um sensor de temperatura e umidade com um pequeno LCD, você pode criar uma estação meteorológica barata.

Você precisará fazer algumas conexões extras com o Arduino para que possamos controlar o LCD de 16 × 2 caracteres. O sensor DHT11 ou DHT22/AM2302 é conectado da mesma forma que antes.

O diagrama de ligação abaixo mostra como conectar um LCD I2C ao Arduino.

Sensor de temperatura e umidade DHT11 com LCD de 16×2 caracteres I2C e diagrama de ligação Arduino

As conexões também são fornecidas na seguinte tabela:

Conexões LCD I2C

I2C LCD Arduino
GND GND
VCC 5 V
SDA A4
SCL A5

Se você não estiver usando um Arduino Uno, os pinos SDA e SCL podem estar em um local diferente. Um Arduino UNO com layout R3 (pinagem 1.0), também tem os cabeçalhos de pinos SDA (linha de dados) e SCL (linha de clock) próximos ao pino AREF. Verifique a tabela abaixo para mais detalhes.

Placas 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

Locais de pinos I2C para diferentes placas Arduino

O código usa a biblioteca LiquidCrystal_I2C, que você pode baixar aqui no GitHub. Também inclui a biblioteca Wire.h, que permite a comunicação com dispositivos I2C. ou baixe em nosso servidor a versão (aqui).

O código abaixo é basicamente o mesmo de antes, mas agora exibimos a temperatura e a umidade no LCD em vez do Monitor Serial.

Você pode copiar o código clicando no botão no canto superior direito do campo do código.

/* Código de exemplo do Arduino para sensores de temperatura e umidade DHT11, DHT22 / AM2302 e DHT21 / AM2301 com LCD I2C. */
// Incluir as bibliotecas:
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definir pino DHT:
#define DHTPIN 2
// Defina o tipo DHT, descomente qualquer tipo que você está usando!
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
// Inicialize o sensor DHT para Arduino de 16 MHz normal:
DHT dht = DHT(DHTPIN, DHTTYPE);
// Cria o objeto lcd da classe LiquidCrystal_I2C: 
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup() {
  // Configuração do sensor:
  dht.begin();
   // Inicializa o display LCD 16x2
  //lcd.begin (16, 2); para 
  // Inicializa o display LCD 20x4
  lcd.begin (20, 4);
  // Liga a luz de fundo do LCD
  lcd.setBacklight(HIGH); 
}
void loop() {
  // Aguarde alguns segundos entre as medições:
  delay(2000);
  // A leitura da temperatura ou umidade leva cerca de 250 milissegundos!
  // As leituras do sensor também podem ser de até 2 segundos 'antigas' (é um sensor muito lento)
  // Leia a umidade em%:
  float h = dht.readHumidity();
  // Leia a temperatura em graus Celsius:
  float t = dht.readTemperature();
  // Leia a temperatura como Fahrenheit:
  float f = dht.readTemperature(true);
  // Calcula o índice de calor em Fahrenheit (padrão):
  float hif = dht.computeHeatIndex(f, h);
  // Calcule o índice de calor em Celsius:
  float hic = dht.computeHeatIndex(t, h, false);
  // Imprima a temperatura e a umidade no 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(" %");
}

Você deve ver a seguinte saída no LCD:

(EM Breve)

 

Guia de solução de problemas DHT11 / DHT22

Ao trabalhar com esses sensores, você 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 retornar uma leitura. Isso pode ter várias causas:

  • Tipo de sensor: certifique-se de ter removido o comentário do DHTTYPE correto na configuração do código. Verifique o exemplo acima.
  • Taxa de amostragem: Os sensores DHT são bastante lentos, a taxa de amostragem máxima é de cerca de 2 segundos. Aumentar o atraso entre as medições pode resolver esse erro.
  • Alimentação: Embora os sensores DHTxx possam trabalhar de 3,3 a 5 V, o fabricante recomenda 5 V. Em alguns casos, alimentar o sensor com 5 V resolve o problema. Certifique-se de que seu microcontrolador também suporta 5 V nos pinos GPIO.

Erro fatal: Adafruit_Sensor.h: Esse arquivo ou diretório não existe

Você pode obter este erro ao tentar compilar o código. Isso significa que você não instalou (corretamente) a biblioteca Adafruit Unified Sensor.

Basta rolar um pouco para cima neste post e você verá onde e como você pode baixar e instalar a biblioteca.

 

Conclusão

Neste artigo, mostrei como os sensores de temperatura e umidade DHT11 e DHT22/AM2302 funcionam e como você pode usá-los com o Arduino. Espero que você tenha achado útil e informativo. Se sim, compartilhe com um amigo que também gosta de eletrônicos e de fazer coisas!

Eu adoraria saber quais projetos você planeja construir (ou já construiu) com este sensor. Se você tiver alguma dúvida, sugestão ou se achar que falta algo neste tutorial, por favor, deixe um comentário abaixo.

 

Visits: 2 Visits: 1199047