Temperatura e umidade com ESP32 e DHT22 (com display LCD)
Este projeto mede a temperatura e a umidade do ambiente com um sensor DHT22 e exibe os dados em tempo real em um LCD I2C 16x2. Os dados são lidos do sensor pelo protocolo de um fio (one-wire) com a biblioteca Adafruit DHT. Este projeto serve de base para estações meteorológicas IoT, automação residencial ou sistemas de monitoramento ambiental em estufas. A comunicação com o DHT22 é feita pelo pino GPIO 4 do ESP32.

Vídeo
Esquema do circuito

Código-fonte
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Temperatura e umidade com ESP32 e DHT22 (com display LCD)
4// ─────────────────────────────────────────
5// Lê temperatura e umidade do DHT22 a cada 2 s e mostra em um LCD I2C
6// 16x2. Se uma leitura falhar, a tela mostra um aviso sobre a fiação e o
7// pull-up.
8//
9// Pinos:
10// GPIO 4 -> DHT22 DATA
11// Pull-up de 10k entre DATA e VCC
12// GPIO 21 -> LCD SDA, GPIO 22 -> LCD SCL
13// DHT22 VCC -> 3V3, LCD VCC -> 5V (VIN)
14// Todos os GNDs em comum
15
16#include <Wire.h>
17#include <LiquidCrystal_I2C.h>
18#include <DHT.h>
19
20// Definição dos pinos
21const int DHT_PIN = 4;
22#define DHT_TYPE DHT22
23
24DHT dht(DHT_PIN, DHT_TYPE);
25
26// Endereço do LCD 0x27 ou 0x3F
27LiquidCrystal_I2C lcd(0x27, 16, 2);
28
29// O DHT22 precisa de pelo menos 2 s entre leituras
30const unsigned long READ_INTERVAL = 2000;
31unsigned long lastRead = 0;
32
33void setup() {
34 // Pinos I2C padrão da DevKit V1
35 Wire.begin(21, 22);
36 lcd.init();
37 lcd.backlight();
38
39 // Tela de abertura por 3 s
40 lcd.setCursor(3, 0);
41 lcd.print("BlueGrays");
42 lcd.setCursor(3, 1);
43 lcd.print("DHT22 v1.0");
44 delay(3000);
45 lcd.clear();
46
47 dht.begin();
48}
49
50void loop() {
51 // Lê a cada 2 s sem delay()
52 if (millis() - lastRead >= READ_INTERVAL) {
53 lastRead = millis();
54
55 float h = dht.readHumidity();
56 float t = dht.readTemperature();
57
58 lcd.clear();
59
60 // NaN = problema de fiação/pull-up
61 if (isnan(h) || isnan(t)) {
62 lcd.setCursor(0, 0);
63 lcd.print("Sensor okunamadi");
64 lcd.setCursor(0, 1);
65 lcd.print("Kablo+10k pullup");
66 } else {
67 // Temperatura
68 lcd.setCursor(0, 0);
69 lcd.print("Sicaklik:");
70 lcd.print(t, 1);
71 lcd.print("C");
72 // Umidade, o DHT22 dá casas decimais
73 lcd.setCursor(0, 1);
74 lcd.print("Nem :");
75 lcd.print(h, 1);
76 lcd.print("%");
77 }
78 }
79}
80
Perguntas frequentes
Qual é a diferença entre o DHT22 e o DHT11?
O DHT22 é mais preciso (±0,5 °C e ±2–5% de umidade), mede em uma faixa mais ampla (−40 a 80 °C) e oferece resolução de 0,1. O DHT11 é mais barato, mas se limita a ±2 °C e resolução de números inteiros.
É necessário usar um resistor de pull-up de 10 kΩ?
O sensor DHT22 avulso precisa de um resistor de pull-up de 10 kΩ na linha de dados. Nos módulos de 3 pinos montados em placa, o resistor geralmente já está incluído.
LCD a 5 V e ESP32 a 3,3 V funcionam juntos?
Os módulos LCD I2C exibem uma imagem mais nítida a 5 V. Se os resistores de pull-up das linhas SDA/SCL de um módulo alimentado com 5 V estiverem ligados a 5 V, usar um conversor de nível é a opção mais segura. Embora muitas pessoas façam a ligação direta, isso força os limites do ESP32.
Posso enviar os dados pela internet?
Sim, você pode usar o Wi-Fi do ESP32 para enviar as medições ao ThingSpeak, ao Blynk ou ao seu próprio servidor e acompanhar os gráficos pelo celular.
