Usando o Sensor DHT22 com o ESP32

Usando o sensor DHT22 no ESP32

Este documento explica como conectar e usar um sensor de temperatura e umidade DHT22 com um microcontrolador ESP32. Dois exemplos de código são fornecidos: um usando a biblioteca DHTesp.h e o outro usando a biblioteca DHT.h. Ambos os exemplos leem temperatura e umidade, mas o exemplo DHT.h também calcula e exibe o índice de calor e inclui tratamento de erros.

Introdução

Usar o Sensor DHT22 com um ESP32 envolve o controle de pinos GPIO (General Purpose Input/Output). Aqui está um detalhamento de como fazer isso!

Requisitos

  • Hardware
    • ESP32 - ESP32 é uma série de microcontroladores de baixo custo e baixo consumo de energia. É também um sistema em um chip com microcontrolador, Wi-Fi e Bluetooth integrados.
    • Sensor DHT22 - Sensor para coletar dados de Temperatura e Umidade.
    • Resistores - Usados para limitar a corrente através do pino de dados do Sensor DHT22.
  • Software

Conexões de Hardware

Exemplo de Código 1 - Usando a DHT sensor library for ESPx

/**
   ESP32 + DHT22 Example for Wokwi
   https://wokwi.com/arduino/projects/322410731508073042
*/
 
#include "DHTesp.h"
 
const int DHT_PIN = 15;
 
DHTesp dhtSensor;
 
void setup() {
  Serial.begin(115200);
  dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
}
 
void loop() {
  TempAndHumidity  data = dhtSensor.getTempAndHumidity();
  Serial.println("Temp: " + String(data.temperature, 2) + "°C");
  Serial.println("Humidity: " + String(data.humidity, 1) + "%");
  Serial.println("---");
  delay(2000); // Wait for a new reading from the sensor (DHT22 has ~0.5Hz sample rate)
}

Explicação:

  • const int DHT_PIN = 15;: Isso indica que o pino de dados do Sensor DHT22 está conectado ao pino digital 15 no ESP32.
  • DHTesp dhtSensor;: Esta linha cria um objeto chamado dhtSensor da classe DHTesp. Este objeto será usado para interagir com o Sensor DHT22.
  • dhtSensor.setup(DHT_PIN, DHTesp::DHT22);: Esta linha inicializa o objeto dhtSensor com o pino e o tipo de sensor especificados (DHT22).
  • TempAndHumidity data = dhtSensor.getTempAndHumidity();: Esta linha lê os dados de temperatura e umidade do sensor DHT22 usando o método getTempAndHumidity() do objeto dhtSensor. Os dados retornados são armazenados em uma estrutura TempAndHumidity chamada data.
  • Serial.println("Temp: " + String(data.temperature, 2) + "°C");: Esta linha imprime o valor da temperatura no monitor serial. String(data.temperature, 2) converte o valor da temperatura para uma string com duas casas decimais.
  • Serial.println("Humidity: " + String(data.humidity, 1) + "%");: Esta linha imprime o valor da umidade no monitor serial. String(data.humidity, 1) converte o valor da umidade para uma string com uma casa decimal.

Em resumo, este código inicializa o sensor DHT22, lê os dados de temperatura e umidade a cada 2 segundos e imprime as leituras no monitor serial.

Exemplo 2 - Usando a DHT sensor library

#include "DHT.h"
#define DHTPIN 15     // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
 
DHT dht(DHTPIN, DHTTYPE);
 
void setup() {
  Serial.begin(9600);
  Serial.println(F("DHTxx test!"));
 
  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)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  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(F("Failed to read from DHT sensor!"));
    return;
  }
 
  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);
 
  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));
}

Explicação:

  1. #include "DHT.h": Inclui a biblioteca do sensor DHT, fornecendo funções para interagir com o sensor.
  2. #define DHTPIN 15: Define o pino digital conectado ao pino de dados do sensor DHT como 15.
  3. #define DHTTYPE DHT22: Especifica o tipo de sensor como DHT22.
  4. DHT dht(DHTPIN, DHTTYPE);: Cria um objeto DHT chamado dht usando o pino e o tipo de sensor especificados.
  • Serial.println(F("DHTxx test!"));: Imprime uma mensagem de inicialização no monitor serial. A macro F() armazena a string na memória flash, economizando RAM.
  • dht.begin();: Inicializa o sensor DHT.
  • float h = dht.readHumidity();: Lê a umidade e a armazena na variável h.
  • float t = dht.readTemperature();: Lê a temperatura em Celsius e a armazena na variável t.
  • float f = dht.readTemperature(true);: Lê a temperatura em Fahrenheit e a armazena na variável f.
  • if (isnan(h) || isnan(t) || isnan(f)) { … }: Verifica se alguma das leituras é “Não é um Número” (NaN), indicando um erro. Se sim, imprime uma mensagem de erro e retorna, reiniciando o loop.
  • float hif = dht.computeHeatIndex(f, h);: Calcula o índice de calor em Fahrenheit usando a temperatura em Fahrenheit e a umidade.
  • float hic = dht.computeHeatIndex(t, h, false);: Calcula o índice de calor em Celsius usando a temperatura em Celsius e a umidade. O parâmetro false especifica Celsius.

Principais diferenças em relação ao código anterior:

  • Biblioteca Diferente: Este código usa a biblioteca DHT.h, enquanto o anterior usava DHTesp.h. Elas têm funções e uso ligeiramente diferentes.
  • Cálculo do Índice de Calor: Este código calcula e exibe o índice de calor, uma medida de quão quente se sente quando a umidade relativa é levada em consideração com a temperatura do ar.
  • Tratamento de Erros: Este código inclui uma verificação para leituras inválidas (isnan), fornecendo um tratamento de erros mais robusto.
  • Conversão para Fahrenheit: Este código lê e exibe explicitamente a temperatura em Celsius e Fahrenheit.