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

Estação detemperatura e umidade

Um DHT22, um display LCD 16x2 e um ESP32-S3, simulados no Wokwi com o framework Arduino. Dois protocolos de comunicação, um programa curto e os cuidados elétricos que fazem o circuito funcionar também fora da tela.

  • Duração: 2 horas
  • Formato: presencial
  • Simulador: Wokwi
  • Framework: Arduino
Capa da apostila do módulo 2 Capa dos slides do módulo 2

Comece por aqui

Três formas de usar este material

Para apresentar, para estudar e para pôr a mão no circuito. Os PDFs são a versão final, para quem só quer o material pronto.

Slides

31 slides para projetar direto do navegador, com navegação por teclado e panorama.

PDF · 31 págs · 1,6 MB

Apostila

O conteúdo completo, com explicações, tabelas e o código comentado, paginado em A4.

PDF · 20 págs · 761 KB

Projeto no Wokwi

O circuito e o código desta formação, testados no simulador: leitura normal, temperatura negativa e sensor desconectado.

4 arquivos · simule sem instalar nada

Todos os arquivos

O que tem nesta formação

Tudo o que foi usado na aula, com o que é cada arquivo e para que serve.

Material de aula

  • slide.html
    Os slides da formação. Abrem no navegador, em tela cheia, prontos para projetar.
    72 KB
  • apostila.html
    A apostila completa, paginada em A4 no próprio navegador, com o passo a passo e o código comentado.
    43 KB

Para baixar e imprimir

  • LASER-ESP32-Modulo-2-Slides.pdf
    Os slides em PDF 16:9, um slide por página.
    31 págs · 1,6 MB
  • LASER-ESP32-Modulo-2-Apostila.pdf
    A apostila em PDF A4, pronta para imprimir.
    20 págs · 761 KB

Projeto do Wokwi

  • modulo-2-wokwi.zip
    Os quatro arquivos abaixo num só pacote.
    2 KB
  • sketch.ino
    O programa da estação: lê o DHT22 e escreve no LCD a cada 2 segundos.
    Ver código
    // Formação em ESP32 · LASER · Módulo 2
    // Estação de temperatura e umidade: DHT22 + LCD 16x2 I2C + ESP32-S3
    
    #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
    
    // Símbolo de grau: 8 linhas de 5 pixels
    byte grau[8] = { 0b01100, 0b10010, 0b10010, 0b01100, 0, 0, 0, 0 };
    
    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();
    }
    
    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 {
        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(" %   ");
    
        Serial.printf("Temperatura: %.1f C | Umidade: %.1f %%\n", temperatura, umidade);
      }
    
      delay(2000);              // o DHT22 aceita no máximo uma leitura a cada 2 s
    }
    2 KB
  • diagram.json
    O circuito: peças, posições, fios e os três resistores de pull-up.
    Ver código
    {
      "version": 1,
      "author": "Lucas Rayan Guerra",
      "editor": "wokwi",
      "parts": [
        {
          "type": "board-esp32-s3-devkitc-1",
          "id": "esp",
          "top": 0,
          "left": 0,
          "attrs": {}
        },
        {
          "type": "wokwi-dht22",
          "id": "dht",
          "top": 15,
          "left": -250,
          "attrs": {
            "temperature": "26.5",
            "humidity": "62"
          }
        },
        {
          "type": "wokwi-lcd1602",
          "id": "lcd",
          "top": 320,
          "left": -60,
          "attrs": {
            "pins": "i2c"
          }
        },
        {
          "type": "wokwi-resistor",
          "id": "r_dht",
          "top": 9,
          "left": -173,
          "rotate": 90,
          "attrs": {
            "value": "10000"
          }
        },
        {
          "type": "wokwi-resistor",
          "id": "r_sda",
          "top": 9,
          "left": -83,
          "rotate": 90,
          "attrs": {
            "value": "4700"
          }
        },
        {
          "type": "wokwi-resistor",
          "id": "r_scl",
          "top": 9,
          "left": -63,
          "rotate": 90,
          "attrs": {
            "value": "4700"
          }
        }
      ],
      "connections": [
        [
          "esp:TX",
          "$serialMonitor:RX",
          "",
          []
        ],
        [
          "esp:RX",
          "$serialMonitor:TX",
          "",
          []
        ],
        [
          "lcd:VCC",
          "esp:5V",
          "red",
          [
            "h-20",
            "v-100"
          ]
        ],
        [
          "lcd:GND",
          "esp:GND.1",
          "black",
          [
            "h-30",
            "v-90"
          ]
        ],
        [
          "lcd:SDA",
          "esp:8",
          "blue",
          [
            "h-40",
            "v-200"
          ]
        ],
        [
          "lcd:SCL",
          "esp:9",
          "purple",
          [
            "h-50",
            "v-170"
          ]
        ],
        [
          "dht:VCC",
          "r_dht:1",
          "red",
          [
            "v12",
            "h-25",
            "v-159",
            "h100"
          ]
        ],
        [
          "dht:SDA",
          "esp:12",
          "gold",
          [
            "v77"
          ]
        ],
        [
          "dht:GND",
          "esp:GND.1",
          "black",
          [
            "v118"
          ]
        ],
        [
          "r_dht:1",
          "esp:3V3.1",
          "red",
          []
        ],
        [
          "r_dht:2",
          "esp:12",
          "gold",
          [
            "v181"
          ]
        ],
        [
          "r_sda:1",
          "esp:3V3.1",
          "red",
          []
        ],
        [
          "r_sda:2",
          "esp:8",
          "blue",
          [
            "v124"
          ]
        ],
        [
          "r_scl:1",
          "esp:3V3.1",
          "red",
          []
        ],
        [
          "r_scl:2",
          "esp:9",
          "purple",
          [
            "v152"
          ]
        ]
      ],
      "dependencies": {}
    }
    2 KB
  • libraries.txt
    As bibliotecas que o Wokwi instala antes de compilar.
    Ver código
    DHT sensor library
    Adafruit Unified Sensor
    LiquidCrystal I2C
    61 B
  • scanner-i2c.ino
    Diagnóstico: lista o endereço de cada dispositivo no barramento I2C.
    Ver código
    // Scanner I2C: lista o endereço de cada dispositivo no barramento.
    // Use antes do programa principal se o LCD não mostrar nada.
    
    #include <Wire.h>
    
    void setup() {
      Serial.begin(115200);
      Wire.begin(8, 9);                 // SDA, SCL
      delay(500);
    
      Serial.println("Procurando dispositivos I2C...");
      int encontrados = 0;
      for (byte endereco = 1; endereco < 127; endereco++) {
        Wire.beginTransmission(endereco);
        if (Wire.endTransmission() == 0) {
          Serial.printf("Dispositivo em 0x%02X\n", endereco);
          encontrados++;
        }
      }
      if (encontrados == 0) Serial.println("Nenhum dispositivo. Confira SDA, SCL e alimentacao.");
    }
    
    void loop() {}
    664 B

Imagens da simulação

  • circuito-wokwi.png
    O circuito completo rodando no Wokwi.
    44 KB
  • lcd-funcionando.png
    Teste 1: leitura normal, 26,5 °C e 62 %.
    8 KB
  • lcd-frio.png
    Teste 2: temperatura negativa, −5,2 °C e 88,4 %.
    8 KB
  • lcd-falha.png
    Teste 3: fio de dados desconectado, erro detectado.
    7 KB

Como usar

Passo a passo

Apresentando os slides

Abra slide.html no navegador. O palco é 16:9 e se ajusta a qualquer tela ou projetor.

→←
avançar e voltar (ou clique nas metades da tela)
F
tela cheia
O
panorama com todos os slides
B
tela preta, para pausar a projeção

Lendo e imprimindo a apostila

A versão online se pagina em A4 sozinha ao abrir, o que leva alguns segundos.

Para papel, prefira o PDF pronto: ele já sai com margens, cores e quebras de página certas, sem configurar a impressora.

Rodando no Wokwi

  1. Abra wokwi.com/projects/new/esp32-s3. Não precisa de conta.
  2. Cole o sketch.ino e o diagram.json nas abas de mesmo nome.
  3. Em Library Manager, adicione DHT sensor library e LiquidCrystal I2C.
  4. Clique no botão verde. Com a simulação rodando, clique no DHT22 para mudar temperatura e umidade.

Montando na bancada

  1. Pull-up de 10 kΩ no DATA do DHT22 e de 4,7 kΩ no SDA e no SCL, todos para o 3V3.
  2. A plaquinha I2C do LCD costuma trazer pull-ups para 5 V: use um conversor de nível BSS138 ou retire esses resistores.
  3. Tela vazia? Gire o trimpot de contraste e rode o scanner-i2c.ino para conferir o endereço.
  4. Os detalhes estão no capítulo 7 da apostila.