---
title: "Sistema de Monitoramento Inteligente de Cozinha com ESP32"
subtitle: "Integração MQTT com Ubidots para IoT Industrial"
author: "Amaro Lopes"
institute: "Faculdade de Tecnologia FIAP"
date: today
format:
pdf:
documentclass: book
classoption:
- oneside
toc: true
toc-depth: 4
number-sections: true
geometry:
- margin=1in
fontfamily: libertinus
include-before-body:
text: |
\frontmatter
include-after-body:
text: |
\mainmatter
lang: pt
execute:
echo: false
---
# Introdução
Este projeto implementa um **sistema inteligente de monitoramento para cozinha industrial** utilizando um microcontrolador ESP32 conectado a múltiplos sensores. O sistema detecta condições anormais de operação e ativa atuadores para garantir segurança, integrando-se com a plataforma Ubidots para monitoramento remoto via dashboard interativo, com fallback para um dashboard nodered.
A integração é realizada através de um broker MQTT em **77.37.69.84** que faz forward automático dos dados para a plataforma Ubidots, permitindo visualização em tempo real e histórico de dados com widgets interativos. Alternativamente, um dashboard NodeRed está disponível em **77.37.69.84:1880/dashboard/page1** para monitoramento.
## Contexto
Cozinhas industriais enfrentam desafios de segurança relacionados a:
- Variações bruscas de temperatura
- Acúmulo de vapores e gases
- Condições de umidade inadequadas
- Risco de incêndios por múltiplas causas
Este sistema fornece monitoramento 24/7 com resposta automática a situações críticas.
# Objetivo do Projeto
## Objetivos Gerais
1. Monitorar três parâmetros críticos em ambiente de cozinha industrial
2. Detectar anomalias e ativar sistemas de proteção automaticamente
3. Integrar dados com plataforma IoT profissional (Ubidots)
4. Permitir configuração remota de limiares via MQTT
5. Garantir transmissão confiável de dados em tempo real
## Parâmetros Monitorados
- **Temperatura ambiente** (°C) - Faixa: -40 a +80°C
- **Umidade relativa do ar** (%) - Faixa: 0 a 100%
- **Concentração de gás** (ppm) - Qualidade do ar, detecção de vazamentos
- **Status de alarme** (estado) - Código do sistema (0-4)
## Atuadores Controlados
- **Alarme sonoro** - Ativação de sirene para emergências
- **Coifa/Exaustor** - Remoção de gases e vapores
- **Ar-condicionado** - Controle de temperatura ambiente
# Diagrama de Arquitetura
```{mermaid}
%%| fig-width: 7
graph TB
subgraph "Camada de Sensores"
DHT22["DHT22
Temperatura &
Umidade
GPIO 32"]
MQ2["MQ2
Qualidade do Ar
(Gás)
GPIO 33 ADC"]
RTC["RTC DS1307
Timer para verificação de incêndio
I2C"]
end
subgraph "Camada de Processamento"
ESP32["ESP32 DevKit V4
Dual-core 240MHz
WiFi + BLE"]
LOGIC["Lógica de
Detecção de
Alarmes"]
end
subgraph "Camada de Atuadores"
ALARM["Alarme Sonoro
Sirene/>GPIO 4"]
COIFA["Coifa/Exaustor
Motor 220V
GPIO 17"]
AC["A/C
Unidade comercial
GPIO 16"]
end
subgraph "Rede MQTT"
WiFi["WiFi
Wokwi-GUEST
2.4GHz"]
MQTT["Broker MQTT
77.37.69.84:1883
Mosquitto"]
end
subgraph "Cloud - Ubidots"
UBIDOTS["Plataforma Ubidots
Dashboard
Histórico de Dados
Alertas"]
NODERED["NodeRed
Dashboard Fallback
77.37.69.84:1880/dashboard/page1"]
end
DHT22 --> ESP32
MQ2 --> ESP32
RTC --> ESP32
ESP32 --> LOGIC
LOGIC --> ALARM
LOGIC --> COIFA
LOGIC --> AC
ESP32 -->|Publica| WiFi
WiFi --> MQTT
MQTT -->|Subscreve| ESP32
MQTT -->|Forward| UBIDOTS
MQTT --> NODERED
```
## Fluxo de Dados Simplificado
1. **Leitura**: Sensores capturam dados continuamente (a cada 2s)
2. **Processamento**: ESP32 verifica limiares e detecta alarmes
3. **Publicação**: Dados publicados em tópico MQTT `cozinha`
4. **Roteamento**: Broker em 77.37.69.84 recebe e roteia para múltiplos dashboards
5. **Integração Cloud**: Ubidots consome via bridge MQTT automático
6. **Integração Fallback**: NodeRed consome dados em tempo real
7. **Visualização**: Dashboards exibem em tempo real com widgets
# Descrição dos Componentes
## Componentes Principais
| Componente | Especificação | Função |
|-----------|---------------|--------|-----------------|
| Microcontrolador | ESP32 DevKit V4 | Processamento central |
| Sensor Temp/Umidade | DHT22 | Leitura ambiental |
| Sensor de Gás | MQ2 | Detecção de gás/ar |
| RTC | DS1307 | Timer para verificação de incêndio |
| Módulos Relé | 3x Relés 5V | Acionamento periféricos |
| Alarme Sonoro | Sirene | Alerta de emergência |
| Coifa | Motor AC 220V | Exaustão de gases |
| Ar-Condicionado | Unidade Comercial | Controle de temperatura |
## Mapeamento de Pinos GPIO
| GPIO | Periférico | Tipo | Função |
|------|-----------|------|--------|
| 4 | Alarme Sonoro | Saída Digital | Ativação de Sirene |
| 16 | Ar-Condicionado | Saída Digital | Controle de relé A/C |
| 17 | Coifa/Exaustor | Saída Digital | Controle de relé coifa |
| 21 | RTC SDA | I2C | Comunicação com DS1307 |
| 22 | RTC SCL | I2C | Comunicação com DS1307 |
| 32 | DHT22 | Entrada Digital | Leitura temperatura/umidade |
| 33 | MQ2 | Entrada Analógica | Leitura ADC (10 bits, 0-1023) |
# Variáveis de Telemetria MQTT
## Publicação: ESP32 → Broker (Tópico: `cozinha`)
**Intervalo**: 2 segundos
**Tipo**: JSON
**Exemplo**:
```json
{
"tmp": 28.50,
"umi": 65.20,
"gas": 850,
"alarme": 0
}
```
### Descrição das Variáveis Publicadas
| Campo | Tipo | Faixa | Unidade | Descrição | Precisão |
|-------|------|-------|---------|-----------|----------|
| `tmp` | Float | -40 a +80 | °C | Temperatura ambiente (DHT22) | ±0.5°C |
| `umi` | Float | 0 a 100 | % | Umidade relativa do ar (DHT22) | ±2% |
| `gas` | Integer | 0 a 1023 | ADC | Concentração de gás (ADC 10bits, MQ2) | 1 LSB |
| `alarme` | Integer | 0 a 4 | Enum | Estado do sistema | - |
**Mapeamento de Estados (campo `alarme`)**:
- `0` = NOMINAL (sem alarme)
- `1` = GAS (gás acima do limiar)
- `2` = TEMP_ALTA (temperatura acima do limiar)
- `3` = UMIDADE_ALTA (umidade acima do limiar)
- `4` = INCENDIO (padrão de incêndio detectado)
## Subscrição: Broker → ESP32
O sistema recebe comandos de configuração remota em tempo real, provenientes de dois dashboards:
| Origem | Tópico | Tipo | Faixa | Padrão | Descrição |
|--------|--------|------|-------|--------|-----------|
| NodeRed / CLI | `cozinha/max_tmp` | Float | 20 a 60 | 30.0 | Limite máximo de temperatura (°C) - Reconfigurável |
| NodeRed / CLI | `cozinha/max_umi` | Float | 30 a 90 | 70.0 | Limite máximo de umidade (%) - Reconfigurável |
A configuração pode ser feita através dos sliders do **NodeRed Dashboard** (http://77.37.69.84:1880/dashboard/page1), como visto na apresentação passada.
**Exemplo de comandos para configuração:**
```bash
# Alterar limite de temperatura para 32°C
mosquitto_pub -h 77.37.69.84 -t "cozinha/max_tmp" -m "32.0"
# Alterar limite de umidade para 75%
mosquitto_pub -h 77.37.69.84 -t "cozinha/max_umi" -m "75.0"
# Verificar tópico em tempo real
mosquitto_sub -h 77.37.69.84 -t "cozinha"
```
# Configuração do Sistema
## Limiares de Alarme Padrão
| Parâmetro | Ativação | Desativação | Histerese | Tipo |
|-----------|----------|-------------|-----------|------|
| Temperatura | 30.0 °C | 28.0 °C | 2.0 °C | Upper limit com histerese |
| Umidade | 70.0 % | 65.0 % | 5.0 % | Upper limit com histerese |
| Gás (MQ2) | 940 ppm | 916 ppm | 24 ppm | Upper limit com histerese |
**Histerese (Debounce)**: Implementa margem de segurança para evitar oscilações frequentes entre estados ativo/inativo.
## Estados do Sistema
O sistema opera em **5 estados distintos**, com prioridades hierárquicas:
| Estado | Código | Alarme | Coifa | A/C | Descrição | Ação |
|-------------|--------|--------|-------|-----|-----------|-----------|------|
| NOMINAL | 0 | - | - | - | Operação normal, sem alarmes | Todos desativados |
| GAS | 1 | X | X | - | Gás detectado acima do limiar | Alarme + Exaustão |
| TEMP_ALTA | 2 | - | - | X | Temperatura acima do limiar | Resfriamento |
| UMIDADE_ALTA | 3 | - | X | - | Umidade acima do limiar | Exaustão |
| INCENDIO | 4 | X | X | X | Padrão de incêndio detectado | Máxima proteção |
## Detecção Avançada de Incêndio
O sistema implementa detecção inteligente de incêndio baseada em **padrão temporal**, não apenas em limiar único de temperatura:
**Parâmetros de Monitoramento**:
- **Janela de tempo**: 30 segundos
- **Aumento mínimo de temperatura**: $\Delta T > 5°C$
- **Queda mínima de umidade**: $\Delta UR < -10\%$
**Condição de Alerta de Incêndio**:
$$\text{Incêndio} = (\Delta T > 5°C) \land (\Delta UR < -10\%) \text{ em 30 segundos}$$
**Vantagem**: Reduz falsos positivos comparado à detecção por limiar único. Um aumento isolado de temperatura ou queda de umidade não ativa alarme.
# Fluxo de Dados e Integração
## Sequência de Operação Completa
```{mermaid}
%%| fig-width: 7.5
sequenceDiagram
participant DHT as DHT22
(Sensor)
participant MQ as MQ2
(Sensor)
participant ESP as ESP32
(Processador)
participant WiFi as WiFi
participant Broker as Broker MQTT
77.37.69.84
participant Ubidots as Ubidots
(Cloud)
participant Dashboard as Dashboard
(Visualização)
loop A cada 2 segundos
DHT->>ESP: Temperatura, Umidade
MQ->>ESP: ADC (Gás)
ESP->>ESP: Detecta Alarmes
ESP->>WiFi: JSON payload
WiFi->>Broker: PUBLISH cozinha
Broker->>Ubidots: Forward automático
Ubidots->>Dashboard: Atualiza widgets
end
```
## Integração MQTT com Ubidots
**Tipo de Integração**: Bridge MQTT com Forward Automático
**Configuração do Forward**:
- **Source Broker**: 77.37.69.84:1883
- **Tópico Source**: `cozinha`
- **Destination**: Ubidots Cloud
- **Autenticação**: Token do device Ubidots
**Processamento no Ubidots**:
- Cada variável JSON é extraída e armazenada
- Histórico de 30+ dias
- Alertas configuráveis por variável
- Dashboard com widgets em tempo real
**Processamento no NodeRed**:
- Consumo direto de mensagens MQTT em tempo real
- Acesso em: **http://77.37.69.84:1880/dashboard/page1**
- Controle remoto de limiares via sliders
- Visualização gráfica em tempo real
# Ciclo de Operação
## Fluxograma do Loop Principal
### Parte 1: Leitura e Processamento
```{mermaid}
%%| fig-width: 6.5
flowchart LR
A["INÍCIO
Loop"] --> B{"MQTT
OK?"}
B -->|Não| C["Reconecta"]
C --> D["Lê Sensores"]
B -->|Sim| D
D --> E["DHT22"]
D --> F["MQ2"]
D --> G["RTC"]
E --> H["Detecta
Alarmes"]
F --> H
G --> H
H --> I["Publica"]
```
### Parte 2: Decisão de Alarmes
```{mermaid}
%%| fig-width: 6.5
flowchart LR
H["Detecta
Alarmes"] --> G{"Incêndio?"}
G -->|Sim| S4["Estado = 4"]
G -->|Não| G2{"Gás
>940?"}
G2 -->|Sim| S1["Estado = 1"]
G2 -->|Não| T{"Temp
Alta?"}
T -->|Sim| S2["Estado = 2"]
T -->|Não| U{"Umidade
Alta?"}
U -->|Sim| S3["Estado = 3"]
U -->|Não| S0["Estado = 0"]
S4 --> M["Publica
MQTT"]
S1 --> M
S2 --> M
S3 --> M
S0 --> M
M --> A["Ativa
Atuadores"]
A --> B["Aguarda 2s"]
B --> H
```
# Validação e Testes
## Protocolo de Validação
A validação do sistema foi realizada através dos seguintes testes:
### Teste 1: Conectividade WiFi
- Conexão com SSID Wokwi-GUEST
- Obtenção de IP via DHCP
### Teste 2: Conectividade MQTT
- Conexão com broker 77.37.69.84:1883
- Publicação de mensagens a cada 2s
- Recebimento de comandos de configuração
### Teste 3: Leitura de Sensores
- DHT22: Temperatura entre 15-35°C (simulado)
- DHT22: Umidade entre 40-80% (simulado)
- MQ2: ADC entre 0-1023 (simulado)
### Teste 4: Detecção de Alarmes
- Temperatura > 30°C ativa ar-condicionado
- Umidade > 70% ativa coifa
- Gás > 940 ativa alarme + coifa
- Padrão de incêndio (ΔT>5°C + ΔUR<-10%) ativa todos
### Teste 5: Integração Ubidots
- Dados recebidos no dashboard
- Histórico armazenado
- Widgets atualizados em tempo real
## Monitoramento de Dados
**Captura do Monitor Serial** (origin dos dados):
```
[SETUP] Iniciando sistema...
[DHT] Inicializado
[WiFi] Conectando.....
[WiFi] Conectado!
[MQTT] Conectando...
[MQTT] Conectado!
[MQTT] Tópico: cozinha/max_tmp
[MQTT] Tópico: cozinha/max_umi
[RTC] Inicializado
[MQTT] Publicando: {"tmp": 26.10, "umi": 63.50, "gas": 906, "alarme": 0}
[SETUP] Pronto!
[MQTT] Publicando: {"tmp": 26.10, "umi": 63.50, "gas": 906, "alarme": 0}
[MQTT] Publicando: {"tmp": 26.10, "umi": 63.50, "gas": 906, "alarme": 0}
[MQTT] Publicando: {"tmp": 26.10, "umi": 63.50, "gas": 906, "alarme": 0}
[MQTT] Publicando: {"tmp": 26.10, "umi": 63.50, "gas": 983, "alarme": 0}
[ALARME] GÁS DETECTADO!
```
## Comparação: Origem vs. Ubidots
| Métrica | Monitor Serial | Ubidots | Status |
|---------|---|---|---|
| Temperatura | 28.50°C | 28.50°C | Correspondência |
| Umidade | 65.20% | 65.20% | Correspondência |
| Gás | 850 ADC | 850 ADC | Correspondência |
| Alarme | 0 (NOMINAL) | 0 | Correspondência |
**Conclusão**: Dados transmitidos corretamente sem perda ou corrupção.
# Dashboard Ubidots
### Configuração do Device
**Nome do Device**: `cozinha`
**Tipo**: Sensor IoT
**Variáveis Configuradas**:
| Variável | Tipo | Unidade | Limites | Status |
|----------|------|---------|---------|--------|
| temperatura | Float | °C | -40 a +80 | Ativa |
| umidade | Float | % | 0 a 100 | Ativa |
| gas | Integer | ppm | 0 a 1023 | Ativa |
| alarme | Integer | Enum | 0 a 4 | Ativa |
## Widgets no Dashboard
### Widget 1: Gauge Temperatura
- **Variável**: temperatura
- **Mín**: 15°C | **Máx**: 40°C
- **Alerta**: > 30°C (vermelho)
### Widget 2: Gauge Umidade
- **Variável**: umidade
- **Mín**: 30% | **Máx**: 90%
- **Alerta**: > 70% (laranja)
### Widget 3: Gauge Gás
- **Variável**: gas
- **Mín**: 500 ppm | **Máx**: 1000 ppm
- **Alerta**: > 940 ppm (vermelho)
### Widget 4: Indicador de Estado
- **Variável**: alarme
- **Estados**:
- 0 = Verde (NOMINAL)
- 1 = Vermelho (GAS)
- 2 = Laranja (TEMP_ALTA)
- 3 = Amarelo (UMIDADE_ALTA)
- 4 = Vermelho (INCENDIO)
### Widget 5: Gráfico de Histórico (Última 24h)
- **Variáveis**: temperatura, umidade, gas
- **Tipo**: Linha com pontos
- **Intervalo**: Últimas 24 horas
## Alertas Configurados
| Evento | Condição | Ação |
|--------|----------|------|
| Temperatura Alta | tmp > 30°C | Email |
| Umidade Alta | umi > 70% | Nada |
| Gás Detectado | gas > 940 | SMS |
| Incêndio | alarme == 4 | SMS + Email |
## Screenshot do Dashboard

**Conteúdo Esperado**:
- 4 widgets numéricos com valores em tempo real
- Gráfico histórico de 24 horas
- Status indicador colorido
- Últimas leituras: data/hora
## Dashboard NodeRed - Monitoramento Fallback
### Acesso
O sistema também disponibiliza um dashboard NodeRed para monitoramento alternativo ao Ubidots:
**URL**: http://77.37.69.84:1880/dashboard/page1

### Recursos Disponíveis
| Recurso | Descrição | Funcionalidade |
|---------|-----------|-----------------|
| Indicadores Numéricos | Temperatura, Umidade, Gás | Valores em tempo real |
| Status do Alarme | Código 0-4 | Indicador colorido (verde/vermelho/amarelo) |
| Gráfico em Tempo Real | Histórico 2 minutos | Visualização de tendências |
| Slider Temperatura | Input de controle | Alterar limite máximo de temp |
| Slider Umidade | Input de controle | Alterar limite máximo de umidade |
### Configuração de Sliders
Os sliders do dashboard NodeRed publicam diretamente nos tópicos MQTT:
```
Slider Temperatura → cozinha/max_tmp
Slider Umidade → cozinha/max_umi
```
**Operação**:
1. Mover slider de temperatura
2. NodeRed publica valor em `cozinha/max_tmp`
3. ESP32 subscreve e recebe o comando
4. Limite é atualizado imediatamente
# Conclusões
## Funções Implementadas
1. **Detecção de Incêndio em 2D**: Combinação de ΔT e ΔUR em janela temporal
2. **Configuração Remota**: Limiares ajustáveis via MQTT em tempo real
3. **Histerese Dinâmica**: Evita oscilações entre estados
4. **Priorização de Alarmes**: Sistema hierárquico de estados
5. **Integração Cloud**: Dashboard profissional com Ubidots
## Aplicações Práticas
Este sistema pode ser estendido para:
- Outras ambientes: restaurantes, indústrias alimentícias
- Múltiplos sensores: CO2, fumaça, luminosidade
- Integração com sistemas SCADA
- Análise preditiva com machine learning
- Mobile app de alertas
## Recomendações Futuras
- [ ] Adicionar certificado SSL/TLS para segurança
- [ ] Implementar backup local em SD card
- [ ] Criar relatórios mensais de histórico
- [ ] Adicionar IA para detecção de padrões anormais
---
**Última Atualização**: 26 de janeiro de 2026
**Versão**: 1.0
**Status**: Finalizado