Componentes¶
O hardware da incubadora é formado por dois sensores (temperatura/pressão e umidade),
três atuadores/sinalizadores (relé do aquecedor, LED RGB e buzzer), um display e a
conexão Wi-Fi. Cada dispositivo é controlado por um componente próprio do ESP-IDF —
uma pasta em incubadora/components/ com o driver daquele periférico.
Esses drivers não contêm nenhuma regra da incubadora: eles apenas sabem conversar com o
dispositivo (inicializar, ler, escrever). Toda a lógica (quando ligar o aquecedor, quando
apitar) fica nas tarefas, na pasta main/. Essa separação deixa cada driver reutilizável
em outros projetos e mantém o código organizado.
Visão geral¶
| Componente | Tipo | Ligação na ESP | O que faz | Pacote (driver) |
|---|---|---|---|---|
| BMP280 | Sensor | I²C — SDA 21 / SCL 22 (0x76) | Mede temperatura e pressão | bme280 |
| DHT11 | Sensor | GPIO32 (1 fio) | Mede umidade relativa | dht11 |
| OLED SSD1306 | Display | I²C — SDA 21 / SCL 22 (0x3C) | Mostra a leitura e o estado | ssd1306_display |
| LED RGB | Sinalização | PWM — R 25 / G 26 / B 27 | Cor conforme a temperatura | rgb_led |
| Buzzer | Sinalização | GPIO33 (ativo-alto) | Alarme sonoro fora da faixa | buzzer |
| Relé (aquecedor) | Atuador | GPIO19 (ativo-baixo) | Liga/desliga o aquecedor | rele |
| Wi-Fi + HTTP | Comunicação | SoftAP em 192.168.4.1 |
Página web e API JSON | (ESP-IDF) |
Barramento I²C compartilhado
O BMP280 e o OLED SSD1306 dividem o mesmo barramento I²C (pinos 21 e 22), diferenciados pelo endereço (0x76 e 0x3C). Assim, dois periféricos usam apenas dois pinos da ESP, em vez de quatro.
Onde é definido na ESP¶
Todos os pinos, endereços e faixas ficam centralizados em um único arquivo,
incubadora/main/app_config.h.
Para trocar um pino ou um limite, edita-se só esse arquivo — nenhum valo fica "espalhado"
pelo código:
// I²C (BMP280 + OLED, barramento compartilhado)
#define I2C_SDA_GPIO 21
#define I2C_SCL_GPIO 22
#define I2C_FREQ_HZ 50000 // 50 kHz: estável em protoboard
#define BME280_ADDR 0x76
#define SSD1306_ADDR 0x3C
// LED RGB (PWM via LEDC) — ânodo comum
#define LED_R_GPIO 25
#define LED_G_GPIO 26
#define LED_B_GPIO 27
// DHT11 (umidade)
#define DHT11_GPIO 32
// Buzzer (alarme sonoro) — aciona em nível ALTO
#define BUZZER_GPIO 33
// Relé (aquecedor) — módulo com opto, aciona em nível BAIXO
#define RELE_GPIO 19
Sensores¶
BMP280 — temperatura e pressão¶
É o sensor que fornece a temperatura, ou seja, a variável que o sistema controla. Ele se
comunica pelo barramento I²C e também mede a pressão atmosférica. O driver bme280
detecta o chip automaticamente, então funciona igual com um BMP280 ou um BME280.
Detalhe técnico — BMP280
- Endereço I²C 0x76 (pino SDO no GND; seria 0x77 com SDO no VCC).
- Barramento a 50 kHz — uma frequência conservadora, estável em protoboard e com fios longos.
- O driver identifica o chip pelo registrador de ID (0x58 = BMP280, 0x60 = BME280) e lê a calibração de fábrica gravada no sensor para converter os valores brutos em °C e hPa.
- A leitura é feita em modo forçado (forced mode): a cada ciclo dispara-se uma medição e lê-se o resultado, o que economiza energia.
DHT11 — umidade¶
Sensor simples e barato que mede a umidade relativa do ar (em %). Ele usa um único fio de dados (GPIO32) e é lido a cada 2 segundos. Por ser um protocolo sensível a tempo, a leitura é feita com cuidado para não sofrer interferência das outras tarefas.
Detalhe técnico — DHT11
O DHT11 usa um protocolo de 1 fio (single-wire), com o timing em microssegundos: a ESP segura a linha em nível baixo por ≥ 18 ms (sinal de start), o sensor responde e envia 40 bits (umidade, temperatura e um checksum), codificados pela largura dos pulsos.
Como esse timing é frágil, o driver lê os 40 bits dentro de uma seção crítica (com
interrupções desligadas por ~5 ms) e valida o checksum; se falhar, a tarefa
task_dht11 tenta de novo (até 3×) antes de marcar a umidade como
inválida. Só é possível ler o DHT11 cerca de uma vez por segundo.
Display¶
OLED SSD1306¶
Display gráfico de 0,96" (128 × 64 pixels) que mostra, na própria incubadora, a temperatura, a umidade e o estado atual. Compartilha o barramento I²C com o BMP280 (endereço 0x3C), então não gasta pinos adicionais.
Atuadores e sinalização¶
LED RGB — cor do estado¶
Um LED RGB indica visualmente a situação: verde dentro da faixa segura, vermelho fora dela e azul durante a inicialização ou falha de sensor. O brilho de cada cor é controlado por PWM.
Detalhe técnico — LED RGB
O controle usa o periférico LEDC do ESP32 (PWM por hardware), com 3 canais
(R/G/B), resolução de 8 bits (duty de 0 a 255) e frequência de 5 kHz. Como o
módulo é de ânodo comum (acende no nível baixo), o driver inverte o duty
internamente, de modo que quem chama o rgb_led_set(r, g, b) pensa sempre em "0 =
apagado, 255 = máximo".
Buzzer — alarme sonoro¶
Um buzzer ativo que apita quando a temperatura sai da faixa segura. Por ser ativo, basta energizar o pino (GPIO33) para ele gerar o som — não precisa de PWM.
Detalhe técnico — buzzer
O buzzer é tratado como uma saída digital: nível alto (1) apita, nível baixo (0)
silencia (BUZZER_ATIVO_ALTO). O padrão de apito é intermitente (250 ms ligado / 250 ms
desligado), controlado pela tarefa task_buzzer.
Relé — aquecedor¶
O relé é a chave que liga e desliga o aquecedor. É controlado pelo GPIO19 e é o único atuador de potência do sistema — é ele que efetivamente aquece a câmara.
Detalhe técnico — relé
O módulo tem optoacoplador e aciona em nível baixo (RELE_ATIVO_BAIXO): nível 0
fecha o relé (liga o aquecedor), nível 1 solta. Por segurança, o firmware inicializa o
relé desligado (rele_init coloca o pino em nível alto), garantindo que o aquecedor
não feche durante o boot, antes de a tarefa de controle assumir.
Ponto de atenção no relé
O sinal do relé está no GPIO19. Se o LED do módulo não acender quando o firmware manda
ligar, quase sempre é pino ou polaridade — ambos ajustáveis em uma linha do
app_config.h (RELE_GPIO e RELE_ATIVO_BAIXO).
Comunicação¶
Wi-Fi + servidor HTTP¶
A ESP32 cria a sua própria rede Wi-Fi (modo SoftAP), sem precisar de roteador. Ao conectar o celular nessa rede e abrir o navegador, o servidor HTTP embutido entrega uma página com as leituras em tempo real. Os detalhes das rotas estão na página de Funções.