Files
Atividade-2/Relatorio/relatorio.qmd
2026-01-26 18:24:20 -03:00

540 lines
17 KiB
Plaintext

---
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["<b>DHT22</b><br/>Temperatura &<br/>Umidade<br/>GPIO 32"]
MQ2["<b>MQ2</b><br/>Qualidade do Ar<br/>(Gás)<br/>GPIO 33 ADC"]
RTC["<b>RTC DS1307</b><br/>Timer para verificação de incêndio<br/>I2C"]
end
subgraph "Camada de Processamento"
ESP32["<b>ESP32 DevKit V4</b><br/>Dual-core 240MHz<br/>WiFi + BLE"]
LOGIC["Lógica de<br/>Detecção de<br/>Alarmes"]
end
subgraph "Camada de Atuadores"
ALARM["<b>Alarme Sonoro</b><br/>Sirene/>GPIO 4"]
COIFA["<b>Coifa/Exaustor</b><br/>Motor 220V<br/>GPIO 17"]
AC["<b>A/C</b><br/>Unidade comercial<br/>GPIO 16"]
end
subgraph "Rede MQTT"
WiFi["<b>WiFi</b><br/>Wokwi-GUEST<br/>2.4GHz"]
MQTT["<b>Broker MQTT</b><br/>77.37.69.84:1883<br/>Mosquitto"]
end
subgraph "Cloud - Ubidots"
UBIDOTS["<b>Plataforma Ubidots</b><br/>Dashboard<br/>Histórico de Dados<br/>Alertas"]
NODERED["<b>NodeRed</b><br/>Dashboard Fallback<br/>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<br/>(Sensor)
participant MQ as MQ2<br/>(Sensor)
participant ESP as ESP32<br/>(Processador)
participant WiFi as WiFi<br/>
participant Broker as Broker MQTT<br/>77.37.69.84
participant Ubidots as Ubidots<br/>(Cloud)
participant Dashboard as Dashboard<br/>(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<br/>Loop"] --> B{"MQTT<br/>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<br/>Alarmes"]
F --> H
G --> H
H --> I["Publica"]
```
### Parte 2: Decisão de Alarmes
```{mermaid}
%%| fig-width: 6.5
flowchart LR
H["Detecta<br/>Alarmes"] --> G{"Incêndio?"}
G -->|Sim| S4["Estado = 4"]
G -->|Não| G2{"Gás<br>>940?"}
G2 -->|Sim| S1["Estado = 1"]
G2 -->|Não| T{"Temp<br/>Alta?"}
T -->|Sim| S2["Estado = 2"]
T -->|Não| U{"Umidade<br/>Alta?"}
U -->|Sim| S3["Estado = 3"]
U -->|Não| S0["Estado = 0"]
S4 --> M["Publica<br/>MQTT"]
S1 --> M
S2 --> M
S3 --> M
S0 --> M
M --> A["Ativa<br/>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
![Dashboard no Ubidots](ubidots.png)
**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
![Dashboard no NodeRed](nodered.png)
### 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