📌 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)
PSRAM (8MB total)
Flash (16MB total)
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