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