---
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 
