🖨️ PrintSense v4.0 FreeRTOS

Sistema Profissional de Monitoramento Ambiental para Impressão 3D

ESP32-S3 Dual-Core FreeRTOS IoT REST API Chart.js

Projeto Integrador V - Engenharia de Computação
UNIVESP 2026

📌 Visão Geral do Sistema

O PrintSense é um sistema IoT para monitoramento ambiental em impressão 3D, utilizando ESP32-S3 com arquitetura FreeRTOS dual-core, sensores físicos, interface web e persistência em SD Card.

📖 Introdução

O PrintSense v4.3 FreeRTOS é um sistema embarcado de monitoramento ambiental desenvolvido especificamente para ambientes de impressão 3D. Utilizando o poderoso microcontrolador ESP32-S3 com arquitetura dual-core e sistema operacional de tempo real FreeRTOS, o projeto oferece monitoramento preciso e em tempo real das condições que afetam diretamente a qualidade das impressões.

🎯 Objetivo Principal

Detectar e alertar sobre condições ambientais inadequadas (temperatura, umidade, luminosidade e ruído) que possam comprometer a qualidade das impressões 3D, permitindo intervenção preventiva antes da ocorrência de falhas.

Por que este projeto é importante?

Impressões 3D de qualidade dependem de condições ambientais controladas. Pequenas variações podem resultar em:

  • ❌ Falhas de adesão (warping)
  • ❌ Delaminação entre camadas
  • ❌ Absorção de umidade pelo filamento
  • ❌ Degradação de resinas fotossensíveis
  • ❌ Imperfeições causadas por vibrações

O PrintSense previne estes problemas através de monitoramento contínuo e alertas inteligentes.

⚠️ O Problema

Desafios na Impressão 3D

🌡️ Temperatura

Variações de temperatura causam expansão/contração térmica, resultando em warping e delaminação. Cada material tem sua faixa ideal.

💧 Umidade

Filamentos higroscópicos (PLA, Nylon, PETG) absorvem umidade do ar, resultando em bolhas e fragilidade. Requer ambiente controlado.

☀️ Luminosidade

Resinas fotossensíveis degradam sob luz UV/visível. Impressoras SLA/DLP exigem ambiente com luz controlada.

📢 Ruído/Vibração

Vibrações mecânicas e acústicas causam imperfeições na superfície (ringing, ghosting). Ambientes silenciosos são ideais.

Impactos

Condição Efeito na Impressão Consequência
Temp. Baixa Má adesão entre camadas Peça quebra facilmente
Temp. Alta Warping, distorção Geometria incorreta
Umidade Alta Bolhas, fragilização Acabamento ruim + quebra
Luz Excessiva Cura prematura (resina) Perda de material
Vibração Imperfeições superficiais Acabamento amador

✅ A Solução: PrintSense v4.3

🚀 Abordagem Inovadora

Diferente de soluções que apenas registram dados, o PrintSense oferece:

  • ✅ Monitoramento em tempo real (1 Hz)
  • ✅ Análise inteligente por material (PLA, PETG, ABS, Resina)
  • ✅ Alertas visuais instantâneos (LEDs)
  • ✅ Interface web profissional
  • ✅ Logging histórico para análise
  • ✅ Arquitetura dual-core (sem travamentos)

Fluxo de Funcionamento

1. Coleta de Dados

Sensores leem temperatura, umidade, luz e som a cada 1 segundo (Task Sensores - Core 1)

2. Processamento

ESP32 converte dados brutos (ADC → dB SPL, correções) e calcula status baseado no material selecionado

3. Análise

Sistema compara com thresholds do material ativo, aplicando histerese para evitar oscilações

4. Feedback Visual

LEDs indicam status (Verde=IDEAL, Amarelo=BOM, Vermelho=RUIM) instantaneamente

5. Interface

LCD mostra dados em tempo real. Web dashboard exibe gráficos Chart.js

6. Logging

Task dedicada (Core 0) grava logs CSV no SD Card a cada 60s para análise posterior

Thresholds por Material

Material Temp (°C) Umidade (%) Luz (max) Som (dB)
PLA 18-28 40-60 3000 70
PETG 20-30 30-50 3000 70
ABS 22-32 20-40 3000 70
RESINA 20-25 40-60 1000 65

🛠️ Tecnologias Utilizadas

Stack Completo

⚙️

ESP32-S3

MCU Dual-core Xtensa LX7 240 MHz

512KB RAM + 8MB PSRAM

🔄

FreeRTOS

Real-Time Operating System

v10.4.3 - Multi-tasking

🌡️

DHT22

Sensor Temp/Umidade

±0.5°C / ±2% RH

💡

LDR

Sensor de Luminosidade

ADC 12-bit (0-4095)

🎤

MAX4466

Microfone Eletreto

Conversão ADC → dB SPL

📺

LCD I2C

Display 20x4

HD44780 @ 0x27

🎛️

Encoder EC11

Controle Rotativo

CLK + DT + SW

💾

SD Card

SDMMC 1-bit

FAT32, logs CSV

📡

WiFi

802.11 b/g/n

2.4 GHz, STA mode

🌐

HTTP Server

WebServer embarcado

REST API + Static files

📊

Chart.js

Gráficos Frontend

v3.9, real-time

🔗

ArduinoJson

Serialização JSON

v6.x, eficiente

Protocolos e Comunicação

Protocolo Uso Implementação
HTTP/1.1 Servidor web WebServer.h (porta 80)
REST API Endpoints JSON GET/POST, ArduinoJson
I2C LCD communication Wire.h (SDA/SCL)
1-Wire DHT22 data DHT.h
SDMMC SD Card I/O SD_MMC.h (1-bit mode)
NTP Time sync configTime()

🏗️ Arquitetura FreeRTOS

Visão Geral Dual-Core

╔═══════════════════════════════════════════════════════════╗
║            ESP32-S3 Dual-Core Architecture                ║
╠═══════════════════════════════════════════════════════════╣
║                                                           ║
║  CORE 0 (Protocol CPU)         CORE 1 (Application)      ║
║  ══════════════════            ══════════════════         ║
║                                                           ║
║  🌐 Task WebServer             🌡️  Task Sensores         ║
║     • Prioridade: 2            │   • Prioridade: 3 ★     ║
║     • Stack: 4KB               │   • Stack: 4KB          ║
║     • Ciclo: 1ms               │   • Ciclo: 1000ms       ║
║     • HTTP requests            │   • DHT22, LDR, MAX4466 ║
║     • JSON responses           │   • Cálculo de status   ║
║                                │                         ║
║  💾 Task Logging               📺 Task LCD               ║
║     • Prioridade: 1            │   • Prioridade: 2       ║
║     • Stack: 3KB               │   • Stack: 3KB          ║
║     • Ciclo: 60s               │   • Ciclo: 500ms        ║
║     • SD Card CSV              │   • I2C display         ║
║     • Assíncrono               │   • Normal/Menu modes   ║
║                                │                         ║
║                                💡 Task LEDs              ║
║                                │   • Prioridade: 2       ║
║                                │   • Stack: 2KB          ║
║                                │   • Ciclo: 100ms        ║
║                                │   • RGB indicators      ║
║                                │                         ║
║                                🎛️  Task Encoder ★★       ║
║                                    • Prioridade: 3       ║
║                                    • Stack: 2KB          ║
║                                    • Ciclo: 10ms (100Hz) ║
║                                    • State machine       ║
║                                                           ║
╚═══════════════════════════════════════════════════════════╝

Prioridades: 1 = Baixa | 2 = Média | 3 = Alta
★ = Alta Prioridade  |  ★★ = Prioridade Crítica

Comunicação Entre Tasks

Mutexes (Proteção de Recursos)

SemaphoreHandle_t i2cMutex;    // Protege LCD (I2C)
SemaphoreHandle_t dataMutex;   // Protege currentData
SemaphoreHandle_t sdMutex;     // Protege SD Card

// Uso:
xSemaphoreTake(i2cMutex, pdMS_TO_TICKS(100));
lcd.print("Protegido!");
xSemaphoreGive(i2cMutex);

Queues (Filas de Mensagens)

QueueHandle_t sensorDataQueue;  // Task Sensores → outras tasks
QueueHandle_t lcdUpdateQueue;   // Comandos → Task LCD
QueueHandle_t logQueue;         // Dados → Task Logging

// Envio:
xQueueSend(lcdUpdateQueue, &data, 0);

// Recepção:
xQueueReceive(lcdUpdateQueue, &data, pdMS_TO_TICKS(100));

Event Groups (Sincronização)

EventGroupHandle_t systemEvents;

#define SENSOR_READY_BIT (1 << 0)
#define MATERIAL_CHANGED_BIT (1 << 4)

// Sinalizar evento:
xEventGroupSetBits(systemEvents, SENSOR_READY_BIT);

// Aguardar evento:
xEventGroupWaitBits(systemEvents, SENSOR_READY_BIT, ...);

Por que FreeRTOS?

  • Multi-tasking Real: 6 tarefas simultâneas
  • Responsividade: Encoder nunca trava (10ms garantido)
  • Isolamento: WebServer não afeta sensores
  • Escalonamento: Prioridades otimizadas
  • Dual-Core: 2 CPUs totalmente utilizados
  • Thread-Safe: Mutexes previnem race conditions

🔌 Hardware

Pinout ESP32-S3

┌─────────────────────────────────────────────────┐
│         ESP32-S3 N16R8 DevKit                   │
├─────────────────────────────────────────────────┤
│                                                 │
│  SENSORES:                                      │
│    GPIO 17 ────── DHT22 (Data)                  │
│    GPIO 4  ────── LDR (ADC1_CH3)                │
│    GPIO 8  ────── MAX4466 (ADC1_CH7)            │
│                                                 │
│  DISPLAY & CONTROLE:                            │
│    GPIO 10 ────── LCD SDA (I2C)                 │
│    GPIO 13 ────── LCD SCL (I2C)                 │
│    GPIO 7  ────── Encoder CLK                   │
│    GPIO 6  ────── Encoder DT                    │
│    GPIO 5  ────── Encoder SW (botão)            │
│                                                 │
│  INDICADORES:                                   │
│    GPIO 2  ──┬── [220Ω] ──── LED Verde          │
│    GPIO 15 ──┼── [220Ω] ──── LED Amarelo        │
│    GPIO 16 ──┴── [220Ω] ──── LED Vermelho       │
│                                                 │
│  SD CARD (SDMMC 1-bit):                         │
│    GPIO 39 ────── CLK                           │
│    GPIO 38 ────── CMD                           │
│    GPIO 40 ────── D0                            │
│                                                 │
│  ALIMENTAÇÃO:                                   │
│    5V ──────────── USB / Ext                    │
│    GND ─────────── Common Ground                │
│                                                 │
└─────────────────────────────────────────────────┘

Lista de Materiais (BOM)

Qtd Componente Especificação Função
1 ESP32-S3 DevKit N16R8 (16MB Flash, 8MB PSRAM) Microcontrolador principal
1 DHT22 (AM2302) -40~80°C, 0-100% RH Sensor temperatura/umidade
1 LDR 5mm Fotoresistor GL5528 Sensor de luminosidade
1 MAX4466 Microfone eletreto + amp Sensor de som
1 LCD I2C 20x4 HD44780, endereço 0x27 Display de informações
1 Encoder EC11 Rotativo + push button Interface do usuário
3 LED 5mm Verde, Amarelo, Vermelho Indicadores de status
3 Resistor 220Ω 1/4W, ±5% Limitador de corrente LED
1 Módulo SD Card SDMMC compatible Interface para SD
1 SD Card 4-32GB, FAT32 Armazenamento logs/web
- Jumpers M-M, M-F Conexões
1 Fonte 5V 2A+ via USB Alimentação

Esquema de LEDs

ESP32          Resistor      LED
──────────────────────────────────
GPIO 2  ───┬─── [220Ω] ───┬─── Verde (+)
GPIO 15 ───┼─── [220Ω] ───┼─── Amarelo (+)
GPIO 16 ───┴─── [220Ω] ───┴─── Vermelho (+)
                          │
                         GND

🎯 Funcionalidades

Interface LCD

Modo Normal

┌────────────────────┐
│ PLA      * IDEAL   │  ← Material + Status
│ T:25.3°C   18-28°C │  ← Temperatura (atual + range)
│ H:55.2%    40-60%  │  ← Umidade (atual + range)
│ Luz:1850  Som:60dB │  ← Luminosidade + Som
└────────────────────┘

Modo Menu

┌────────────────────┐
│ SELECIONAR MATERIAL│
│   PETG             │  ← Material anterior
│ > PLA <            │  ← Material selecionado
│   ABS              │  ← Material seguinte
└────────────────────┘

Operação:
  1. Pressionar botão → Abre menu
  2. Girar encoder → Navega
  3. Pressionar botão → Confirma

Indicadores LED

LED Status Condição
Verde IDEAL Todos os parâmetros dentro do range
Amarelo BOM 1 parâmetro fora do range
Vermelho RUIM 2 ou mais parâmetros fora do range

Interface Web

  • 📊 Dashboard em tempo real - Atualização a cada 1s
  • 📈 Gráficos Chart.js - Últimas 20 leituras
  • 🎨 Cards informativos - Temp, Umid, Luz, Som
  • 🎛️ Seletor de material - Interface web
  • 💾 Download de logs - Arquivos CSV
  • 🌐 Responsivo - Mobile-friendly

API REST

GET  /api/data               # Dados atuais (JSON)
POST /api/material           # Trocar material
GET  /api/logs               # Listar logs disponíveis
GET  /api/log?file=X.csv     # Download de log específico
GET  /                       # Interface web
GET  /style.css              # Estilos
GET  /script.js              # JavaScript

Logging

  • 📁 Formato: CSV (timestamp, temp, hum, luz, som, status)
  • 📅 Arquivo: Um por dia (YYYYMMDD.csv)
  • ⏱️ Intervalo: 60 segundos (configurável)
  • 💾 Local: SD Card (/sdcard/logs/)
  • 🔄 Assíncrono: Task dedicada (não bloqueia)

📊 Performance

Comparação: v3.1 (Loop) vs v4.0 (FreeRTOS)

Métrica v3.1 (Loop) v4.0 (FreeRTOS) Melhoria
Resposta Encoder 2000ms 10ms 200x mais rápido ⚡
Atualização LCD 1500ms 500ms 3x mais rápido
Latência WebServer ~500ms ~1ms 500x mais rápido
CPU Utilizado 50% (1 core) ~18.5% (2 cores) 2.7x mais eficiente
Uso RAM ~120KB ~118KB Otimizado
Jitter ~500ms <5ms 100x mais estável
Travamentos Frequentes Nunca ∞ melhor

Uso de Recursos

RAM (512KB total)

118KB usado (23%)
394KB livre (77%)

PSRAM (8MB total)

50KB usado (<1%)
~8MB livre (99%)

Flash (16MB total)

1.2MB usado (7.5%)
14.8MB livre (92.5%)

CPU por Core

Core Tasks Uso Médio Livre
Core 0 WebServer + Logging ~6% 94% livre
Core 1 Sensores + LCD + LEDs + Encoder ~31% 69% livre
Total Médio ~18.5% 81.5% livre

Stack Usage

Task Alocado Usado (pico) %
taskSensors 4KB ~2.8KB 70%
taskLCD 3KB ~2.1KB 70%
taskLEDs 2KB ~1.2KB 60%
taskEncoder 2KB ~1.3KB 65%
taskWebServer 4KB ~3.2KB 80%
taskLogging 3KB ~2.0KB 67%

👥 Equipe

Projeto Integrador V
Engenharia de Computação - UNIVESP 2026

Valdir Silva

Firmware & Arquitetura FreeRTOS

Bruno Silva

Hardware & Integração

Lívia Rodrigues

Interface Web & Frontend

Bruno Castro

Design & UX

Danielle Costa

Análise de Dados

Letícia Santos

Documentação Técnica

Jonathan Silva

Testes & QA

Willians Souza

Montagem Hardware

Orientadora

Profa. Danielly Soares

Instituição

UNIVESP

Universidade Virtual do Estado de São Paulo