LASER Liga Acadêmica de Sistemas Embarcados
Centro de Informática · UFPE
Formação em ESP32 · Módulo 2

Estação detemperatura e umidade

DHT22 + LCD 16x2 + ESP32-S3, simulados no Wokwi.

Lucas Rayan Guerra Ciência Embarcada · ESPDocs
linkedin.com/in/lucasrguerra
Hoje

Medir, processar, mostrar

DHT22mede
1 fio
ESP32-S3processa
I2C
Temp: 26.5°C
Umid: 62.0 %
LCD 16x2mostra
Ao fim das duas horas

Isto, rodando no seu navegador

O circuito completo rodando no Wokwi, com o LCD mostrando Temp: 26.5°C e Umid: 62.0 %.
1
Parte um

O sensor DHT22

Dois sensores numa caixinha, um fio de dados.

1 · Sensor

Por que o DHT22, e não o DHT11 do módulo 1

Precisão±2 °C±0,5 °C
Faixa0 a 50 °C−40 a 80 °C
Resolução1 °C0,1 °C
Leituras1 por segundo1 a cada 2 s
DHT11DHT22
1 · Sensor

Quatro pinos, um sem uso

DHT22 VCC DATA NC GND 10 kΩ pull-up para o 3V3 GND GPIO12 3V3 no ESP32-S3
1 · Sensor

Uma medição = 40 bits num fio só

pede confirma 0 1 26 µs 70 µs

16 bits de umidade · 16 de temperatura · 8 de verificação

1 · Sensor

Ninguém empurra a linha para cima.
Quem puxa é o resistor.

Sem o pull-up de 10 kΩ, a linha sobe devagar demais, os tempos saem errados e a leitura vira "Falha no sensor".

2
Parte dois

O display e o I2C

32 caracteres, 4 fios, 1 endereço.

2 · LCD

16 colunas × 2 linhas × (5 × 8 pontos)

Temp: 26.5°C
Umid: 62.0 %

Cada caractere é uma grade de 5 × 8. E você pode desenhar até 8 caracteres seus.

2 · LCD

A plaquinha atrás do display

16fios sem a plaquinha
4fios com o PCF8574
VCC · GND · SDA · SCL

O trimpot azul da plaquinha ajusta o contraste. Tela vazia? Gire ele primeiro.

2 · I2C

Dois fios, vários dispositivos

ESP32 controlador SDA · dados SCL · relógio LCD 0x27 pressão 0x76 memória 0x50 "0x27, é com você." só responde quem tem o endereço chamado
2 · I2C

O I2C também precisa de pull-up

DHT2210 kΩ
SDA4,7 kΩ
SCL4,7 kΩ

Os três resistores vão para o 3V3. Nunca para o 5V: os pinos do ESP32-S3 não toleram 5 V.

3
Parte três

O simulador Wokwi

Um laboratório de eletrônica no navegador. Sem instalar nada, sem conta.

3 · Wokwi

Um projeto = três arquivos

{ }
sketch.inoo programa
◫
diagram.jsonpeças e fios
≡
libraries.txtbibliotecas

Os três estão em formacoes/2/wokwi/, prontos para colar.

3 · Wokwi

Quatro passos

1Abrawokwi.com/projects/new/esp32-s3
2Colesketch.ino + diagram.json
3AdicioneDHT sensor library
LiquidCrystal I2C
▶Simulebotão verde
4
Parte quatro

Montagem

Tudo na coluna esquerda da placa.

4 · Montagem

O circuito

  • 3V3 DHT22 e os 3 resistores
  • GPIO12 dados do DHT22
  • GPIO8 SDA do LCD
  • GPIO9 SCL do LCD
  • 5V VCC do LCD
  • GND sensor e LCD
Circuito completo no Wokwi.
5
Parte cinco

O programa

Configurar, iniciar, repetir.

5 · Código · 1 de 3

Configuração

#include <Wire.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>

#define PINO_DHT  12        // fio amarelo
#define TIPO_DHT  DHT22
#define PINO_SDA  8         // I2C padrão do ESP32-S3
#define PINO_SCL  9

DHT dht(PINO_DHT, TIPO_DHT);
LiquidCrystal_I2C lcd(0x27, 16, 2);   // endereço, colunas, linhas
Mudou um fio?

Mude uma linha. Tudo que depende da montagem está no topo.

0x27

O endereço I2C do display.

5 · Código · 1 de 3

Desenhando o símbolo de grau

0b01100
0b10010
0b10010
0b01100
0
0
0
0
byte grau[8] = { ... };
lcd.createChar(0, grau);
lcd.write(0);

Bit 1 = ponto aceso.

5 · Código · 2 de 3

setup(): uma vez, ao ligar

void setup() {
  Serial.begin(115200);
  Wire.begin(PINO_SDA, PINO_SCL);
  dht.begin();

  lcd.init();
  lcd.backlight();
  lcd.createChar(0, grau);
  lcd.setCursor(0, 0);
  lcd.print("LASER  ESP32-S3");
  lcd.setCursor(0, 1);
  lcd.print("Iniciando...");
  delay(2000);            // o DHT22 precisa de ~2 s para a primeira leitura
  lcd.clear();
}
LASER ESP32-S3
Iniciando...

A mensagem cobre os 2 s que o DHT22 leva para a primeira leitura.

5 · Código · 3 de 3

loop(): ler, e desconfiar da leitura

void loop() {
  float umidade     = dht.readHumidity();
  float temperatura = dht.readTemperature();

  if (isnan(umidade) || isnan(temperatura)) {
    lcd.setCursor(0, 0);
    lcd.print("Falha no sensor ");
    Serial.println("Falha na leitura do DHT22");
  } else {
Falha no sensor

isnan(): a leitura falhou. Mostre o erro, não um número inventado.

5 · Código · 3 de 3

loop(): mostrar, e esperar 2 segundos

lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperatura, 1);
lcd.write(0);           // o caractere de grau criado acima
lcd.print("C   ");

lcd.setCursor(0, 1);
lcd.print("Umid: ");
lcd.print(umidade, 1);
lcd.print(" %   ");

// ... envia o mesmo texto pelo Serial ...

delay(2000);   // 1 leitura a cada 2 s
Temp: 26.5°C
Umid: 62.0 %

Os espaços em "C   " apagam as sobras da leitura anterior.

5 · Código

Três testes, três telas

LCD: Temp 26.5°C, Umid 62.0 %
Sala 26,5 °C · 62 %
LCD: Temp -5.2°C, Umid 88.4 %
Frio −5,2 °C · 88,4 %
LCD: Falha no sensor
Fio solto erro detectado

Na simulação, clique no DHT22 e mova os controles de temperatura e umidade.

6
Parte seis

Da tela para a bancada

O que o Wokwi perdoa e o hardware não.

6 · Bancada

A plaquinha I2C traz pull-ups para 5 V

≈ 4 V

no GPIO, com a plaquinha em 5 V,
mesmo com os 4,7 kΩ para 3V3

✗ fora da especificação
3,3 V

Conversor de nível BSS138
ou remover os pull-ups da plaquinha

✓ seguro

Teste: multímetro entre SDA e VCC da plaquinha. Entre 2 e 10 kΩ, há um pull-up.

6 · Bancada

Tela vazia? Descubra o endereço

for (byte endereco = 1; endereco < 127; endereco++) {
  Wire.beginTransmission(endereco);
  if (Wire.endTransmission() == 0) {
    Serial.printf("Dispositivo em 0x%02X\n", endereco);
    encontrados++;
  }
}
Procurando dispositivos I2C...
Dispositivo em 0x27

Saída real no Wokwi.
Na sua placa pode aparecer 0x3F.

6 · Bancada

Quando não funciona

Falha no sensor
"Falha no sensor"

Pull-up de 10 kΩ, fio no GPIO12, VCC e GND.

Aceso e vazio

Contraste, endereço, ou SDA e SCL trocados.

████████████████
Linha de blocos

A energia chegou, o I2C não.

Tudo apagado

Falta o 5V ou o lcd.backlight().

Fechamento

Desafios

↕
Mín e máx

Guarde a menor e a maior temperatura desde que a placa ligou.

!
Alerta

Acenda o LED RGB do GPIO38 acima de 30 °C.

≈
Sensação

Mostre o índice de calor com computeHeatIndex().

⏱
Sem delay

Reescreva o loop() usando millis().

LASER Liga Acadêmica de Sistemas Embarcados
Centro de Informática · UFPE
Módulo 2 · Encerramento

Obrigado.Perguntas?

Apostila, código e arquivos do Wokwi em espdocs.cienciaembarcada.com.br/formacoes/2.

Lucas Rayan Guerra contato@lucasrguerra.dev.br
linkedin.com/in/lucasrguerra
espdocs.cienciaembarcada.com.br
← → navegar O panorama F tela cheia B tela preta