"use client"; import { useState, useMemo } from "react"; import Header from "@/components/Header"; import Footer from "@/components/Footer"; import Link from "next/link"; import seriesData from "@/public/series.json"; import { Wifi, Bluetooth, Network, Cpu, Bot, Monitor, Camera, Home as HomeIcon, Sliders, Cable, Battery, Zap, Ban, ChevronLeft, ChevronRight, RotateCcw, Sparkles, Edit2, CheckCircle, HelpCircle, Award, SlidersHorizontal, ExternalLink, ShoppingBag, BookOpen, ShieldCheck, KeyRound, Lock, Radio, Layers, Microchip, Activity, Flame, Check, X, AlertTriangle, Gauge, Volume2, Tv, HardDrive, Filter, ArrowRight, Lightbulb, Info } from "lucide-react"; // Dynamic icon mapper for options and presets const iconMap = { // Categorias "category_smarthome": , "category_multimedia": , "category_ai_edge": , "category_wearable": , "category_industrial": , "category_basic_iot": , // Conectividade "connectivity_wifi6_dualband": , "connectivity_wifi6_mesh": , "connectivity_mesh_only": , "connectivity_wifi_ble": , "connectivity_bt_classic_audio": , "connectivity_ethernet": , "connectivity_none_local": , // Alimentação "power_battery_critical": , "power_ulp_coprocessor": , "power_always_on": , // Periféricos / Hardware "hardware_mipi_multimedia": (
), "hardware_usb_otg": , "hardware_can_twai": , "hardware_dac_audio": , "hardware_many_gpios": , "hardware_standard_sensors": , // Memória "memory_heavy_psram": , "memory_moderate_sram": , "memory_minimal_cost": , // IA "ai_ai_vector": , "ai_standard": , // Segurança "security_key_manager_dpa": , "security_matter_ecdsa": , "security_secure_boot": , "security_standard_tls": , // Ecossistema "ecosystem_arduino_ready": , "ecosystem_advanced_idf": , }; const getOptionIcon = (questionId, value) => { const key = `${questionId}_${value}`; return iconMap[key] || ; }; // 7 Preset Configurations for 1-click recommendations const PRESETS = [ { id: "preset_smarthome", title: "Smart Home & Matter", icon: "🏠", badge: "Automação 802.15.4", color: "from-teal-500/20 to-emerald-500/10 border-teal-500/30 text-teal-700 dark:text-teal-300", description: "Wi-Fi 6, Thread/Zigbee e baixo consumo", answers: { category: "smarthome", connectivity: "wifi6_mesh", power: "ulp_coprocessor", hardware: "standard_sensors", memory: "moderate_sram", ai: "standard", security: "matter_ecdsa", ecosystem: "arduino_ready", } }, { id: "preset_hmi", title: "Painel Touch & Telas", icon: "🎨", badge: "Display / Câmera", color: "from-cyan-500/20 to-blue-500/10 border-cyan-500/30 text-cyan-700 dark:text-cyan-300", description: "Display LCD/MIPI, PSRAM e alta taxa de quadros", answers: { category: "multimedia", connectivity: "wifi_ble", power: "always_on", hardware: "mipi_multimedia", memory: "heavy_psram", ai: "standard", security: "secure_boot", ecosystem: "arduino_ready", } }, { id: "preset_ai", title: "Edge AI & Visão", icon: "🧠", badge: "Aceleração Vetorial", color: "from-pink-500/20 to-purple-500/10 border-pink-500/30 text-pink-700 dark:text-pink-300", description: "Acelerador neural, câmera e alta memória", answers: { category: "ai_edge", connectivity: "wifi_ble", power: "always_on", hardware: "mipi_multimedia", memory: "heavy_psram", ai: "ai_vector", security: "secure_boot", ecosystem: "arduino_ready", } }, { id: "preset_wearable", title: "Wearable a Bateria", icon: "🔋", badge: "Deep Sleep <10µA", color: "from-green-500/20 to-emerald-500/10 border-green-500/30 text-green-700 dark:text-green-300", description: "Eficiência extrema e rádio Bluetooth LE", answers: { category: "wearable", connectivity: "wifi_ble", power: "battery_critical", hardware: "standard_sensors", memory: "minimal_cost", ai: "standard", security: "standard_tls", ecosystem: "arduino_ready", } }, { id: "preset_wifi6_5ghz", title: "Wi-Fi 6 Dual-Band (5GHz)", icon: "📶", badge: "2.4 & 5 GHz", color: "from-indigo-500/20 to-blue-500/10 border-indigo-500/30 text-indigo-700 dark:text-indigo-300", description: "Banda de 5 GHz com menor interferência de RF", answers: { category: "smarthome", connectivity: "wifi6_dualband", power: "always_on", hardware: "standard_sensors", memory: "moderate_sram", ai: "standard", security: "key_manager_dpa", ecosystem: "arduino_ready", } }, { id: "preset_industrial", title: "Industrial / CAN & Rede", icon: "🏭", badge: "Ethernet & TWAI", color: "from-amber-500/20 to-orange-500/10 border-amber-500/30 text-amber-700 dark:text-amber-300", description: "Barramento CAN/TWAI, Ethernet e alta robustez", answers: { category: "industrial", connectivity: "ethernet", power: "always_on", hardware: "can_twai", memory: "moderate_sram", ai: "standard", security: "secure_boot", ecosystem: "arduino_ready", } }, { id: "preset_budget", title: "IoT Básico de Baixo Custo", icon: "💸", badge: "Ultra-Econômico", color: "from-emerald-500/20 to-teal-500/10 border-emerald-500/30 text-emerald-700 dark:text-emerald-300", description: "Menor custo por unidade para sensores simples", answers: { category: "basic_iot", connectivity: "wifi_ble", power: "battery_critical", hardware: "standard_sensors", memory: "minimal_cost", ai: "standard", security: "standard_tls", ecosystem: "arduino_ready", } } ]; export default function Seletor() { const [mode, setMode] = useState("wizard"); // "wizard" | "filter" const [currentStep, setCurrentStep] = useState(0); const [currentAnswer, setCurrentAnswer] = useState(null); const [activePreset, setActivePreset] = useState(null); const [answers, setAnswers] = useState({ category: null, connectivity: null, power: null, hardware: null, memory: null, ai: null, security: null, ecosystem: null, }); const [showResults, setShowResults] = useState(false); const [showSummary, setShowSummary] = useState(false); // Direct Parametric Filter State (for "filter" mode) const [filters, setFilters] = useState({ wifi6: false, wifi5ghz: false, bluetoothClassic: false, leAudio: false, matter: false, ethernet: false, aiAccel: false, psram: false, mipiDisplayCamera: false, usbOTG: false, canBus: false, dac: false, touch: false, arduinoReady: false, keyManager: false, }); const questions = [ { id: "category", question: "1. Qual é o foco principal ou aplicação do seu projeto?", description: "Categorizar sua aplicação ajuda a equilibrar formato físico, custo por unidade, barramentos de mídia e poder computacional.", options: [ { value: "smarthome", label: "Automação / Smart Home / Dispositivos Conectados", icon: "category_smarthome" }, { value: "multimedia", label: "Interfaces Gráficas (Telas LCD/MIPI / Câmeras / IHM)", icon: "category_multimedia" }, { value: "ai_edge", label: "Inteligência Artificial na Borda (Visão / Áudio / TinyML)", icon: "category_ai_edge" }, { value: "wearable", label: "Dispositivo Portátil / Vestível (Alimentado a Bateria)", icon: "category_wearable" }, { value: "industrial", label: "Industrial / Robótica / Redes de Campo e Automação", icon: "category_industrial" }, { value: "basic_iot", label: "IoT Básico / Sensor Conectado de Ultra-Baixo Custo", icon: "category_basic_iot" }, ] }, { id: "connectivity", question: "2. Qual tecnologia de rede sem fio ou cabeada você precisa?", description: "O ecossistema ESP32 oferece desde rádios Wi-Fi 6 Dual-Band (2.4/5GHz), Bluetooth 6 e Mesh 802.15.4 até Ethernet cabeada e Bluetooth Clássico.", options: [ { value: "wifi6_dualband", label: "Wi-Fi 6 Dual-Band (2.4 GHz e 5 GHz) + Bluetooth 6.0", icon: "connectivity_wifi6_dualband" }, { value: "wifi6_mesh", label: "Wi-Fi 6 + Matter / Zigbee 3.0 / Thread (802.15.4)", icon: "connectivity_wifi6_mesh" }, { value: "mesh_only", label: "Apenas Rádio Mesh (Zigbee / Thread / Matter) + BLE (Sem Wi-Fi)", icon: "connectivity_mesh_only" }, { value: "wifi_ble", label: "Wi-Fi 4 Tradicional (2.4 GHz) + Bluetooth LE", icon: "connectivity_wifi_ble" }, { value: "bt_classic_audio", label: "Bluetooth Clássico (Áudio A2DP/SPP) ou LE Audio", icon: "connectivity_bt_classic_audio" }, { value: "ethernet", label: "Rede Cabeada Industrial (Ethernet MAC integrado)", icon: "connectivity_ethernet" }, { value: "none_local", label: "Apenas Processamento Local / Sem Conexão Sem Fio", icon: "connectivity_none_local" }, ] }, { id: "power", question: "3. Como o dispositivo será alimentado eletricamente?", description: "A escolha da fonte define a importância de modos de Deep Sleep ultra-baixos (<10µA) e coprocessadores ULP para monitoramento contínuo.", options: [ { value: "battery_critical", label: "Bateria / Solar (Consumo Ultra-Baixo em Deep Sleep <10µA)", icon: "power_battery_critical" }, { value: "ulp_coprocessor", label: "Misto / Monitorar sensores em background via Coprocessador ULP", icon: "power_ulp_coprocessor" }, { value: "always_on", label: "Tomada, Fonte Externa ou USB (Sempre Ativo / Alto Desempenho)", icon: "power_always_on" }, ] }, { id: "hardware", question: "4. Quais periféricos ou barramentos físicos especiais você vai usar?", description: "Algumas funcionalidades exigem blocos de silício dedicados, como interfaces de vídeo MIPI/RGB, barramento CAN industrial ou USB nativo.", options: [ { value: "mipi_multimedia", label: "Display Gráfico LCD (RGB/MIPI DSI) ou Câmeras (DVP/MIPI CSI)", icon: "hardware_mipi_multimedia" }, { value: "usb_otg", label: "USB Nativo OTG (Emular teclado, mouse, disco ou modo Host)", icon: "hardware_usb_otg" }, { value: "can_twai", label: "Barramento Automotivo / Industrial CAN (TWAI ou CAN-FD)", icon: "hardware_can_twai" }, { value: "dac_audio", label: "Áudio Analógico com DAC integrado ou múltiplos I2S", icon: "hardware_dac_audio" }, { value: "many_gpios", label: "Muitos pinos livres de expansão (Mais de 35 GPIOs físicos)", icon: "hardware_many_gpios" }, { value: "standard_sensors", label: "Sensores comuns com barramentos tradicionais (I2C, SPI, UART, PWM)", icon: "hardware_standard_sensors" }, ] }, { id: "memory", question: "5. Qual o volume de memória RAM / PSRAM necessário?", description: "Projetos gráficos (LVGL), visão computacional, áudio ou pilhas pesadas exigem suporte a PSRAM externa ou integrada de alta densidade.", options: [ { value: "heavy_psram", label: "Alta Densidade de PSRAM (>4 MB a 64 MB para buffers de vídeo, IA ou LVGL)", icon: "memory_heavy_psram" }, { value: "moderate_sram", label: "SRAM interna equilibrada (320 KB a 512 KB) com ou sem PSRAM leve", icon: "memory_moderate_sram" }, { value: "minimal_cost", label: "Memória compacta e econômica (firmware enxuto de baixo custo)", icon: "memory_minimal_cost" }, ] }, { id: "ai", question: "6. Seu projeto usará Inteligência Artificial local (Edge AI / TinyML)?", description: "Instruções vetoriais e aceleradores neurais dedicados em hardware reduzem o tempo de inferência de redes neurais de segundos para milissegundos.", options: [ { value: "ai_vector", label: "Sim, preciso de acelerador vetorial de IA em hardware (TinyML / Visão)", icon: "ai_ai_vector" }, { value: "standard", label: "Não, processamento lógico e matemático comum é suficiente", icon: "ai_standard" }, ] }, { id: "security", question: "7. Qual nível de segurança e criptografia por hardware o produto exige?", description: "As séries diferem em suporte a Key Manager, proteção contra ataques de canal lateral (DPA), curvas elípticas (ECC/ECDSA) e aceleradores AES.", options: [ { value: "key_manager_dpa", label: "Proteção Máxima: Key Manager (chave inacessível ao firmware) e Proteção DPA", icon: "security_key_manager_dpa" }, { value: "matter_ecdsa", label: "Atestado Matter ou Assinatura Digital por hardware (ECDSA / ECC)", icon: "security_matter_ecdsa" }, { value: "secure_boot", label: "Boot Seguro V2 e Criptografia de Flash (XTS-AES) contra cópia do firmware", icon: "security_secure_boot" }, { value: "standard_tls", label: "Comunicação TLS/HTTPS comum ou sem requisito regulatório crítico", icon: "security_standard_tls" }, ] }, { id: "ecosystem", question: "8. Qual é a sua preferência de ambiente de desenvolvimento?", description: "Chips mais maduros têm amplo suporte oficial no Arduino Core com centenas de bibliotecas prontas, enquanto chips preliminares utilizam ESP-IDF.", options: [ { value: "arduino_ready", label: "Pronto para Arduino IDE (suporte maduro com vasta coleção de bibliotecas)", icon: "ecosystem_arduino_ready" }, { value: "advanced_idf", label: "ESP-IDF profissional ou aberto a silícios de última geração (S31, H4, etc.)", icon: "ecosystem_advanced_idf" }, ] } ]; const handleAnswer = (questionId, value) => { setCurrentAnswer(value); setAnswers(prev => ({ ...prev, [questionId]: value })); setActivePreset(null); }; const handleNext = () => { if (currentAnswer !== null) { if (currentStep < questions.length - 1) { const nextStep = currentStep + 1; setCurrentStep(nextStep); setCurrentAnswer(answers[questions[nextStep].id] || null); } else { setShowSummary(true); } } }; const goBack = () => { if (currentStep > 0) { const prevStep = currentStep - 1; setCurrentStep(prevStep); setCurrentAnswer(answers[questions[prevStep].id] || null); } }; const resetQuiz = () => { setCurrentStep(0); setCurrentAnswer(null); setShowResults(false); setShowSummary(false); setActivePreset(null); setAnswers({ category: null, connectivity: null, power: null, hardware: null, memory: null, ai: null, security: null, ecosystem: null, }); }; const applyPreset = (preset) => { setAnswers(preset.answers); setActivePreset(preset.id); setCurrentStep(questions.length - 1); setCurrentAnswer(preset.answers.ecosystem); setShowSummary(false); setShowResults(true); }; // Comprehensive Multi-Criteria Scoring Engine based on series.json const calculateRecommendations = () => { const scores = {}; const reasons = {}; const alerts = {}; Object.keys(seriesData).forEach(key => { scores[key] = 0; reasons[key] = []; alerts[key] = []; const serie = seriesData[key]; const seg = serie.seguranca || {}; // 1. CATEGORIA (category) if (answers.category === "smarthome") { if (serie.matter === "Sim") { scores[key] += 20; reasons[key].push("Suporte nativo a Matter para interoperabilidade residencial inteligente"); } if (serie.zigbee_thread && serie.zigbee_thread !== "Não") { scores[key] += 15; reasons[key].push("Rádio 802.15.4 integrado compatível com Zigbee 3.0 e Thread"); } if (serie.wifi && !String(serie.wifi).includes("Não")) { scores[key] += 10; reasons[key].push("Rádio Wi-Fi integrado para conexão direta ao roteador"); } } else if (answers.category === "multimedia") { if (serie.mipi_dsi || serie.mipi_csi) { scores[key] += 30; reasons[key].push("Barramentos avançados de alta velocidade MIPI DSI (telas) e MIPI CSI (câmeras)"); } else if (serie.lcd || serie.camera) { scores[key] += 20; reasons[key].push("Interfaces dedicadas em hardware para telas LCD RGB e câmeras DVP"); } else { scores[key] -= 35; alerts[key].push("Sem barramentos dedicados para telas coloridas ou câmeras (apenas SPI/I2C simples)"); } if (serie.psram_externa && serie.psram_externa !== "Não") { scores[key] += 15; reasons[key].push("Suporte a PSRAM de alta capacidade para framebuffers gráficos e processamento de imagem"); } } else if (answers.category === "ai_edge") { if (serie.aceleradores_ia) { scores[key] += 35; reasons[key].push(`Aceleração neural e instruções vetoriais dedicadas (${serie.aceleradores_ia})`); } else { scores[key] -= 25; alerts[key].push("Sem aceleradores neurais dedicados (inferência por software)"); } if (serie.nucleos && serie.nucleos.includes("2")) { scores[key] += 10; reasons[key].push("Processador Dual-Core para pipeline paralelo de captura e inferência"); } } else if (answers.category === "wearable") { const sleep = serie.consumo_energia?.deep_sleep; if (sleep) { const uaMatch = sleep.match(/(\d+)\s*µA/); if (uaMatch && parseInt(uaMatch[1]) <= 10) { scores[key] += 20; reasons[key].push(`Consumo em Deep Sleep ultrabaixo de apenas ${sleep} preserva baterias compactas`); } } if (serie.bluetooth && serie.bluetooth !== "Não") { scores[key] += 15; reasons[key].push("Rádio Bluetooth de alta eficiência energética para pareamento contínuo"); } if (key === "ESP32-C2" || key === "ESP32-C3" || key === "ESP32-H2") { scores[key] += 10; reasons[key].push("Encapsulamento compacto QFN reduz o footprint na placa"); } } else if (answers.category === "industrial") { if (serie.ethernet || serie.ethernet_mac) { scores[key] += 25; reasons[key].push("Controlador MAC Ethernet integrado para conexões cabeadas industriais imunes a ruídos de RF"); } if (serie.can) { scores[key] += 20; reasons[key].push(`Interface de barramento industrial ${serie.can}`); } if (parseInt(serie.gpio) >= 30) { scores[key] += 10; reasons[key].push(`Ampla contagem de portas digitais (${serie.gpio} GPIOs) para relés e atuadores`); } } else if (answers.category === "basic_iot") { if (key === "ESP32-C2" || key === "ESP32-C3" || key === "ESP32-C61") { scores[key] += 25; reasons[key].push("Excelente relação custo-benefício para sensores e atuadores conectados em escala"); } if (serie.wifi && !String(serie.wifi).includes("Não") && serie.bluetooth !== "Não") { scores[key] += 15; reasons[key].push("Wi-Fi + BLE integrados em módulo econômico"); } } // 2. CONECTIVIDADE (connectivity) if (answers.connectivity === "wifi6_dualband") { if (String(serie.wifi).includes("5 GHz") || String(serie.wifi).includes("dual-band")) { scores[key] += 40; reasons[key].push("Exclusivo Wi-Fi 6 Dual-Band (2.4 GHz e 5 GHz) para ambientes com alto ruído de 2.4 GHz"); } else if (String(serie.wifi).includes("Wi-Fi 6")) { scores[key] += 15; reasons[key].push("Wi-Fi 6 (802.11ax), porém operando apenas na faixa de 2.4 GHz"); } else { scores[key] -= 35; alerts[key].push("Não possui suporte a Wi-Fi na banda de 5 GHz"); } } else if (answers.connectivity === "wifi6_mesh") { if (String(serie.wifi).includes("Wi-Fi 6") && serie.matter === "Sim") { scores[key] += 30; reasons[key].push("Wi-Fi 6 (802.11ax) somado a rádio 802.15.4 para Thread/Zigbee/Matter"); } else if (serie.matter === "Sim") { scores[key] += 15; reasons[key].push("Suporte a Matter/Thread, mas rádio Wi-Fi em padrão Wi-Fi 4 ou ausente"); } else { scores[key] -= 20; alerts[key].push("Sem rádio 802.15.4 integrado para Thread/Zigbee"); } } else if (answers.connectivity === "mesh_only") { if ((serie.wifi === "Não" || !serie.wifi) && serie.matter === "Sim") { scores[key] += 35; reasons[key].push("Foco 100% em 802.15.4 (Zigbee/Thread/Matter) sem o consumo do rádio Wi-Fi"); } else if (serie.matter === "Sim") { scores[key] += 20; reasons[key].push("Suporta redes Mesh (Zigbee/Thread), mas inclui rádio Wi-Fi adicional"); } else { scores[key] -= 30; alerts[key].push("Sem rádio 802.15.4 para protocolo Thread ou Zigbee"); } } else if (answers.connectivity === "wifi_ble") { if (serie.wifi && !String(serie.wifi).includes("Não") && serie.bluetooth && serie.bluetooth !== "Não") { scores[key] += 25; reasons[key].push(`Pilha completa com Wi-Fi (${serie.wifi}) e Bluetooth (${serie.bluetooth})`); } else if (serie.wifi && !String(serie.wifi).includes("Não")) { scores[key] += 10; alerts[key].push("Possui Wi-Fi, mas não possui rádio Bluetooth integrado"); } else { scores[key] -= 60; alerts[key].push("Incompatível: Não possui rádio Wi-Fi integrado"); } } else if (answers.connectivity === "bt_classic_audio") { if (String(serie.bluetooth).includes("Classic") || String(serie.bluetooth).includes("Clássico")) { scores[key] += 35; reasons[key].push("Suporte a Bluetooth Clássico (BR/EDR) com perfis A2DP de áudio e SPP serial"); } else if (String(serie.bluetooth).includes("LE Audio")) { scores[key] += 35; reasons[key].push("Suporte a Bluetooth LE Audio de última geração (canais isócronos BIS/CIS)"); } else if (serie.bluetooth && serie.bluetooth !== "Não") { scores[key] += 5; alerts[key].push("Suporta apenas Bluetooth LE (BLE), sem perfis tradicionais de áudio clássico A2DP"); } else { scores[key] -= 40; alerts[key].push("Não possui rádio Bluetooth"); } } else if (answers.connectivity === "ethernet") { if (serie.ethernet || serie.ethernet_mac) { scores[key] += 35; reasons[key].push("Controlador MAC Ethernet nativo integrado (requer apenas transceiver PHY)"); } else { scores[key] -= 25; alerts[key].push("Sem MAC Ethernet interno (necessita de módulo SPI Ethernet externo como W5500)"); } } else if (answers.connectivity === "none_local") { if (serie.wifi === "Não" || serie.bluetooth === "Não" || key === "ESP32-P4") { scores[key] += 25; reasons[key].push("Arquitetura orientada a processamento local dedicado sem custo de transceivers de rádio"); } else { scores[key] += 10; } } // 3. ALIMENTAÇÃO (power) if (answers.power === "battery_critical") { const sleep = serie.consumo_energia?.deep_sleep; if (sleep) { const uaMatch = sleep.match(/(\d+)\s*µA/); if (uaMatch && parseInt(uaMatch[1]) <= 10) { scores[key] += 25; reasons[key].push(`Consumo de suspensão de ${sleep} permite operação por meses em bateria`); } else { scores[key] += 10; reasons[key].push(`Modo de baixo consumo de ${sleep}`); } } if (serie.coprocessador_ulp && serie.coprocessador_ulp !== "Não") { scores[key] += 10; reasons[key].push("Coprocessador ULP permite checar pinos sem despertar a CPU principal"); } } else if (answers.power === "ulp_coprocessor") { if (serie.coprocessador_ulp && serie.coprocessador_ulp !== "Não") { scores[key] += 30; reasons[key].push(`Coprocessador ULP / CPU de Baixo Consumo (${serie.coprocessador_ulp})`); } else { scores[key] -= 15; alerts[key].push("Sem coprocessador ULP dedicado"); } } else if (answers.power === "always_on") { if (serie.nucleos && serie.nucleos.includes("2")) { scores[key] += 15; reasons[key].push("Processador Dual-Core para multitarefa paralela contínua"); } const freqMatch = serie.frequencia?.match(/(\d+)\s*MHz/); if (freqMatch && parseInt(freqMatch[1]) >= 240) { scores[key] += 15; reasons[key].push(`Frequência de clock de alto desempenho (${serie.frequencia})`); } } // 4. HARDWARE & PERIFÉRICOS (hardware) if (answers.hardware === "mipi_multimedia") { if (serie.mipi_dsi || serie.mipi_csi) { scores[key] += 35; reasons[key].push("Interface MIPI DSI (telas) e MIPI CSI (câmeras) com alto throughput"); } else if (serie.lcd || serie.camera) { scores[key] += 20; reasons[key].push("Interfaces paralelas para LCD RGB e câmeras DVP de 8/16 bits"); } else { scores[key] -= 45; alerts[key].push("Sem interfaces dedicadas de tela/câmera (limitado a barramento SPI)"); } } else if (answers.hardware === "usb_otg") { if (serie.usb && String(serie.usb).includes("OTG 2.0")) { scores[key] += 35; reasons[key].push(`Porta USB 2.0 High-Speed OTG (${serie.usb}) para transferência ultrarrápida`); } else if (serie.usb && String(serie.usb).includes("OTG")) { scores[key] += 25; reasons[key].push(`Interface USB OTG 1.1 integrada (${serie.usb}) para emulação HID e Host`); } else if (serie.usb && String(serie.usb).includes("Serial/JTAG")) { scores[key] += 10; alerts[key].push("USB integrado apenas para Serial/JTAG (não suporta emulação de teclado/mouse HID nativo)"); } else { scores[key] -= 30; alerts[key].push("Sem USB nativo (requer chip conversor USB-UART externo)"); } } else if (answers.hardware === "can_twai") { if (serie.can && String(serie.can).includes("CAN FD")) { scores[key] += 35; reasons[key].push("Controlador avançado CAN-FD (Flexible Data-Rate) para alta largura de banda automotiva"); } else if (serie.can) { scores[key] += 25; reasons[key].push(`Controlador de barramento industrial ${serie.can}`); } else { scores[key] -= 25; alerts[key].push("Sem controlador de barramento CAN / TWAI nativo"); } } else if (answers.hardware === "dac_audio") { if (serie.dac && serie.dac !== "Não") { scores[key] += 30; reasons[key].push(`Conversores Digital-Analógico embutidos (${serie.dac}) para geração de som sem DAC externo`); } else if (serie.i2s && parseInt(serie.i2s) >= 2) { scores[key] += 15; reasons[key].push(`Múltiplos barramentos I2S (${serie.i2s} interfaces) para codecs de áudio`); } else { scores[key] += 5; alerts[key].push("Não possui conversor DAC interno de áudio (requer codec I2S ou PWM)"); } } else if (answers.hardware === "many_gpios") { const gpios = parseInt(serie.gpio) || 0; if (gpios >= 40) { scores[key] += 30; reasons[key].push(`Excepcional número de pinos disponíveis (${gpios} GPIOs)`); } else if (gpios >= 28) { scores[key] += 15; reasons[key].push(`Quantidade moderada de portas (${gpios} GPIOs)`); } else { scores[key] -= 20; alerts[key].push(`Contagem restrita de pinos (${gpios} GPIOs)`); } } else if (answers.hardware === "standard_sensors") { scores[key] += 10; } // 5. MEMÓRIA & PSRAM (memory) if (answers.memory === "heavy_psram") { if (serie.psram_externa && (String(serie.psram_externa).includes("64 MB") || String(serie.psram_externa).includes("1 GB"))) { scores[key] += 35; reasons[key].push(`Expansão massiva de memória PSRAM (${serie.psram_externa})`); } else if (serie.psram_externa && serie.psram_externa !== "Não") { scores[key] += 20; reasons[key].push(`Suporte a memória PSRAM externa (${serie.psram_externa})`); } else { scores[key] -= 35; alerts[key].push("Sem suporte a memória PSRAM externa ou integrada"); } } else if (answers.memory === "moderate_sram") { const sramMatch = serie.memoria_sram?.match(/(\d+)\s*KB/); if (sramMatch && parseInt(sramMatch[1]) >= 380) { scores[key] += 15; reasons[key].push(`SRAM interna confortável (${serie.memoria_sram})`); } else { scores[key] += 8; } } else if (answers.memory === "minimal_cost") { if (key === "ESP32-C2" || key === "ESP32-C3" || key === "ESP32-H2") { scores[key] += 20; reasons[key].push("Memória enxuta e silício compacto para menor custo unitário"); } else { scores[key] += 5; } } // 6. INTELIGÊNCIA ARTIFICIAL (ai) if (answers.ai === "ai_vector") { if (serie.aceleradores_ia) { scores[key] += 35; reasons[key].push("Acelerador neural de silício e instruções vetoriais para processamento de matrizes e tensores"); } else { scores[key] -= 30; alerts[key].push("Sem aceleração vetorial por hardware para IA na borda"); } } else if (answers.ai === "standard") { scores[key] += 5; } // 7. SEGURANÇA (security) const temECDSA = String(seg.ecdsa).startsWith("Sim"); const temECC = String(seg.ecc).startsWith("Sim"); const temAES = String(seg.aes).startsWith("AES"); const temKeyManager = seg.key_manager === "Sim"; const temDPA = seg.protecao_dpa === "Sim"; if (answers.security === "key_manager_dpa") { if (temKeyManager && temDPA) { scores[key] += 35; reasons[key].push("Key Manager (chaves nunca expostas à CPU) e proteção física contra ataques de canal lateral DPA"); } else if (temKeyManager) { scores[key] += 25; reasons[key].push("Periférico Key Manager integrado para isolamento total de chaves criptográficas"); } else if (temDPA) { scores[key] += 20; reasons[key].push("Proteção DPA em hardware contra análise diferencial de consumo de energia"); } else { scores[key] -= 25; alerts[key].push("Sem periférico Key Manager nem proteção DPA"); } } else if (answers.security === "matter_ecdsa") { if (temECDSA) { scores[key] += 30; reasons[key].push(`Acelerador de assinatura digital ECDSA determinístico em hardware (${seg.ecc})`); } else if (temECC) { scores[key] += 15; reasons[key].push(`Coprocessador de curvas elípticas ECC (${seg.ecc})`); } else { scores[key] -= 25; alerts[key].push("Sem acelerador de curvas elípticas (ECC) em hardware (assinatura por software mais lenta)"); } } else if (answers.security === "secure_boot") { if (String(seg.secure_boot).includes("V2")) { scores[key] += 20; reasons[key].push(`Secure Boot ${seg.secure_boot} com criptografia de flash ${seg.criptografia_flash}`); } else if (String(seg.secure_boot).includes("V1")) { scores[key] += 5; alerts[key].push("Secure Boot em esquema V1 (legado com limitações de segurança)"); } else { scores[key] -= 20; alerts[key].push("Sem Secure Boot V2 estável"); } } else if (answers.security === "standard_tls") { if (temAES) { scores[key] += 15; reasons[key].push(`Criptografia de tráfego TLS acelerada por hardware (${seg.aes})`); } else { scores[key] -= 5; alerts[key].push(`Sem acelerador AES por hardware (a criptografia TLS é executada pela CPU)`); } } // 8. ECOSSISTEMA (ecosystem) if (answers.ecosystem === "arduino_ready") { if (String(serie.arduino_core).startsWith("Sim")) { const countMatch = serie.arduino_core.match(/(\d+)\s*definições/); const count = countMatch ? parseInt(countMatch[1]) : 1; if (count >= 20) { scores[key] += 25; reasons[key].push(`Excelente maturidade e suporte no core oficial Arduino (${count} variantes de placas)`); } else { scores[key] += 15; reasons[key].push(`Suporte no core oficial Arduino (${count} placa registrada)`); } } else { scores[key] -= 35; alerts[key].push("Ainda não suportado no core oficial do Arduino (desenvolvimento restrito ao ESP-IDF)"); } } else if (answers.ecosystem === "advanced_idf") { scores[key] += 15; } }); return { scores, reasons, alerts }; }; // Parametric Direct Filter Matcher const filteredChips = useMemo(() => { if (mode !== "filter") return []; return Object.entries(seriesData).filter(([key, serie]) => { const seg = serie.seguranca || {}; if (filters.wifi6 && !String(serie.wifi).includes("Wi-Fi 6") && !String(serie.wifi).includes("802.11ax")) return false; if (filters.wifi5ghz && (!serie.wifi || !String(serie.wifi).includes("5 GHz"))) return false; if (filters.bluetoothClassic && (!serie.bluetooth || (!String(serie.bluetooth).includes("Classic") && !String(serie.bluetooth).includes("Clássico")))) return false; if (filters.leAudio && (!serie.bluetooth || !String(serie.bluetooth).includes("LE Audio"))) return false; if (filters.matter && serie.matter !== "Sim") return false; if (filters.ethernet && !serie.ethernet && !serie.ethernet_mac) return false; if (filters.aiAccel && !serie.aceleradores_ia) return false; if (filters.psram && (!serie.psram_externa || serie.psram_externa === "Não")) return false; if (filters.mipiDisplayCamera && !serie.mipi_dsi && !serie.mipi_csi && !serie.lcd && !serie.camera) return false; if (filters.usbOTG && (!serie.usb || !String(serie.usb).includes("OTG"))) return false; if (filters.canBus && !serie.can) return false; if (filters.dac && (!serie.dac || serie.dac === "Não")) return false; if (filters.touch && (!serie.touch || serie.touch === "Não")) return false; if (filters.arduinoReady && (!serie.arduino_core || !String(serie.arduino_core).startsWith("Sim"))) return false; if (filters.keyManager && seg.key_manager !== "Sim") return false; return true; }); }, [mode, filters]); const { scores: allScores, reasons: allReasons, alerts: allAlerts } = useMemo(() => { if (showResults && Object.values(answers).every(a => a !== null)) { return calculateRecommendations(); } return { scores: {}, reasons: {}, alerts: {} }; }, [showResults, answers]); const recommendations = useMemo(() => { const entries = Object.entries(allScores) .filter(([_, score]) => score > 0) .sort(([, a], [, b]) => b - a); const maxScore = entries.length > 0 ? entries[0][1] : 1; return entries.map(([key, score]) => ({ key, score, percentage: Math.min(100, Math.round((score / maxScore) * 100)), })); }, [allScores]); const topThree = recommendations.slice(0, 3); const otherRecommendations = recommendations.slice(3); // Rearrange podium for premium visual styling: 2nd Place | 1st Place | 3rd Place const desktopPodium = useMemo(() => { if (topThree.length < 2) return topThree; if (topThree.length === 2) return [topThree[1], topThree[0]]; return [topThree[1], topThree[0], topThree[2]]; }, [topThree]); const progress = ((currentStep + 1) / questions.length) * 100; return (
{/* Top Hero Section */}
🎯 Seletor IoT Inteligente Espressif

Qual ESP32 Escolher?

Descubra o modelo ideal de ESP32 para o seu projeto com base em conectividade (Wi-Fi 6, Dual-Band, Thread/Matter), periféricos, segurança e consumo elétrico.

{/* Mode Switcher: Wizard vs Direct Parametric Filter */}
{/* 1-CLICK PRESETS BAR */} {mode === "wizard" && !showResults && (

Atalhos Rápidos por Aplicação (1 Clique)

{PRESETS.map((preset) => { const isSelected = activePreset === preset.id; return ( ); })}
)} {/* WIZARD MODE: PROGRESS BAR */} {mode === "wizard" && !showResults && !showSummary && (
Etapa {currentStep + 1} de {questions.length} • {questions[currentStep].id.toUpperCase()} {Math.round(progress)}% Concluído
)} {/* WIZARD STEP 1: Question Card */} {mode === "wizard" && currentStep < questions.length && !showResults && !showSummary && (

{questions[currentStep].question}

{questions[currentStep].description}

{questions[currentStep].options.map((option) => { const isSelected = currentAnswer === option.value; return ( ); })}
{/* Bottom Navigation Buttons */}
)} {/* WIZARD STEP 2: Review Summary */} {mode === "wizard" && showSummary && !showResults && (

Resumo das Especificações do Projeto

Revise suas escolhas abaixo antes de calcular o ranking de compatibilidade com os dados do catálogo de silício.

{/* Double Column summary cards */}
{questions.map((question) => { const answer = answers[question.id]; const selectedOption = question.options.find(opt => opt.value === answer); return (

{question.id.toUpperCase()}

{selectedOption && (
{getOptionIcon(question.id, answer)}
{selectedOption.label}
)}
); })}
)} {/* WIZARD STEP 3: Results Podium & Detailed Cards */} {mode === "wizard" && showResults && recommendations.length > 0 && (
{/* Top Banner with Reset / Re-edit Action */}

Recomendações Geradas com Sucesso

{recommendations.length} modelos compatíveis encontrados no catálogo

{/* Desktop Podium Layout */}
{desktopPodium.map((rec) => { const seriesKey = rec.key; const serie = seriesData[seriesKey]; const matchReasons = allReasons[seriesKey] || []; const chipAlerts = allAlerts[seriesKey] || []; const rankIdx = topThree.findIndex(item => item.key === seriesKey); const rankConfig = [ { badge: "🥇 1º Recomendado", cardClass: "border-amber-500/80 dark:border-amber-400 bg-linear-to-b from-amber-500/10 via-white dark:via-slate-900 to-transparent shadow-[0_0_40px_rgba(245,158,11,0.2)] min-h-[620px] z-10 scale-[1.03]", badgeClass: "text-amber-800 bg-amber-500/15 border-amber-500/30 dark:text-amber-300 dark:bg-amber-500/20", scoreClass: "text-amber-600 dark:text-amber-400" }, { badge: "🥈 2º Recomendado", cardClass: "border-slate-300 dark:border-slate-800 bg-linear-to-b from-slate-500/10 via-white dark:via-slate-900 to-transparent min-h-[580px] opacity-95 hover:opacity-100", badgeClass: "text-slate-700 bg-slate-500/15 border-slate-500/30 dark:text-slate-300 dark:bg-slate-800", scoreClass: "text-slate-600 dark:text-slate-300" }, { badge: "🥉 3º Recomendado", cardClass: "border-amber-800/30 dark:border-slate-800 bg-linear-to-b from-amber-800/10 via-white dark:via-slate-900 to-transparent min-h-[580px] opacity-95 hover:opacity-100", badgeClass: "text-amber-900 bg-amber-800/15 border-amber-800/30 dark:text-amber-400 dark:bg-slate-800", scoreClass: "text-amber-700 dark:text-amber-450" } ][rankIdx]; return (
{/* Top Color Accent Line */}
{rankConfig.badge}
{serie.icone}

{seriesKey}

{serie.nome_completo}

Afinidade: {rec.percentage}% ({rec.score} pts)
{/* Match Advantages */}

Vantagens para seu Projeto

    {matchReasons.slice(0, 3).map((reason, idx) => (
  • {reason}
  • ))}
{/* Alerts / Limitations */} {chipAlerts.length > 0 && (

Pontos de Atenção

    {chipAlerts.slice(0, 2).map((alert, idx) => (
  • • {alert}
  • ))}
)}
{/* Quick Spec Badges */}
Arquitetura {serie.arquitetura.split(" ")[0]} ({serie.nucleos})
Clock Máximo {serie.frequencia}
GPIOs {serie.gpio} pinos
Memória SRAM {serie.memoria_sram}
{/* Ver Documentação CTA Button */}
Ver Documentação Completa
); })}
{/* Mobile Stacked Podium Layout */}

Ranking dos Modelos Recomendados

{topThree.map((rec, index) => { const seriesKey = rec.key; const serie = seriesData[seriesKey]; const matchReasons = allReasons[seriesKey] || []; const chipAlerts = allAlerts[seriesKey] || []; const mobileBadges = ["🥇 1ª Recomendação", "🥈 2ª Recomendação", "🥉 3ª Recomendação"]; const isFirst = index === 0; return (
{mobileBadges[index]} Afinidade: {rec.percentage}%
{serie.icone}

{seriesKey}

{serie.descricao}

{matchReasons.slice(0, 3).map((reason, idx) => (
{reason}
))}
{chipAlerts.length > 0 && (
{chipAlerts.slice(0, 2).map((alert, idx) => (
{alert}
))}
)}
Ver Detalhes do Chip
); })}
{/* Side-by-Side Comparison of Top Recommendations */}

Comparativo Rápido dos Finalistas

Compare as principais especificações técnicas lado a lado

t.key).join(",")}`} className="inline-flex items-center gap-1.5 text-xs font-bold text-purple-600 dark:text-purple-400 hover:text-purple-700 underline" > Abrir Comparador Completo
{topThree.map(rec => ( ))} {topThree.map(rec => ( ))} {topThree.map(rec => ( ))} {topThree.map(rec => ( ))} {topThree.map(rec => ( ))} {topThree.map(rec => ( ))} {topThree.map(rec => ( ))} {topThree.map(rec => ( ))} {topThree.map(rec => ( ))}
Parâmetro {rec.key}
Arquitetura{seriesData[rec.key].arquitetura}
Clock{seriesData[rec.key].frequencia}
Wi-Fi{seriesData[rec.key].wifi}
Bluetooth{seriesData[rec.key].bluetooth}
Matter / 802.15.4{seriesData[rec.key].matter === "Sim" ? "✅ Sim" : "❌ Não"}
Aceleração IA{seriesData[rec.key].aceleradores_ia ? "⚡ Vetorial" : "—"}
PSRAM Externa{seriesData[rec.key].psram_externa || "Não"}
Arduino Core{String(seriesData[rec.key].arduino_core).startsWith("Sim") ? "✅ Suportado" : "⚠️ Apenas ESP-IDF"}
{/* Other Options Grid */} {otherRecommendations.length > 0 && (

Outras Alternativas Avaliadas

{otherRecommendations.map((rec) => { const seriesKey = rec.key; const serie = seriesData[seriesKey]; return (
{serie.icone}

{seriesKey}

Afinidade: {rec.percentage}%
Ver Detalhes
); })}
)} {/* Navigation Actions */}
Comparador Completo
)} {/* WIZARD NO MATCH */} {mode === "wizard" && showResults && recommendations.length === 0 && (

Combinação Extremamente Específica

Não foi possível encontrar um único microcontrolador ESP32 que atenda simultaneamente a todos os requisitos conflitantes. Tente flexibilizar um dos parâmetros ou refazer a seleção.

)} {/* DIRECT PARAMETRIC FILTER MODE */} {mode === "filter" && (
{/* Filter Controls Box */}

Filtro Direto por Recursos de Hardware

Marque os blocos de silício obrigatórios para visualizar instantaneamente os modelos compatíveis.

{/* Filter Chips Grid */}
{[ { key: "wifi6", label: "Wi-Fi 6 (802.11ax)", icon: }, { key: "wifi5ghz", label: "Wi-Fi Dual-Band (5 GHz)", icon: }, { key: "bluetoothClassic", label: "Bluetooth Clássico (A2DP)", icon: }, { key: "leAudio", label: "Bluetooth LE Audio", icon: }, { key: "matter", label: "Matter / 802.15.4", icon: }, { key: "ethernet", label: "Ethernet MAC", icon: }, { key: "aiAccel", label: "Aceleração Vetorial IA", icon: }, { key: "psram", label: "Suporte a PSRAM", icon: }, { key: "mipiDisplayCamera", label: "Telas / Câmeras (MIPI/RGB)", icon: }, { key: "usbOTG", label: "USB Nativo OTG", icon: }, { key: "canBus", label: "Barramento CAN / TWAI", icon: }, { key: "dac", label: "Conversor DAC", icon: }, { key: "touch", label: "Touch Capacitivo", icon: }, { key: "arduinoReady", label: "Suporte Arduino Core", icon: }, { key: "keyManager", label: "Key Manager Hardware", icon: }, ].map(({ key, label, icon }) => { const isActive = filters[key]; return ( ); })}
{/* Results Grid */}

Modelos Compatíveis ({filteredChips.length} de {Object.keys(seriesData).length})

{filteredChips.length > 0 ? (
{filteredChips.map(([seriesKey, serie]) => (
{serie.icone}

{seriesKey}

{serie.nome_completo}

{serie.descricao}

{/* Badges */}
Wi-Fi / BT: {serie.wifi}
Matter/Thread: {serie.matter === "Sim" ? "✅ Sim" : "❌ Não"}
Clock: {serie.frequencia}
GPIOs: {serie.gpio} pinos
PSRAM: {serie.psram_externa || "Não"}
Ver Detalhes do Chip
))}
) : (

Nenhum modelo atende a todos os filtros selecionados

Experimente desmarcar alguns dos filtros mais restritivos (ex: Wi-Fi 5 GHz + Ethernet MAC ao mesmo tempo).

)}
)} {/* FOOTER LINKS / NEXT STEPS */}

Próximos Passos de Desenvolvimento

Catálogo de Placas

Explore placas de desenvolvimento oficiais (DevKit, NodeMCU) e módulos com links seguros e pinouts.

Comparador Lado a Lado

Compare lado a lado matrizes completas de frequência, GPIOs, canais ADC/DAC, consumos e pinouts.

Glossário de Parâmetros

Ficou em dúvida sobre termos de hardware como ULP, SRAM RTC, JTAG ou Matter? Consulte definições rápidas.

); }