Arduino

Sensor DHT11: Tutorial Completo (+Projeto Bônus)

Neste tutorial você irá aprender como funcionam todos os sensores da família DHT: DHT11, DHT21 e o DHT22.

Além disso, irei te mostrar como programar o sensor de umidade DHT11 com o Arduino de forma garantida e descomplicada.

Para fechar com chave de ouro, no final deste artigo há um projeto bônus onde você irá aprender a exibir a temperatura coletada pelo sensor DHT11 no visor de um LCD juntamente com o Arduino.

Preparado?

👨‍💻 Comprar Agora – Kit Iniciante Arduino com Tutorial e + 20 Projetos

Tudo sobre o DHT 11/21/22

Esses componentes são ótimos medidores não só de temperatura, mas, também da umidade.

Seguem abaixo as variações existentes desses sensores de temperatura DHT11, DHT21 e DHT22:

Pinout DHT11, DHT21 e DHT22

Mas, como funciona o sensor de umidade Arduino?

Você verá que seu princípio de medição é bastante simples.

Eles possuem um sensor de temperatura NTC (Coeficiente de temperatura negativa, sigla em inglês) e um circuito integrado CI como sendo o componente sensitivo à umidade.

Esse CI possui 2 eletrodos e mede a umidade relativa do ar através de um substrato. Observe:

Dessa forma, a umidade do ambiente em que você estiver é medida de acordo com a condutividade do substrato e, por causa disso, a resistência entre ambos eletrodos se altera.

Essa mudança de resistividade é calculada e processada pelo circuito integrado que já prepara os dados para serem lidos pelo microcontrolador.

Portanto, se caso a resistência entre os eletrodos diminuir é sinônimo de que a temperatura sofreu um aumento…

No gráfico abaixo, você consegue enxergar isso melhor:

Gráfico sensor DHT22

Veja as principais características do sensor de temperatura e umidade DHT11, DHT21 e do DHT22 na tabela abaixo:

EspecificaçõesDHT11DHT21DHT22
Temperatura de trabalho0°C até 50°C-40°C até 80°C-40°C até 80°C
Escala de umidade20 – 80% / ± 5%0 – 100% / ± 3%0 – 100% / ± 2%
Tensão de operação3.3 – 5V3.3 – 5V3.3 – 6V
Precisão a 25°C250 mV750 mV500 mV

Pinagem do sensor de temperatura DHT11

Bacana! Agora que você já entende o funcionamento dos sensores DHT, observe como se dá a pinagem do DHT11 que serve também para o DHT22:

Pinout DHT11

Pinagem VCC LM35 – Conecte este pino no +5V do Arduino;

– Já este, conecte-o na porta digital 8 e após, insira um resistor de 10kOhms e ligue-o no VCC;

– Não se preocupe com este pino pois ele não é utilizado para ligar em nada e analisando outros tutoriais na web, percebi que nenhum projeto liga este pino a alguma coisa. Meu palpite é que talvez ele seja utilizado para calibração ou para algum teste de fábrica;

– Como o próprio nome já diz, ligue este pino ao ground do seu Arduino!

Montagem do sensor de temperatura DHT11 com o Arduino

Segue a montagem dos componentes do projeto:

Montagem DHT11 com Arduino

Observe que o sensor possui 4 pinos e que é necessário o uso de um resistor de 5k à 10kOhms para manter a linha de dados estável durante a comunicação com o ATMEGA.

No entanto, os módulos DHT dispensam a utilização de resistores pois eles já possuem um resistor pull-up embutidos no módulo.

Módulo sensor de temperatura dht11
Exemplo de um módulo DHT11

Caso possua um desses, não se preocupe com o resistor. Não será necessário sua utilização na montagem do projeto.

Código utilizado no projeto

O sensor de temperatura DHT11 possui sua própria biblioteca padrão que irá ajudar no processamento e interpretação dos dados no Arduino.

Para fazer a instalação da biblioteca, veja a seguir o seguinte passo a passo:

Acesse: Sketch > Incluir Biblioteca > Gerenciar Bibliotecas
Biblioteca do sensor DHT11
Escreva DHT e ache a biblioteca da Adafruit e instale-a na IDE

Feito isso, use o código abaixo para programar seu sistema:

/*   Código do projeto sensor de temperatura da família DHT
    
     Monte seus próprios projetos sem dificuldade com programação! 
     ACESSE: https://flaviobabos.com.br/
*/

#include "DHT.h"
#define PINODHT 8

// Defina o modelo da família do seu DHT
#define MODELODHT DHT11

DHT dht(PINODHT, MODELODHT);

void setup() {
  Serial.begin(9600);
  
  // Inicialize o sensor
  dht.begin();

  Serial.println("Efetuando leituras!");

}

void loop() {
  
  // Aguarde alguns segundos entre as medidas
  delay(2000);

  // Lendo a umidade
  float umi  = dht.readHumidity();
  // Lendo a temperatura na escala Celsius
  float tempC = dht.readTemperature();
  // Lendo a temperatura na escala Fahrenheit
  float tempF = dht.readTemperature(true);

  // Verificando se as leituras falharam
  if (isnan(umi) || isnan(tempC) || isnan(tempF)) {
    Serial.println("Falha na leitura do seu sensor DHT!");
  } else {
    Serial.print("Umidade: ");
    Serial.print(umi);
    Serial.print("%");

    Serial.print("  |  "); 

    Serial.print("Temperatura: ");
    Serial.print(tempC);
    Serial.print("°C ~ ");
    Serial.print(tempF);
    Serial.println("°F");
  }
}

Projeto Bônus

Para que você domine por completo o sensor DHT11, preparei esse tutorial do projeto bônus. No final ele se parecerá com a seguinte imagem abaixo:

Sensor de temperatura DHT11 e LCD com Arduino
Projeto sensor de temperatura DHT11 com Display LCD e Arduino

Este é um projeto simples mas eficaz e que no final você poderá aprender muito com o sensor de temperatura DHT11, com o Arduino e com o Display LCD 16×2.

Vamos ao que interessa.

Montagem do sensor de temperatura DHT11 com LCD

Para construir este projeto presente na imagem abaixo:

Sensor de temperatura DHT11 e LCD com Arduino
Vista lateral do módulo do sensor de temperatura DHT11

Você irá precisar de:

  • 1x Arduino;
  • 1x Sensor de Temperatura DHT11;
  • 1x Display LCD;
  • 1x Potenciômetro entre 5k a 10kOhms;
  • 15 a 20 jumpers macho-macho;

A montagem de todos esses componentes fica da seguinte forma:

Sensor de Temperatura DHT11 e LCD com Arduino
Montagem dos componentes do projeto

Para este projeto foi utilizado o módulo DHT11 mas você pode utilizar o componente normal, não precisa ser especificamente um módulo para funcionar.

Também atente-se as conexões do display LCD 16×2 nos pinos digitais do Arduino:

LCD Arduino e DHT11
Pinagem do LCD com Arduino

Bora programar?

O código para execução do projeto é o descrito abaixo:

/*   Código do projeto sensor de temperatura DHT11 e LCD
    
     Monte seus próprios projetos sem dificuldade com programação! 
     ACESSE: https://flaviobabos.com.br/
*/

// Inclua as bibliotecas dos componentes
#include <LiquidCrystal.h>
#include "DHT.h"

// Defina o pino do seu componente
#define PINODHT 8

// Defina qual o modelo da família do seu DHT
#define MODELODHT DHT11

// Defina as portas utilizadas do LCD
// LiquidCrystal(RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

DHT dht(PINODHT, MODELODHT);

void setup() {
  Serial.begin(9600);
  
  // Inicialize o LCD
  lcd.begin(16, 2);

  // Inicialize o sensor
  dht.begin();
  
  Serial.println("Efetuando as leituras!");
  lcd.print("Aguarde...");

}

void loop() {
  
  // Aguarde alguns segundos entre as medidas
  delay(1000);

  // Lendo a umidade
  float umi  = dht.readHumidity();
  // Lendo a temperatura na escala Celsius
  float tempC = dht.readTemperature();
  // Lendo a temperatura na escala Fahrenheit
  float tempF = dht.readTemperature(true);

  // Verificando se as leituras falharam
  if (isnan(umi) || isnan(tempC) || isnan(tempF)) {
    Serial.println("Falha na leitura do seu sensor DHT!");
  } else {

    // Printando os resultados no Monitor Serial
    Serial.print("Temperatura: ");
    Serial.print(tempC);
    Serial.print("°C ~ ");
    Serial.print(tempF);
    Serial.print("°F");

    Serial.print("  |  "); 
    
    Serial.print("Umidade: ");
    Serial.print(umi);
    Serial.println("%");
    
    // Printando os resultados no LCD
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Temp: ");
    lcd.print(tempC);
    lcd.print(" C ");

    lcd.setCursor(0,1);
    lcd.print("Umidade: ");
    lcd.print(umi);
    lcd.print(" % ");

  }
}

Entendendo o código a fundo

Seta INCLUA AS BIBLIOTECAS DO PROGRAMA

#include <LiquidCrystal.h>
#include "DHT.h"

A primeira coisa antes de tudo é incluir as bibliotecas utilizadas no projeto.

Neste caso é necessário que importemos a biblioteca do LCD e do DHT.

Para o LCD, basta escrevermos o #include pois a biblioteca já vem instalada na IDE do Arduino.

Agora, para a família de sensores DHT você irá precisar instalar direto do Gerenciador de Bibliotecas.

Seta DEFINA ONDE OS COMPONENTES ESTÃO CONECTADOS

const int PINODHT 8

#define MODELODHT DHT11

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

DHT dht(PINODHT, MODELODHT);

O segundo passo é fazer com que o Arduino identifique em quais portas estão cada componente.

Por exempo, usamos const int para definir onde se encontra o nosso DHT11 e já que estamos falando de variável, você já deve saber que as variáveis const int são diferentes das variáveis int.

O que diferencia uma da outra é que a const int é usada apenas para leitura e a int é utilizada para gravar dados ao longo do código.

Por exemplo, os números dos pinos raramente devem ser alterados. 

Portanto, eles geralmente são declarados como const ou como #define.

Além disso, vale a pena notar que, se você usar “const” para a variável que for somente leitura, o compilador poderá fazer otimizações, o que inclui a não alocação de armazenamento de dados para a variável.

Não se esqueça também de escrever no programa qual o modelo de DHT que está utilizando e de definir a pinagem do LCD no programa na seguinte ordem:

LiquidCrystal(RS, E, D4, D5, D6, D7)

Seta FUNÇÃO NATIVA SETUP()

void setup() {
  Serial.begin(9600);

  lcd.begin(16, 2);

  dht.begin();
  
  Serial.println("Efetuando as leituras!");
  lcd.print("Aguarde...");

}

Dentro do setup() iremos fazer o seguinte:

  • Inicializar a comunicação serial com o monitor serial a uma taxa de 9600 bits por segundo;
  • Especificar o LCD que estamos a utilizar (16 colunas e 2 linhas);
  • Inicializar o sensor de temperatura Arduino – DHT11;
  • Informar coleta de leituras no monitor serial e no LCD.

Simples assim!

Seta LOOP: VARIÁVEIS TEMPERATURA E UMIDADE

  delay(1000);
 
  float umi  = dht.readHumidity();

  float tempC = dht.readTemperature();

  float tempF = dht.readTemperature(true);

Já na função void loop() iremos declarar 3 variáveis de ponto flutuante: uma para receber o valor da umidade (umi), outra para identificar a variação de temperatura em graus Celsius (tempC) e mais uma para a escala Fahrenheit (tempF).

Lembrando que esse tipo de variável float é um decimal e é usado para armazenar números não inteiros.

Um delay também é necessário no começo do loop para nos assegurar de coletar medidas assertivas do sistema de temperatura e umidade.

Seta CERTIFICANDO AS LEITURAS

 if (isnan(umi) || isnan(tempC) || isnan(tempF)) {
    Serial.println("Falha na leitura do seu sensor DHT!");

Essa é uma maneira simples e eficaz de averiguar se obtivemos sucesso na coleta dos dados de temperatura e umidade.

É como um debug: você consegue saber se o erro está nas conexões do seu DHT11, como má conexão de jumpers/fios, ou erro de hardware do próprio componente.

Seta PRINTANDO NO MONITOR SERIAL

    Serial.print("Temperatura: ");
    Serial.print(tempC);
    Serial.print("°C ~ ");
    Serial.print(tempF);
    Serial.print("°F");

    Serial.print("  |  "); 
    
    Serial.print("Umidade: ");
    Serial.print(umi);
    Serial.println("%");

A função Serial.print () envia informações do Arduino para o computador. Você pode ver essas informações no monitor serial da IDE.

O que estiver dentro das aspas da função, irá ser impresso na tela do monitor serial. Caso você fornecer uma variável como argumento, o imprimirá o valor dessa variável.

Como a variável de umidade é a última coisa que você imprimirá nesse loop, você pode usar um comando um pouco diferente: Serial.println ().

Se você não sabe, esse comando criará uma nova linha no monitor serial após o envio do valor. Isso ajuda a facilitar a leitura das coisas quando elas estão sendo impressas.

Valores de temperatura no monitor serial do Arduino
Valores de temperatura na escala Celsius e Fahrenheit e umidade relativa do ar impressos no monitor serial

Seta PRINTANDO NO DISPLAY LCD

    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Temp: ");
    lcd.print(tempC);
    lcd.print(" C ");

    lcd.setCursor(0,1);
    lcd.print("Umidade: ");
    lcd.print(umi);
    lcd.print(" % ");

Primeiramente dê um clear na tela do seu display LCD para limpar todo e qualquer caractere escrito anteriormente.

Após isso ter sido feito, deve-se posicionar o cursor na linha e coluna zero para que a temperatura na escala Celsius seja escrita a partir daí.

Para imprimir a umidade deve-se pular uma linha, indo para a linha debaixo e usar o lcd.print() para imprimir o texto “Umidade” e printar a variável umi logo em seguida.

Considerações finais do Projeto Bônus

Com o código carregado no Arduino, clique no ícone do monitor serial.

Monitor Serial Arduino Temperatura DHT11
Clique no Monitor Serial do Arduino

Veja as oscilações de leitura da temperatura e da umidade no monitor serial e compare com o visor do seu LCD.

Por exemplo, você pode pegar algo mais quente do que o ambiente em que estiver e posicionar na frente do seu sensor e ver a temperatura aumentar.

Algo simples como pressionar o sensor colocando os seus dedos em volta dele já é suficiente para ver o que acontece com os valores no monitor serial da IDE e na tela do seu display.

Senão, você pode fazer o oposto.

Pegue algo mais frio do que o normal e insira próximo ao sensor e você verá que a tempratura aumenta consideravelmente ao longo do tempo.

E aí, o que você achou deste tutorial?

Comenta aqui embaixo para eu saber!

Flávio Babos
Flávio é especialista em tecnologia, empreendedor e estudante de Engenharia Mecatrônica pela Universidade Federal de Uberlândia (UFU). Já desenvolveu diversos projetos de elétrica, eletrônica e atualmente dedica seu tempo em escolher os melhores produtos de tecnologia para ajudar sua audiência no processo de decisão de compra na internet.

Curso Online de Eletrônica: Os 3 Melhores Para 2024 (Grátis e Pagos)

Previous article

Curso Online de Comandos Elétricos: Os 3 Melhores Para 2022

Next article

Comments

Leave a reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *