diff --git a/app/catalogo/layout.jsx b/app/catalogo/layout.jsx
index 7e7a72c..1e623fd 100644
--- a/app/catalogo/layout.jsx
+++ b/app/catalogo/layout.jsx
@@ -1,10 +1,5 @@
-import { paginaMeta } from "@/lib/seo";
+import { paginaMeta, jsonLd } from "@/lib/seo";
-/**
- * A página desta rota é um client component, e client component não pode
- * exportar metadata. Sem este layout, ela herdaria o título genérico do site,
- * e o Google veria várias páginas com o mesmo título e a mesma descrição.
- */
export const metadata = paginaMeta({
titulo: "Catálogo de placas ESP32",
descricao: "Placas de desenvolvimento com ESP32 disponíveis no Brasil, com filtro por série, conector e conversor USB-serial.",
@@ -13,5 +8,32 @@ export const metadata = paginaMeta({
});
export default function Layout({ children }) {
- return children;
+ return (
+ <>
+
+
+ {children}
+ >
+ );
}
diff --git a/app/comparacao/layout.jsx b/app/comparacao/layout.jsx
index e200741..7d459af 100644
--- a/app/comparacao/layout.jsx
+++ b/app/comparacao/layout.jsx
@@ -1,10 +1,5 @@
-import { paginaMeta } from "@/lib/seo";
+import { paginaMeta, jsonLd } from "@/lib/seo";
-/**
- * A página desta rota é um client component, e client component não pode
- * exportar metadata. Sem este layout, ela herdaria o título genérico do site,
- * e o Google veria várias páginas com o mesmo título e a mesma descrição.
- */
export const metadata = paginaMeta({
titulo: "Comparar séries ESP32",
descricao: "Compare até quatro séries de ESP32 lado a lado: processador, Wi-Fi, Bluetooth, memória, GPIO, periféricos e segurança em hardware, com os dados dos datasheets oficiais.",
@@ -12,6 +7,54 @@ export const metadata = paginaMeta({
keywords: ["comparar ESP32", "ESP32 vs ESP32-S3", "tabela comparativa ESP32", "qual ESP32 é melhor"],
});
+const faqs = [
+ {
+ pergunta: "Como comparar microcontroladores ESP32 lado a lado?",
+ resposta: "O comparador do ESPDocs permite selecionar até quatro séries simultaneamente para confrontar arquitetura, frequência de clock, memória SRAM/PSRAM, padrões de rádio (Wi-Fi 4/6, Bluetooth 5/6, 802.15.4), interfaces de periféricos e blocos de segurança em hardware.",
+ },
+ {
+ pergunta: "Qual a diferença entre o ESP32 clássico e o ESP32-S3?",
+ resposta: "O ESP32 clássico usa núcleos Xtensa LX6 e Bluetooth clássico/LE. O ESP32-S3 traz núcleos Xtensa LX7 com instruções vetoriais para inteligência artificial (TinyML), USB nativo OTG, mais GPIOs (45 contra 36) e Bluetooth 5.0 LE.",
+ },
+ {
+ pergunta: "Qual a diferença entre ESP32-C3 e ESP32-C6?",
+ resposta: "O ESP32-C3 é um microcontrolador RISC-V com Wi-Fi 4 e Bluetooth 5 LE. O ESP32-C6 evolui para Wi-Fi 6 (802.11ax), Bluetooth 5.4 LE, rádio IEEE 802.15.4 para Zigbee 3.0 e Thread 1.3, além de coprocessador de ultrabaixo consumo.",
+ },
+];
+
export default function Layout({ children }) {
- return children;
+ return (
+ <>
+
+
+
+ {children}
+ >
+ );
}
diff --git a/app/diagnostico/layout.jsx b/app/diagnostico/layout.jsx
new file mode 100644
index 0000000..da571f7
--- /dev/null
+++ b/app/diagnostico/layout.jsx
@@ -0,0 +1,75 @@
+import { paginaMeta, jsonLd } from "@/lib/seo";
+
+export const metadata = paginaMeta({
+ titulo: "Diagnóstico de Erros Comuns no ESP32: Guia Profissional",
+ descricao: "Guia técnico definitivo para identificar e resolver Brownout, Guru Meditation, Task Watchdog, Stack Overflow, vazamento de memória e falhas de boot no ESP32 (Arduino e ESP-IDF).",
+ caminho: "/diagnostico",
+ keywords: [
+ "erros comuns ESP32",
+ "brownout detector was triggered",
+ "guru meditation error",
+ "task watchdog got triggered",
+ "stack canary watchpoint triggered",
+ "como debugar ESP32",
+ "ESP32 reiniciando em loop",
+ "failed to connect to esp32",
+ ],
+});
+
+const faqs = [
+ {
+ pergunta: "O que causa o erro 'Brownout detector was triggered' no ESP32?",
+ resposta: "Ocorre quando a tensão no pino 3V3 cai abaixo de 2.8V ~ 2.43V devido a picos rápidos de corrente do rádio Wi-Fi/BLE (superando 500mA), cabos USB finos ou regulador LDO inadequado. A solução de engenharia envolve adicionar capacitores Low-ESR de 10µF a 100µF próximos ao VCC e usar LDOs robustos de 600mA+.",
+ },
+ {
+ pergunta: "Como resolver o 'Guru Meditation Error (LoadProhibited)'?",
+ resposta: "LoadProhibited indica tentativa de acessar um ponteiro nulo (NULL) ou inválido na memória. A solução consiste em usar o Espressif Exception Decoder ou addr2line para localizar a linha exata no código e implementar validações defensivas como if (ponteiro != NULL).",
+ },
+ {
+ pergunta: "Por que o Task Watchdog Timer (TWDT) dispara no FreeRTOS?",
+ resposta: "O TWDT dispara quando uma tarefa de prioridade maior monopoliza a CPU em um loop bloqueante (ex: while(1) sem vTaskDelay), impedindo a tarefa IDLE de alimentar o watchdog do sistema operacional.",
+ },
+ {
+ pergunta: "Por que conexões HTTPS e TLS falham com código -0x2700 no ESP32?",
+ resposta: "Porque ao ligar, o ESP32 inicia o relógio interno no ano de 1970. O validador de certificados TLS considera o certificado do servidor inválido por estar no 'futuro'. Sincronizar o relógio via SNTP (configTime) antes da conexão resolve o problema.",
+ },
+];
+
+export default function DiagnosticoLayout({ children }) {
+ return (
+ <>
+
+
+
+ {children}
+ >
+ );
+}
diff --git a/app/diagnostico/page.jsx b/app/diagnostico/page.jsx
new file mode 100644
index 0000000..48ff7e7
--- /dev/null
+++ b/app/diagnostico/page.jsx
@@ -0,0 +1,820 @@
+"use client";
+
+import { useState, useMemo, useRef } from "react";
+import Header from "@/components/Header";
+import Footer from "@/components/Footer";
+import Link from "next/link";
+import {
+ categoriasDiagnostico,
+ sintomasRapidos,
+ errosCatalogo,
+ regrasDecodificadorLog,
+} from "@/lib/diagnosticoData";
+import {
+ AlertTriangle,
+ Zap,
+ Cpu,
+ Layers,
+ Activity,
+ Terminal,
+ Wifi,
+ Search,
+ CheckCircle2,
+ XCircle,
+ Copy,
+ Check,
+ Sparkles,
+ HelpCircle,
+ ArrowRight,
+ ExternalLink,
+ ShieldAlert,
+ Wrench,
+ Code2,
+ ChevronDown,
+ ChevronUp,
+ X,
+ Filter,
+ RotateCcw,
+ Tag,
+} from "lucide-react";
+
+export default function DiagnosticoPage() {
+ const [termoBusca, setTermoBusca] = useState("");
+ const [categoriaAtiva, setCategoriaAtiva] = useState("todos");
+ const [sintomaAtivo, setSintomaAtivo] = useState(null);
+ const [cardAberto, setCardAberto] = useState(null);
+ const [linguagemCodigo, setLinguagemCodigo] = useState({}); // { [id]: 'arduino' | 'espidf' }
+ const [copiadoId, setCopiadoId] = useState(null);
+ const searchInputRef = useRef(null);
+
+ // Estado do Analisador de Logs
+ const [logInput, setLogInput] = useState("");
+ const [resultadoLog, setResultadoLog] = useState(null);
+
+ // Mapeamento de ícones e emojis por categoria
+ const iconMap = {
+ Zap: ,
+ Cpu: ,
+ Layers: ,
+ Activity: ,
+ Terminal: ,
+ Wifi: ,
+ };
+
+ const emojiMap = {
+ alimentacao: "⚡",
+ "cpu-panics": "💥",
+ freertos: "🐕",
+ memoria: "💾",
+ "boot-flash": "🔌",
+ conectividade: "📡",
+ };
+
+ // Função de Análise do Log
+ const analisarLog = (texto) => {
+ setLogInput(texto);
+ if (!texto || texto.trim() === "") {
+ setResultadoLog(null);
+ return;
+ }
+
+ for (const regra of regrasDecodificadorLog) {
+ if (regra.padrao.test(texto)) {
+ setResultadoLog(regra);
+ return;
+ }
+ }
+
+ setResultadoLog({
+ titulo: "Padrão de erro não categorizado automaticamente",
+ tipo: "Desconhecido",
+ explicacao:
+ "Não identificamos uma assinatura clássica de Guru Meditation ou Brownout neste trecho. Verifique se a taxa de baud rate (ex: 115200) está correta e se o cabeçalho 'rst:' ou 'panic' está presente.",
+ acaoRecomendada:
+ "Procure por palavras-chave como 'Guru Meditation', 'rst:', 'LoadProhibited', 'watchdog' ou 'panic' no console serial.",
+ });
+ };
+
+ const copiarParaClipboard = (texto, id) => {
+ navigator.clipboard.writeText(texto);
+ setCopiadoId(id);
+ setTimeout(() => setCopiadoId(null), 2000);
+ };
+
+ // Filtragem dos erros
+ const errosFiltrados = useMemo(() => {
+ const termo = termoBusca.toLowerCase().trim();
+ return errosCatalogo.filter((erro) => {
+ const matchCategoria =
+ categoriaAtiva === "todos" || erro.categoria === categoriaAtiva;
+ const matchSintoma =
+ !sintomaAtivo || erro.sintomas.includes(sintomaAtivo);
+ const matchBusca =
+ !termo ||
+ erro.titulo.toLowerCase().includes(termo) ||
+ erro.resumo.toLowerCase().includes(termo) ||
+ erro.causaRaiz.toLowerCase().includes(termo) ||
+ erro.logSerial.toLowerCase().includes(termo);
+
+ return matchCategoria && matchSintoma && matchBusca;
+ });
+ }, [categoriaAtiva, sintomaAtivo, termoBusca]);
+
+ const temFiltroAtivo =
+ termoBusca.trim() !== "" ||
+ categoriaAtiva !== "todos" ||
+ sintomaAtivo !== null;
+
+ const limparTodosFiltros = () => {
+ setTermoBusca("");
+ setCategoriaAtiva("todos");
+ setSintomaAtivo(null);
+ searchInputRef.current?.focus();
+ };
+
+ const toggleCard = (id) => {
+ setCardAberto((prev) => (prev === id ? null : id));
+ };
+
+ const setLang = (id, lang) => {
+ setLinguagemCodigo((prev) => ({ ...prev, [id]: lang }));
+ };
+
+ const catAtivaObj = categoriasDiagnostico.find((c) => c.id === categoriaAtiva);
+ const sintomaAtivoObj = sintomasRapidos.find((s) => s.id === sintomaAtivo);
+
+ return (
+
+
+
+
+ {/* Hero Section */}
+
+
+
+
+ Debugging & Engenharia de Firmware
+
+
+
+
+ Diagnóstico & Erros Comuns
+
+
+
+ Guia técnico definitivo para diagnosticar Brownout,{" "}
+ Guru Meditation, Watchdog Timeouts,{" "}
+ Stack Overflow e falhas de hardware no ESP32. Entenda a causa raiz no silício e aplique soluções profissionais.
+
+
+
+ Baseado no artigo publicado no{" "}
+
+ Ciência Embarcada
+
+
+ , ampliado com novos cenários e decodificador interativo.
+
+
+
+ {/* 1. DECODIFICADOR RÁPIDO DE LOG SERIAL */}
+
+
+
+
+
+
+
+
+ Decodificador Rápido de Log Serial
+
+
+ Cole o trecho do monitor serial para diagnosticar a falha instantaneamente.
+
+
+
+
+ {/* Exemplos Rápidos para Teste */}
+
+
+ Exemplos:
+
+
+
+
+
+
+
+
+
+
+
+ {/* Card de Resultado da Análise */}
+ {resultadoLog && (
+
+
+ {/* Bloco de Código (Arduino IDE vs ESP-IDF) */}
+
+
+
+
+
+
+
+
+
+
+
+ {codigoAtual}
+
+
+
+ {/* Dica Pro */}
+
+
+
+ Dica Pro de Engenharia: {erro.dicaPro}
+
+
+
+ )}
+
+ );
+ })
+ )}
+
+
+ {/* 4. CHECKLIST DE PREVENÇÃO EM HARDWARE E FIRMWARE */}
+
+
+
+
+
+
+
+ Checklist de Prevenção para Produção
+
+
+ Itens essenciais para validar antes de enviar seu hardware ou firmware para campo.
+
+
+
+
+
+
+
+ Checklist de Hardware & Alimentação
+
+
+
+
+ Capacitor de 10µF ~ 100µF Low-ESR no VCC + cerâmico de 100nF próximo ao chip.
+
+
+
+ LDO dimensionado para suportar picos de corrente de no mínimo 600mA a 1A com folga térmica.
+
+
+
+ Nenhum periférico forçando níveis lógicos em Strapping Pins no momento do boot.
+
+
+
+ Capacitor de 10µF ou 1µF no pino EN (RST) para auto-reset estável no upload.
+
+
+
+
+
+
+ Checklist de Firmware & FreeRTOS
+
+
+
+
+ Todas as tarefas FreeRTOS cedem CPU através de vTaskDelay ou filas/semáforos.
+
+
+
+ Todas as ISRs decoradas com `IRAM_ATTR` e sem chamadas bloqueantes.
+
+
+
+ Sem uso contínuo de objetos `String` do Arduino em loops para evitar fragmentação de Heap.
+
+
+
+ Sincronização de horário SNTP antes de iniciar conexões criptografadas TLS/HTTPS.
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/app/glossario/layout.jsx b/app/glossario/layout.jsx
new file mode 100644
index 0000000..aa8c955
--- /dev/null
+++ b/app/glossario/layout.jsx
@@ -0,0 +1,54 @@
+import { paginaMeta, jsonLd } from "@/lib/seo";
+import { categoriasGlossario } from "@/lib/glossarioData";
+
+export const metadata = paginaMeta({
+ titulo: "Glossário Técnico do ESP32: Termos e Conceitos",
+ descricao: "Mais de 50 termos e conceitos essenciais do ecossistema ESP32 explicados em português: GPIO, Strapping Pins, ULP, PSRAM, FreeRTOS, eFuse, Deep Sleep, OTA, Secure Boot, ECDSA, Matter e Thread.",
+ caminho: "/glossario",
+ keywords: [
+ "glossário ESP32",
+ "o que é GPIO",
+ "o que é strapping pins",
+ "o que é ULP ESP32",
+ "o que é PSRAM ESP32",
+ "termos técnicos microcontrolador",
+ "conceitos ESP32 português",
+ ],
+});
+
+export default function GlossarioLayout({ children }) {
+ return (
+ <>
+
+
+
+ {children}
+ >
+ );
+}
diff --git a/app/glossario/page.jsx b/app/glossario/page.jsx
index a11d793..4be5298 100644
--- a/app/glossario/page.jsx
+++ b/app/glossario/page.jsx
@@ -1,534 +1,577 @@
-import { paginaMeta, jsonLd } from "@/lib/seo";
+"use client";
+
+import { useState, useMemo, useRef } from "react";
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import Link from "next/link";
+import { categoriasGlossario } from "@/lib/glossarioData";
+import {
+ BookOpen,
+ Search,
+ Cpu,
+ Database,
+ Wifi,
+ Sliders,
+ Sparkles,
+ BatteryCharging,
+ Code2,
+ Link2,
+ Check,
+ ArrowRight,
+ Lightbulb,
+ HelpCircle,
+ X,
+ SlidersHorizontal,
+ Filter,
+ RotateCcw,
+ Tag,
+ ShieldCheck,
+} from "lucide-react";
+export default function GlossarioPage() {
+ const [busca, setBusca] = useState("");
+ const [categoriaSelecionada, setCategoriaSelecionada] = useState("todas");
+ const [letraFiltro, setLetraFiltro] = useState(null);
+ const [copiadoSlug, setCopiadoSlug] = useState(null);
+ const searchInputRef = useRef(null);
-export const metadata = paginaMeta({
- titulo: "Glossário técnico do ESP32",
- descricao: "Mais de 40 termos do ecossistema ESP32 explicados em português: GPIO, strapping, ULP, PSRAM, eFuse, deep sleep, OTA, Secure Boot, ECDSA, TWAI, Matter e Thread.",
- caminho: "/glossario",
- keywords: ["glossário ESP32", "o que é GPIO", "o que é strapping", "o que é ULP", "termos ESP32"],
-});
+ // Sugestões populares para busca rápida
+ const buscasPopulares = [
+ { rotulo: "GPIO", emoji: "🔌" },
+ { rotulo: "ULP", emoji: "⚡" },
+ { rotulo: "PSRAM", emoji: "💾" },
+ { rotulo: "Strapping Pins", emoji: "🚀" },
+ { rotulo: "Deep Sleep", emoji: "🔋" },
+ { rotulo: "OTA", emoji: "📡" },
+ { rotulo: "Matter", emoji: "🌐" },
+ { rotulo: "Secure Boot", emoji: "🔒" },
+ { rotulo: "Wi-Fi 6", emoji: "📶" },
+ { rotulo: "MIPI", emoji: "✨" },
+ ];
-export default function Glossario() {
- const categorias = [
- {
- nome: "Processamento",
- icone: "🧠",
- cor: "blue",
- termos: [
- {
- termo: "Arquitetura",
- definicao: "Conjunto de instruções e design do processador. O ESP32 usa principalmente Xtensa (32-bit) ou RISC-V.",
- exemplo: "ESP32 clássico usa Xtensa LX6, enquanto ESP32-C3 usa RISC-V.",
- },
- {
- termo: "Núcleos (Cores)",
- definicao: "Unidades de processamento independentes. Dual-core permite executar duas tarefas simultaneamente.",
- exemplo: "ESP32 tem 2 núcleos (dual-core), ESP32-S2 tem 1 núcleo (single-core).",
- },
- {
- termo: "Frequência (Clock)",
- definicao: "Velocidade de processamento medida em MHz ou GHz. Quanto maior, mais rápido o processamento.",
- exemplo: "ESP32 opera de 80 MHz até 240 MHz.",
- },
- {
- termo: "ULP (Ultra Low Power) Coprocessador",
- definicao: "Processador secundário de baixíssimo consumo que pode operar enquanto o processador principal está em deep sleep.",
- exemplo: "Usado para ler sensores periodicamente sem despertar o CPU principal.",
- },
- {
- termo: "Aceleradores de IA",
- definicao: "Hardware dedicado para acelerar operações de inteligência artificial e redes neurais.",
- exemplo: "ESP32-P4 possui Vector Extension para processamento de IA.",
- },
- {
- termo: "Aceleradores Criptográficos",
- definicao: "Blocos de hardware dedicados que executam algoritmos de criptografia muito mais rápido e com menor consumo do que a CPU. Praticamente toda série tem algum, mas o conjunto varia bastante, por isso vale olhar item por item.",
- exemplo: "ESP32-C2 e ESP32-C61 não têm acelerador AES: só SHA e curvas elípticas.",
- },
- {
- termo: "ECC (Criptografia de Curvas Elípticas)",
- definicao: "Família de algoritmos de chave pública que atinge a mesma segurança do RSA com chaves muito menores, o que economiza memória e tempo em microcontrolador. As curvas usadas são identificadas por nome, como P-256.",
- exemplo: "ESP32, ESP32-S2, ESP32-S3 e ESP32-C3 não têm ECC em hardware; ESP32-C5, P4, S31 e H4 chegam à curva P-384.",
- },
- {
- termo: "ECDSA",
- definicao: "Algoritmo de assinatura digital baseado em curvas elípticas. Ter o periférico ECDSA no silício significa assinar e verificar sem carregar a CPU. É o que o Matter exige para o atestado de dispositivo.",
- exemplo: "Só ESP32-S31, C5, C61, P4, H2 e H4 têm ECDSA em hardware.",
- },
- {
- termo: "Key Manager",
- definicao: "Periférico que provisiona e usa chaves criptográficas sem que elas fiquem legíveis para o firmware. Mesmo que alguém extraia a imagem do firmware, a chave privada não está lá.",
- exemplo: "Disponível apenas no ESP32-S31, ESP32-C5 e ESP32-P4.",
- },
- {
- termo: "Secure Boot",
- definicao: "Verificação da assinatura do firmware durante o boot: o chip se recusa a executar código que não tenha sido assinado pela sua chave. A versão V2 usa RSA-3072 ou ECDSA; a V1, do ESP32 original, é um esquema mais antigo.",
- exemplo: "ESP32 tem apenas o Secure Boot V1; do ESP32-S2 em diante todos têm V2.",
- },
- {
- termo: "Criptografia de Flash",
- definicao: "Cifra o conteúdo da memória flash externa, impedindo que alguém leia o firmware soldando um gravador no chip de memória. O esquema atual usa XTS-AES.",
- exemplo: "XTS-AES-128 na maioria das séries; ESP32-S2, S3, S31, C5, P4 e H4 também suportam XTS-AES-256.",
- },
- {
- termo: "Assinatura Digital (DS)",
- definicao: "Periférico que assina dados usando uma chave RSA guardada em eFuse de forma que o firmware nunca a enxerga. É o antecessor mais simples do Key Manager.",
- exemplo: "Ausente no ESP32 original, no C2, no C61 e no H4.",
- },
- {
- termo: "Proteção contra DPA",
- definicao: "Defesa contra Differential Power Analysis, ataque que deduz a chave secreta medindo variações no consumo de energia do chip durante a operação criptográfica. Exige acesso físico ao dispositivo.",
- exemplo: "Presente no ESP32-C5, C6, C61 e H2.",
- },
- ],
- },
- {
- nome: "Memória",
- icone: "💾",
- cor: "purple",
- termos: [
- {
- termo: "SRAM (Static RAM)",
- definicao: "Memória volátil rápida usada para armazenar variáveis e stack do programa durante execução. Perde dados ao desligar.",
- exemplo: "ESP32 tem 520 KB de SRAM interna.",
- },
- {
- termo: "ROM (Read-Only Memory)",
- definicao: "Memória não-volátil com bootloader e funções básicas gravadas pela Espressif. Não pode ser alterada.",
- exemplo: "ESP32 tem 448 KB de ROM com código de boot.",
- },
- {
- termo: "Flash",
- definicao: "Memória não-volátil externa onde o firmware é armazenado. Mantém dados mesmo sem energia.",
- exemplo: "Placas comuns vêm com 4 MB ou 16 MB de Flash.",
- },
- {
- termo: "PSRAM (Pseudo-Static RAM)",
- definicao: "Memória RAM externa adicional para aplicações que precisam de mais memória (imagens, buffers grandes).",
- exemplo: "ESP32-CAM usa PSRAM de 4 MB ou 8 MB para armazenar frames de câmera.",
- },
- {
- termo: "RTC Memory",
- definicao: "Pequena quantidade de SRAM que mantém dados durante deep sleep, alimentada pelo RTC.",
- exemplo: "Usar RTC memory para guardar contador entre deep sleeps.",
- },
- ],
- },
- {
- nome: "Conectividade",
- icone: "📡",
- cor: "green",
- termos: [
- {
- termo: "Wi-Fi",
- definicao: "Comunicação sem fio padrão IEEE 802.11. ESP32 suporta 2.4 GHz (b/g/n), algumas séries suportam 5 GHz.",
- exemplo: "Conectar ESP32 à rede doméstica para IoT.",
- },
- {
- termo: "Bluetooth Classic",
- definicao: "Protocolo Bluetooth para transmissão de áudio e dados. Maior consumo que BLE.",
- exemplo: "Caixas de som Bluetooth, transmissão de áudio.",
- },
- {
- termo: "BLE (Bluetooth Low Energy)",
- definicao: "Versão de baixo consumo do Bluetooth, ideal para sensores e wearables.",
- exemplo: "Rastreadores, sensores de temperatura, smartwatches.",
- },
- {
- termo: "Zigbee",
- definicao: "Protocolo de mesh network de baixo consumo para automação residencial (IEEE 802.15.4).",
- exemplo: "Redes de sensores domésticos, lâmpadas inteligentes.",
- },
- {
- termo: "Thread",
- definicao: "Protocolo de mesh network baseado em IPv6 para dispositivos IoT.",
- exemplo: "Smart home devices com Matter.",
- },
- {
- termo: "Matter",
- definicao: "Padrão universal de smart home que funciona sobre Thread ou Wi-Fi, compatível com Alexa, Google Home, Apple Home.",
- exemplo: "Tomadas, lâmpadas e sensores compatíveis com todos os assistentes.",
- },
- ],
- },
- {
- nome: "Periféricos",
- icone: "🔌",
- cor: "orange",
- termos: [
- {
- termo: "GPIO (General Purpose Input/Output)",
- definicao: "Pinos configuráveis como entrada ou saída digital para conectar LEDs, botões, sensores.",
- exemplo: "GPIO2 geralmente é usado para LED onboard.",
- },
- {
- termo: "ADC (Analog-to-Digital Converter)",
- definicao: "Converte sinais analógicos (0-3.3V) em valores digitais para leitura de sensores analógicos.",
- exemplo: "Ler potenciômetro, sensor de luz LDR, tensão de bateria.",
- },
- {
- termo: "DAC (Digital-to-Analog Converter)",
- definicao: "Converte valores digitais em voltagem analógica (0-3.3V).",
- exemplo: "Gerar ondas de áudio, controle analógico de motores.",
- },
- {
- termo: "PWM (Pulse Width Modulation)",
- definicao: "Técnica para simular saída analógica variando a largura de pulsos digitais. Controla brilho, velocidade, etc.",
- exemplo: "Controlar brilho de LED, velocidade de motor DC.",
- },
- {
- termo: "Touch Capacitivo",
- definicao: "Sensores que detectam toque humano por mudança de capacitância, sem necessidade de botões físicos.",
- exemplo: "Botões touch, sliders, controles sensíveis ao toque.",
- },
- {
- termo: "UART (Universal Asynchronous Receiver/Transmitter)",
- definicao: "Comunicação serial assíncrona para trocar dados com módulos GPS, sensores, debug serial.",
- exemplo: "Monitor Serial da Arduino IDE usa UART.",
- },
- {
- termo: "SPI (Serial Peripheral Interface)",
- definicao: "Barramento serial síncrono de alta velocidade para displays, cartões SD, sensores.",
- exemplo: "Display TFT, módulo SD Card, sensor BME280.",
- },
- {
- termo: "I²C (Inter-Integrated Circuit)",
- definicao: "Barramento serial de 2 fios para conectar múltiplos dispositivos com endereços únicos.",
- exemplo: "Sensores BME280, displays OLED, RTC DS3231.",
- },
- {
- termo: "I²S (Inter-IC Sound)",
- definicao: "Interface para transmissão de áudio digital entre circuitos integrados.",
- exemplo: "Módulos de áudio MAX98357, microfones MEMS.",
- },
- ],
- },
- {
- nome: "Interfaces Especiais",
- icone: "✨",
- cor: "pink",
- termos: [
- {
- termo: "USB OTG (On-The-Go)",
- definicao: "Permite que ESP32 funcione como dispositivo USB (teclado, mouse, pen drive) ou host USB.",
- exemplo: "ESP32-S3 pode emular teclado USB ou ler pen drive.",
- },
- {
- termo: "JTAG",
- definicao: "Interface de debug e programação de baixo nível para desenvolvimento profissional.",
- exemplo: "Debug passo-a-passo com ESP-Prog ou J-Link.",
- },
- {
- termo: "SDIO (Secure Digital Input Output)",
- definicao: "Interface para cartões SD em modo de 4 bits de alta velocidade.",
- exemplo: "Gravar logs, armazenar fotos de câmera.",
- },
- {
- termo: "Ethernet MAC",
- definicao: "Controlador de rede Ethernet embutido. Requer PHY externo (chip LAN8720).",
- exemplo: "ESP32 com conexão Ethernet cabeada para IoT industrial.",
- },
- {
- termo: "Camera Interface",
- definicao: "Interface paralela para conectar câmeras (geralmente OV2640, OV5640).",
- exemplo: "ESP32-CAM, projetos de visão computacional.",
- },
- {
- termo: "LCD Interface",
- definicao: "Interface paralela RGB para displays LCD de alta resolução.",
- exemplo: "ESP32-S3 com display TFT 480x320 RGB.",
- },
- {
- termo: "MIPI CSI/DSI",
- definicao: "Interfaces de alta velocidade para câmeras (CSI) e displays (DSI) em aplicações avançadas.",
- exemplo: "ESP32-P4 com câmera MIPI de alta resolução.",
- },
- ],
- },
- {
- nome: "Gerenciamento de Energia",
- icone: "🔋",
- cor: "yellow",
- termos: [
- {
- termo: "Active Mode",
- definicao: "Modo de operação normal com CPU e periféricos funcionando. Maior consumo de energia.",
- exemplo: "ESP32 processando dados Wi-Fi: ~160-260 mA.",
- },
- {
- termo: "Modem Sleep",
- definicao: "CPU ativo mas Wi-Fi/Bluetooth desligados quando não há transmissão. Economia moderada.",
- exemplo: "Aplicações com comunicação intermitente.",
- },
- {
- termo: "Light Sleep",
- definicao: "CPU pausado mas RAM e RTC mantidos. Acorda rapidamente por timer ou GPIO.",
- exemplo: "Sensor que verifica dados a cada 1 segundo: ~0.8 mA.",
- },
- {
- termo: "Deep Sleep",
- definicao: "Tudo desligado exceto RTC e ULP. Consumo ultra baixo (~10 μA). Perde variáveis da RAM.",
- exemplo: "Sensor que envia dados a cada 1 hora e dorme entre envios.",
- },
- {
- termo: "Hibernation",
- definicao: "Modo mais profundo que deep sleep, desliga até RTC. Apenas timer ou reset externo acordam.",
- exemplo: "Dispositivo sazonal que acorda 1x por dia: ~5 μA.",
- },
- {
- termo: "Brownout Detector",
- definicao: "Circuito que reseta o ESP32 se a tensão cair abaixo de nível seguro (~2.8V) para evitar corrupção.",
- exemplo: "Proteção contra queda de tensão da fonte/bateria.",
- },
- ],
- },
- {
- nome: "Boot e Programação",
- icone: "🚀",
- cor: "red",
- termos: [
- {
- termo: "Bootloader",
- definicao: "Programa na ROM que inicia ao ligar e carrega o firmware da Flash para execução.",
- exemplo: "Primeiro código que roda ao dar power-on no ESP32.",
- },
- {
- termo: "Strapping Pins",
- definicao: "GPIOs lidos durante boot para definir modo de operação (flash, boot normal, etc). Cuidado ao usar!",
- exemplo: "GPIO0=LOW entra em modo flash. GPIO2, GPIO12, GPIO15 também são strapping pins.",
- },
- {
- termo: "Flash Mode",
- definicao: "Modo especial onde ESP32 aguarda upload de firmware via UART. Ativado por GPIO0=LOW + Reset.",
- exemplo: "Pressionar botão BOOT durante upload na Arduino IDE.",
- },
- {
- termo: "OTA (Over-The-Air)",
- definicao: "Atualização de firmware sem fio via Wi-Fi, sem necessidade de cabo USB.",
- exemplo: "Atualizar firmware de dispositivo instalado no teto.",
- },
- {
- termo: "Partições",
- definicao: "Divisões da Flash para armazenar bootloader, app, OTA, SPIFFS, NVS.",
- exemplo: "Partição de 3 MB para app, 1 MB para SPIFFS (sistema de arquivos).",
- },
- {
- termo: "NVS (Non-Volatile Storage)",
- definicao: "Área da Flash para armazenar configurações persistentes em formato chave-valor.",
- exemplo: "Salvar SSID e senha do Wi-Fi para reconectar após reboot.",
- },
- {
- termo: "SPIFFS / LittleFS",
- definicao: "Sistemas de arquivos para Flash, permitem armazenar arquivos (HTML, configs, logs).",
- exemplo: "Armazenar páginas HTML de servidor web no ESP32.",
- },
- ],
- },
- {
- nome: "Conceitos de Hardware",
- icone: "⚙️",
- cor: "gray",
- termos: [
- {
- termo: "Module vs Chip",
- definicao: "Chip é o processador ESP32 puro. Module inclui chip + Flash + antena em PCB certificado (ESP32-WROOM-32).",
- exemplo: "Comprar módulo WROOM é mais fácil que soldar chip ESP32 bruto.",
- },
- {
- termo: "DevKit / Development Board",
- definicao: "Placa com módulo ESP32 + conversor USB-Serial + regulador de tensão + pinos expostos para prototipagem.",
- exemplo: "ESP32-DevKitC, NodeMCU-32S.",
- },
- {
- termo: "Pinout",
- definicao: "Diagrama mostrando função de cada pino físico do chip/módulo.",
- exemplo: "Ver pinout para saber qual GPIO suporta ADC.",
- },
- {
- termo: "Pull-up / Pull-down",
- definicao: "Resistores internos que mantém GPIO em nível HIGH (pull-up) ou LOW (pull-down) quando não conectado.",
- exemplo: "GPIO com pull-up para botão que conecta ao GND.",
- },
- {
- termo: "Input-Only GPIO",
- definicao: "Alguns GPIOs (34-39 no ESP32 clássico) só funcionam como entrada, não como saída.",
- exemplo: "GPIO36 (VP) pode ler ADC mas não controlar LED.",
- },
- {
- termo: "Certificação (FCC/CE)",
- definicao: "Aprovação regulatória para vender produtos com rádio. Módulos pré-certificados simplificam o processo.",
- exemplo: "Usar ESP32-WROOM-32 (certificado) facilita venda comercial.",
- },
- ],
- },
- ];
+ // Mapeamento de ícones por nome
+ const iconMap = {
+ Cpu: ,
+ Database: ,
+ Wifi: ,
+ Sliders: ,
+ Sparkles: ,
+ BatteryCharging: ,
+ Code2: ,
+ ShieldCheck: ,
+ };
- return (
-
- {/* Cada verbete vira um DefinedTerm: ajuda o Google a responder
- buscas do tipo "o que é strapping ESP32" apontando para cá. */}
-
-
+ // Lista de todos os termos com metadados de categoria
+ const todosOsTermos = useMemo(() => {
+ return categoriasGlossario.flatMap((cat) =>
+ cat.termos.map((t) => ({
+ ...t,
+ categoriaId: cat.id,
+ categoriaNome: cat.nome,
+ categoriaCor: cat.cor,
+ categoriaIcone: cat.icone,
+ categoriaEmoji: cat.emoji,
+ slug: t.termo.toLowerCase().replace(/[\s()/²]+/g, "-"),
+ primeiraLetra: t.termo.charAt(0).toUpperCase(),
+ }))
+ );
+ }, []);
-
+ // Todas as letras do alfabeto de A a Z com indicador de existência de termos
+ const alfabeto = useMemo(() => {
+ const letras = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
+ const setDisponivel = new Set(
+ todosOsTermos.map((t) => t.termo.charAt(0).toUpperCase())
+ );
+ return letras.map((letra) => ({
+ letra,
+ temTermos: setDisponivel.has(letra),
+ }));
+ }, [todosOsTermos]);
-
- {/* Hero Section */}
-
-
+ Agora que você domina os conceitos técnicos, compare as especificações das séries ou use o seletor inteligente para encontrar o microcontrolador ideal para seu projeto.
+
+ );
+}
+
+/**
+ * Função utilitária que detecta nomes de séries do ESP32 dentro do texto e os converte em links clicáveis.
+ */
+function TextoComLinks({ texto }) {
+ if (!texto) return null;
+ const seriesKeys = [
+ "ESP32-S31",
+ "ESP32-C61",
+ "ESP32-S2",
+ "ESP32-S3",
+ "ESP32-C2",
+ "ESP32-C3",
+ "ESP32-C5",
+ "ESP32-C6",
+ "ESP32-P4",
+ "ESP32-H2",
+ "ESP32-H4",
+ "ESP32",
+ ];
+ const regex = new RegExp(`\\b(${seriesKeys.join("|")})\\b`, "g");
+ const partes = texto.split(regex);
+
+ return (
+ <>
+ {partes.map((parte, i) => {
+ if (seriesKeys.includes(parte)) {
+ return (
+
+ {parte}
+
+ );
+ }
+ return parte;
+ })}
+ >
+ );
}
\ No newline at end of file
diff --git a/app/page.jsx b/app/page.jsx
index bc66668..3a89c08 100644
--- a/app/page.jsx
+++ b/app/page.jsx
@@ -5,81 +5,197 @@ import Image from "next/image";
import {
SlidersHorizontal,
ShoppingBag,
- Table2,
Cpu,
Layers,
Scale,
- FileText,
- Code,
- RefreshCw,
- Globe,
- ArrowRight,
- Terminal,
+ BookOpen,
+ AlertTriangle,
+ Terminal,
Compass,
- Info
+ ArrowRight,
+ Sparkles,
+ CheckCircle2,
+ Zap,
+ ExternalLink,
+ Info,
+ Radio,
+ ShieldCheck,
+ Code,
+ HelpCircle
} from "lucide-react";
export default function Home() {
- const resources = [
+ // Estatísticas da Plataforma
+ const stats = [
+ { value: "12", label: "Séries Documentadas", desc: "Do ESP32 clássico ao P4 e C61" },
+ { value: "8", label: "Frameworks & SDKs", desc: "ESP-IDF, Arduino, MicroPython, etc." },
+ { value: "30+", label: "Guias de Diagnóstico", desc: "Soluções para bootloops, brownouts e WDT" },
+ { value: "60+", label: "Termos Técnicos", desc: "Glossário completo de arquitetura e IoT" },
+ ];
+
+ // Ferramentas da Plataforma (100% Clicáveis)
+ const tools = [
{
- name: "Seletor Inteligente",
- description: "Responda perguntas rápidas sobre seu projeto e descubra a série ESP32 ideal em segundos.",
+ title: "Seletor Inteligente",
+ badge: "Recomendado",
+ badgeColor: "bg-purple-100 text-purple-700 dark:bg-purple-950/60 dark:text-purple-300",
+ description: "Responda algumas perguntas sobre seu projeto e descubra o chip ESP32 ideal com análise técnica e justificativa.",
+ href: "/seletor",
icon: ,
- colorClass: "text-purple-600 bg-purple-50 dark:bg-purple-950/40 dark:text-purple-400"
+ iconBg: "text-purple-600 bg-purple-50 dark:bg-purple-950/40 dark:text-purple-400",
+ ctaText: "Iniciar Quiz de Seleção",
},
{
- name: "Catálogo de Placas",
- description: "Encontre placas de desenvolvimento ESP32 verificadas com filtros avançados e links seguros.",
- icon: ,
- colorClass: "text-blue-600 bg-blue-50 dark:bg-blue-950/40 dark:text-blue-400"
+ title: "Diagnóstico de Falhas",
+ badge: "30+ Soluções",
+ badgeColor: "bg-amber-100 text-amber-700 dark:bg-amber-950/60 dark:text-amber-300",
+ description: "Encontre a causa e o passo a passo para corrigir erros frequentes como Brownout, Guru Meditation, Bootloops e falhas de Flash.",
+ href: "/diagnostico",
+ icon: ,
+ iconBg: "text-amber-600 bg-amber-50 dark:bg-amber-950/40 dark:text-amber-400",
+ ctaText: "Resolver Erro no Código",
},
{
- name: "Especificações Organizadas",
- description: "Especificações técnicas completas de cada microcontrolador organizadas para fácil leitura.",
- icon: ,
- colorClass: "text-pink-600 bg-pink-50 dark:bg-pink-950/40 dark:text-pink-400"
- },
- {
- name: "Diagramas de Conexões",
- description: "Visualize diagramas de pinos interativos e mapeamentos de periféricos de forma dinâmica.",
- icon: ,
- colorClass: "text-emerald-600 bg-emerald-50 dark:bg-emerald-950/40 dark:text-emerald-400"
- },
- {
- name: "Suporte a Frameworks",
- description: "Encontre casos de uso, documentações e snippets para ESP-IDF, Arduino e MicroPython.",
- icon: ,
- colorClass: "text-amber-600 bg-amber-50 dark:bg-amber-950/40 dark:text-amber-400"
- },
- {
- name: "Comparação de Modelos",
- description: "Compare lado a lado as especificações de múltiplos chips em uma visualização única.",
+ title: "Comparador de Séries",
+ badge: "Lado a Lado",
+ badgeColor: "bg-indigo-100 text-indigo-700 dark:bg-indigo-950/60 dark:text-indigo-300",
+ description: "Compare especificações de até 4 séries simultaneamente: núcleos, clock, memória SRAM/PSRAM, interfaces e conexões.",
+ href: "/comparacao",
icon: ,
- colorClass: "text-cyan-600 bg-cyan-50 dark:bg-cyan-950/40 dark:text-cyan-400"
+ iconBg: "text-indigo-600 bg-indigo-50 dark:bg-indigo-950/40 dark:text-indigo-400",
+ ctaText: "Comparar Modelos",
},
{
- name: "Links para Documentação",
- description: "Acesso direto aos datasheets oficiais, manuais de referência e guias da Espressif.",
- icon: ,
- colorClass: "text-red-600 bg-red-50 dark:bg-red-950/40 dark:text-red-400"
+ title: "Explorador de Séries & Pinouts",
+ badge: "12 Chips",
+ badgeColor: "bg-blue-100 text-blue-700 dark:bg-blue-950/60 dark:text-blue-300",
+ description: "Consulte diagramas interativos de conexões, mapas de periféricos, datasheets oficiais e restrições de pinos (strapping, ADC2).",
+ href: "/series",
+ icon: ,
+ iconBg: "text-blue-600 bg-blue-50 dark:bg-blue-950/40 dark:text-blue-400",
+ ctaText: "Ver Todas as Séries",
},
{
- name: "Exemplos de Código",
- description: "Gabaritos e snippets funcionais de código para iniciar seus projetos rapidamente.",
- icon: ,
- colorClass: "text-indigo-600 bg-indigo-50 dark:bg-indigo-950/40 dark:text-indigo-400"
+ title: "Catálogo de Placas",
+ badge: "Hardware Real",
+ badgeColor: "bg-emerald-100 text-emerald-700 dark:bg-emerald-950/60 dark:text-emerald-300",
+ description: "Filtre placas de desenvolvimento (DevKit, Xiao, Wemos, LilyGO) por série, interface USB, sensores integrados e links de compra.",
+ href: "/catalogo",
+ icon: ,
+ iconBg: "text-emerald-600 bg-emerald-50 dark:bg-emerald-950/40 dark:text-emerald-400",
+ ctaText: "Explorar Placas Físicas",
},
{
- name: "Informações Atualizadas",
- description: "Dados sempre revisados e sincronizados com os lançamentos mais recentes de silício.",
- icon: ,
- colorClass: "text-teal-600 bg-teal-50 dark:bg-teal-950/40 dark:text-teal-400"
+ title: "Frameworks & SDKs",
+ badge: "C++, Python & Rust",
+ badgeColor: "bg-teal-100 text-teal-700 dark:bg-teal-950/60 dark:text-teal-300",
+ description: "Documentação de frameworks oficiais e comunitários: ESP-IDF, Arduino Core, MicroPython, ESP-Matter, ESP-WHO e mais.",
+ href: "/frameworks",
+ icon: ,
+ iconBg: "text-teal-600 bg-teal-50 dark:bg-teal-950/40 dark:text-teal-400",
+ ctaText: "Acessar Guias de SDK",
},
{
- name: "Interface em Português",
- description: "Navegação, termos técnicos e explicações adaptadas ao nosso idioma nativo.",
- icon: ,
- colorClass: "text-sky-600 bg-sky-50 dark:bg-sky-950/40 dark:text-sky-400"
+ title: "Glossário Técnico",
+ badge: "60+ Conceitos",
+ badgeColor: "bg-pink-100 text-pink-700 dark:bg-pink-950/60 dark:text-pink-300",
+ description: "Dicionário de termos técnicos essenciais: entenda RTOS, NVS, Partições OTA, eFuse, Brownout, RISC-V e protocolos industriais.",
+ href: "/glossario",
+ icon: ,
+ iconBg: "text-pink-600 bg-pink-50 dark:bg-pink-950/40 dark:text-pink-400",
+ ctaText: "Consultar Termos",
+ },
+ {
+ title: "Sobre a Plataforma",
+ badge: "Comunidade",
+ badgeColor: "bg-slate-200 text-slate-700 dark:bg-slate-800 dark:text-slate-300",
+ description: "Conheça a missão da ESPDocs, a autoria de Lucas Rayan Guerra e a parceria educacional com o blog Ciência Embarcada.",
+ href: "/sobre",
+ icon: ,
+ iconBg: "text-slate-650 bg-slate-100 dark:bg-slate-800 dark:text-slate-350",
+ ctaText: "Conhecer o Projeto",
+ },
+ ];
+
+ // Chips em Destaque
+ const featuredChips = [
+ {
+ name: "ESP32",
+ slug: "esp32",
+ badge: "Padrão da Indústria",
+ arch: "Xtensa LX6 Dual-Core @ 240 MHz",
+ wireless: "Wi-Fi 4 (802.11 b/g/n) + BLE 4.2 / Clássico",
+ highlights: "Suporte maduro, 36 pinos GPIO, ADC duplo, DAC de 8 bits",
+ cor: "#007bff",
+ },
+ {
+ name: "ESP32-S3",
+ slug: "esp32-s3",
+ badge: "IA & USB Nativo",
+ arch: "Xtensa LX7 Dual-Core @ 240 MHz",
+ wireless: "Wi-Fi 4 + BLE 5.0 (Long Range)",
+ highlights: "Instruções vetoriais para IA, USB OTG nativo, até 45 GPIOs",
+ cor: "#fd7e14",
+ },
+ {
+ name: "ESP32-C6",
+ slug: "esp32-c6",
+ badge: "Wi-Fi 6 + Zigbee/Matter",
+ arch: "RISC-V 32-bit Single-Core @ 160 MHz + LP Core",
+ wireless: "Wi-Fi 6 (ax) + BLE 5.3 + Zigbee 3.0 & Thread (802.15.4)",
+ highlights: "Protocolo Matter, Target Wake Time (TWT), segurança de hardware",
+ cor: "#17a2b8",
+ },
+ {
+ name: "ESP32-C3",
+ slug: "esp32-c3",
+ badge: "Custo-Benefício RISC-V",
+ arch: "RISC-V 32-bit Single-Core @ 160 MHz",
+ wireless: "Wi-Fi 4 + BLE 5.0 (Mesh & Long Range)",
+ highlights: "Substituto direto do ESP8266, pinout compacto, baixo consumo",
+ cor: "#20c997",
+ },
+ {
+ name: "ESP32-P4",
+ slug: "esp32-p4",
+ badge: "Superprocessador 400MHz",
+ arch: "Dual-Core RISC-V HP @ 400 MHz + LP Core @ 40 MHz",
+ wireless: "Sem rádio interno (Focado em processamento multimídia)",
+ highlights: "MIPI-CSI/DSI, codificador H.264, Ethernet 100M, 50+ GPIOs",
+ cor: "#ffc107",
+ },
+ {
+ name: "ESP32-H2",
+ slug: "esp32-h2",
+ badge: "Zigbee & Thread",
+ arch: "RISC-V 32-bit Single-Core @ 96 MHz",
+ wireless: "IEEE 802.15.4 (Zigbee 3.0, Thread) + BLE 5.3",
+ highlights: "Automação residencial ultrabaixo consumo, nós finais de rede",
+ cor: "#6c757d",
+ },
+ ];
+
+ // Problemas Comuns do Diagnóstico
+ const commonErrors = [
+ {
+ title: "Brownout detector was triggered",
+ cause: "Queda de tensão súbita na alimentação ao inicializar o Wi-Fi",
+ solution: "Adicionar capacitor de desacoplamento de 10µF–100µF e usar fonte externa de 5V 1A+",
+ },
+ {
+ title: "Guru Meditation Error: IllegalInstruction",
+ cause: "Acesso a ponteiro nulo, estouro de pilha (stack overflow) ou interrupção incorreta",
+ solution: "Inspecione o Backtrace usando o addr2line e aumente o tamanho da stack da task FreeRTOS",
+ },
+ {
+ title: "ADC2 leitura inválida com Wi-Fi",
+ cause: "O rádio Wi-Fi bloqueia o conversor analógico-digital ADC2 enquanto está ativo",
+ solution: "Utilize exclusivamente pinos do ADC1 (GPIOs 32 a 39 no ESP32) para sensores analógicos",
+ },
+ {
+ title: "Flash Read err / Bootloader falhou",
+ cause: "Tensão de Flash incorreta (1.8V vs 3.3V) ou pino de strapping (GPIO 0, 2, 12, 15) travado",
+ solution: "Verifique resistores pull-up/pull-down nos pinos de boot e confirme a frequência de Flash no esptool",
},
];
@@ -87,25 +203,33 @@ export default function Home() {
-
+
{/* Hero Section */}
-
-
+
+ {/* Pill Tag */}
+
+
+ O Maior Hub Técnico de ESP32 em Português
+
+
+
ESPDocs
-
- Organização e acesso facilitado ao ecossistema ESP32
+
+ Tudo o que você precisa para dominar o ecossistema ESP32
-
- Plataforma independente criada para desenvolvedores que buscam comparar especificações, consultar pinouts, selecionar chips ideais e acessar referências em português de forma rápida e intuitiva.
+
+ Chega de perder tempo traduzindo datasheets dispersos ou decifrando bootloops no escuro.
+ Compare 12 séries de chips, diagnostique erros comuns de firmware, descubra o ESP32 ideal
+ para o seu projeto e consulte pinouts interativos 100% em português brasileiro.
Acesse artigos profundos sobre programação de microcontroladores, design de hardware, Internet das Coisas (IoT), laboratórios práticos e projetos reais em nosso blog parceiro oficial.
@@ -241,13 +524,4 @@ export default function Home() {
);
-}
-
-/* Local mini-icon component for external link */
-function ExternalLinkIcon() {
- return (
-
- );
}
\ No newline at end of file
diff --git a/app/seletor/layout.jsx b/app/seletor/layout.jsx
index c136ab1..0b0fb71 100644
--- a/app/seletor/layout.jsx
+++ b/app/seletor/layout.jsx
@@ -1,17 +1,64 @@
-import { paginaMeta } from "@/lib/seo";
+import { paginaMeta, jsonLd } from "@/lib/seo";
-/**
- * A página desta rota é um client component, e client component não pode
- * exportar metadata. Sem este layout, ela herdaria o título genérico do site,
- * e o Google veria várias páginas com o mesmo título e a mesma descrição.
- */
export const metadata = paginaMeta({
titulo: "Qual ESP32 escolher",
- descricao: "Responda seis perguntas sobre conectividade, energia, periféricos e segurança e receba a série de ESP32 recomendada para o seu projeto, com a justificativa técnica de cada ponto.",
+ descricao: "Responda a perguntas simples sobre conectividade (Wi-Fi 6, 5GHz, Matter), energia, periféricos e segurança ou use o filtro paramétrico para encontrar o ESP32 perfeito.",
caminho: "/seletor",
- keywords: ["qual ESP32 escolher", "qual ESP32 usar", "escolher microcontrolador", "ESP32 para meu projeto"],
+ keywords: ["qual ESP32 escolher", "qual ESP32 usar", "escolher microcontrolador", "ESP32 para meu projeto", "comparar ESP32"],
});
+const faqs = [
+ {
+ pergunta: "Qual ESP32 escolher para iniciantes?",
+ resposta: "Para quem está começando no mundo Maker e IoT, o ESP32 clássico (NodeMCU/DevKitC) ou o ESP32-C3 são as melhores opções devido à vasta quantidade de bibliotecas, exemplos prontos no Arduino IDE e farta documentação em português.",
+ },
+ {
+ pergunta: "Qual ESP32 tem suporte a Wi-Fi 6, Bluetooth 6 e Thread/Zigbee/Matter?",
+ resposta: "O ESP32-C6 e o ESP32-C5 são as melhores séries para redes modernas. O ESP32-C6 oferece Wi-Fi 6 (2.4 GHz) e rádio 802.15.4 (Zigbee 3.0 / Thread / Matter). Já o ESP32-C5 é o primeiro a oferecer suporte a Wi-Fi 6 Dual-Band operando em 2.4 GHz e 5 GHz simultaneamente.",
+ },
+ {
+ pergunta: "Qual o ESP32 mais potente para Inteligência Artificial (TinyML) e Displays?",
+ resposta: "O ESP32-P4 (dual-core RISC-V a 400 MHz com extensões vetoriais de IA, interfaces MIPI-CSI/DSI para câmeras/telas e até 64 MB de PSRAM) e o ESP32-S3 (dual-core Xtensa a 240 MHz com aceleradores vetoriais para redes neurais e telas LCD RGB) são os mais velozes para IA na borda e interfaces gráficas ricas.",
+ },
+ {
+ pergunta: "Qual ESP32 consome menos energia para projetos a bateria?",
+ resposta: "Microcontroladores com arquitetura RISC-V compacta e coprocessador ULP, como o ESP32-C2, ESP32-C3 e ESP32-H2 (focado em 802.15.4 sem rádio Wi-Fi), oferecem correntes de deep sleep extremamente baixas (na faixa de 5 µA a 10 µA).",
+ },
+];
+
export default function Layout({ children }) {
- return children;
+ return (
+ <>
+
+
+
+ {children}
+ >
+ );
}
diff --git a/app/seletor/page.jsx b/app/seletor/page.jsx
index 26a9ffd..5112743 100644
--- a/app/seletor/page.jsx
+++ b/app/seletor/page.jsx
@@ -1,6 +1,6 @@
"use client";
-import { useState } from "react";
+import { useState, useMemo } from "react";
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import Link from "next/link";
@@ -31,507 +31,1006 @@ import {
ExternalLink,
ShoppingBag,
BookOpen,
- Compass,
- Smartphone,
ShieldCheck,
KeyRound,
- Lock
+ Lock,
+ Radio,
+ Layers,
+ Microchip,
+ Activity,
+ Flame,
+ Check,
+ X,
+ AlertTriangle,
+ Gauge,
+ Volume2,
+ Tv,
+ HardDrive,
+ Filter,
+ ArrowRight,
+ Lightbulb,
+ Info
} from "lucide-react";
-// Dynamic icon mapper to convert choices to sleek Lucide vectors
+// Dynamic icon mapper for options and presets
const iconMap = {
- // Categoria
- "category_wearable": ,
- "category_smarthome": ,
- "category_multimedia": ,
- "category_industrial": ,
-
+ // Categorias
+ "category_smarthome": ,
+ "category_multimedia": ,
+ "category_ai_edge": ,
+ "category_wearable": ,
+ "category_industrial": ,
+ "category_basic_iot": ,
+
// Conectividade
- "connectivity_wifi-ble": ,
- "connectivity_mesh": ,
- "connectivity_ethernet": ,
- "connectivity_none": ,
-
- // Alimentacao
- "power_battery": ,
- "power_always-on": ,
-
- // Hardware
- "hardware_display-camera": (
+ "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-native": ,
- "hardware_many-gpios": ,
- "hardware_basic": ,
-
+ "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-ml": ,
- "ai_standard": ,
+ "ai_ai_vector": ,
+ "ai_standard": ,
// Segurança
- "security_critical": ,
- "security_standard": ,
+ "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] || ;
+ 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: "Qual é o foco principal ou aplicação do seu projeto?",
- description: "Categorizar seu projeto nos ajuda a equilibrar fatores de tamanho físico, consumo de energia e poder computacional do chip.",
+ 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: "wearable", label: "Dispositivo Portátil ou Vestível (Wearable)", icon: "category_wearable" },
- { value: "smarthome", label: "Automação / Smart Home / IoT Conectado", icon: "category_smarthome" },
- { value: "multimedia", label: "Interface Multimídia (Telas / Câmeras / HMI)", icon: "category_multimedia" },
- { value: "industrial", label: "Industrial / Robótica / Alto Desempenho", icon: "category_industrial" },
+ { 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: "Qual tecnologia de rede sem fio (RF) você precisa?",
- description: "O ecossistema ESP32 oferece desde rádios Wi-Fi tradicionais até controladores industriais cabeados ou rádio Mesh 802.15.4.",
+ 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: "wifi-ble", label: "Wi-Fi + Bluetooth BLE (IoT Tradicional)", icon: "connectivity_wifi-ble" },
- { value: "mesh", label: "Matter / Zigbee / Thread (Redes Mesh)", icon: "connectivity_mesh" },
- { value: "ethernet", label: "Rede Cabeada Industrial (Ethernet)", icon: "connectivity_ethernet" },
- { value: "none", label: "Apenas Local / Sem Conexão Sem Fio", icon: "connectivity_none" },
+ { 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: "Como o dispositivo será alimentado eletricamente?",
- description: "A escolha da fonte de energia determina a importância de blocos internos de silício de consumo ultra-baixo (Deep Sleep).",
+ 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", label: "Bateria ou Painel Solar (Consumo Ultra-Baixo)", icon: "power_battery" },
- { value: "always-on", label: "Tomada, Fonte Externa ou USB (Sempre Ativo)", icon: "power_always-on" },
+ { 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: "Quais periféricos físicos ou barramentos serão conectados?",
- description: "Determinados módulos requerem interfaces dedicadas no silício, como barramento LCD, USB nativo ou alta quantidade de GPIOs.",
+ 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: "display-camera", label: "Displays Gráficos LCD ou Câmeras", icon: "hardware_display-camera" },
- { value: "usb-native", label: "Conexão USB Nativa (Emular Teclado/Disco)", icon: "hardware_usb-native" },
- { value: "many-gpios", label: "Muitos Atuadores / Pinos (Mais de 30 GPIOs)", icon: "hardware_many-gpios" },
- { value: "basic", label: "Básico (Poucos sensores com I2C, SPI ou UART)", icon: "hardware_basic" },
+ { 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: "Seu projeto usará Inteligência Artificial local (Edge AI)?",
- description: "Aceleração por hardware permite rodar redes neurais, reconhecimento de voz ou visão computacional na borda em milissegundos.",
+ 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-ml", label: "Sim, preciso rodar modelos de IA localmente", icon: "ai_ai-ml" },
- { value: "standard", label: "Não, processamento lógico comum é suficiente", icon: "ai_standard" },
+ { 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: "Qual requisito de segurança o produto precisa atender?",
- description: "As séries diferem bastante aqui: nem todas têm curvas elípticas (ECC), ECDSA em hardware ou Key Manager, e duas delas sequer têm acelerador AES. Escolha o requisito mais forte do seu projeto.",
+ 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: "matter", label: "Atestado de dispositivo para Matter ou assinatura digital (ECDSA)", icon: "security_matter" },
- { value: "chaves", label: "Chave privada que nunca pode ser lida pelo firmware (Key Manager)", icon: "security_chaves" },
- { value: "boot", label: "Boot seguro e flash criptografada contra cópia do firmware", icon: "security_boot" },
- { value: "tls", label: "Só TLS/HTTPS comum, sem requisito regulatório", icon: "security_tls" },
+ { 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({ ...answers, [questionId]: value });
+ setAnswers(prev => ({ ...prev, [questionId]: value }));
+ setActivePreset(null);
};
const handleNext = () => {
if (currentAnswer !== null) {
if (currentStep < questions.length - 1) {
- setCurrentStep(currentStep + 1);
- setCurrentAnswer(answers[questions[currentStep + 1].id] || null);
+ 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 goBack = () => {
- if (currentStep > 0) {
- setCurrentStep(currentStep - 1);
- setCurrentAnswer(answers[questions[currentStep - 1].id] || 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];
-
- // 1. CATEGORIA DO PROJETO (category)
- if (answers.category === "wearable") {
- if (serie.bluetooth !== "Não") {
- scores[key] += 10;
- reasons[key].push("Suporte de rádio Bluetooth de alta eficiência para pareamento");
+ 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");
}
- const sleep = serie.consumo_energia?.deep_sleep;
- if (sleep) {
- const uaMatch = sleep.match(/(\d+)\s*µA/);
- if (uaMatch && parseInt(uaMatch[1]) <= 10) {
- scores[key] += 15;
- reasons[key].push(`Modo standby ultra-eficiente (${sleep}) conserva baterias comerciais`);
- }
+ 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 (key === "ESP32-C2" || key === "ESP32-C3") {
- scores[key] += 6;
- reasons[key].push("Footprint de tamanho reduzido ideal para dispositivos ultra-compactos");
- }
- } else if (answers.category === "smarthome") {
if (serie.wifi && !String(serie.wifi).includes("Não")) {
scores[key] += 10;
- reasons[key].push("Cadeia RF Wi-Fi robusta integrada para integração residencial");
- }
- if (serie.matter === "Sim") {
- scores[key] += 15;
- reasons[key].push("Suporte oficial a Matter para alta interoperabilidade inteligente");
+ reasons[key].push("Rádio Wi-Fi integrado para conexão direta ao roteador");
}
} else if (answers.category === "multimedia") {
- if (serie.lcd || serie.mipi_dsi) {
- scores[key] += 15;
- reasons[key].push("Barramentos dedicados no silício para controle de telas coloridas");
- }
- if (serie.camera || serie.mipi_csi) {
- scores[key] += 15;
- reasons[key].push("Linhas dedicadas para conexão de câmeras de vídeo");
- }
- if (serie.psram_externa && serie.psram_externa !== "Não") {
- scores[key] += 10;
- reasons[key].push("Suporte a PSRAM externa de alta densidade para buffers e quadros");
- }
- } else if (answers.category === "industrial") {
- if (serie.nucleos.includes("2")) {
- scores[key] += 12;
- reasons[key].push("Arquitetura Dual-Core ideal para loops síncronos e processamento paralelo");
- }
- if (parseInt(serie.gpio) >= 30) {
- scores[key] += 10;
- reasons[key].push(`Grande número de portas digitais (${serie.gpio} GPIOs)`);
- }
- if (serie.aceleradores_ia) {
- scores[key] += 10;
- reasons[key].push("Acelerador neural de silício ideal para controle de feedback preditivo");
- }
- }
-
- // 2. CONECTIVIDADE SEM FIO (connectivity)
- if (answers.connectivity === "wifi-ble") {
- if (serie.wifi && !String(serie.wifi).includes("Não") && serie.bluetooth !== "Não") {
+ 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(`Conexão de rádio integrada Wi-Fi (${serie.wifi}) e Bluetooth (${serie.bluetooth})`);
- } else if (serie.wifi && !String(serie.wifi).includes("Não")) {
- scores[key] += 8;
- reasons[key].push("Possui conexão Wi-Fi ativa, mas carece de Bluetooth");
+ reasons[key].push("Interfaces dedicadas em hardware para telas LCD RGB e câmeras DVP");
} else {
- scores[key] -= 80;
- reasons[key].push("Incompatível: Necessita de rádio Wi-Fi ou Bluetooth");
+ scores[key] -= 35;
+ alerts[key].push("Sem barramentos dedicados para telas coloridas ou câmeras (apenas SPI/I2C simples)");
}
- } else if (answers.connectivity === "mesh") {
- if (serie.matter === "Sim") {
- scores[key] += 25;
- reasons[key].push("Rádio 802.15.4 integrado de alto alcance para barramentos Mesh (Zigbee/Thread)");
- } else {
- scores[key] -= 15;
- reasons[key].push("Sem rádio mesh 802.15.4 integrado no chip");
- }
- } else if (answers.connectivity === "ethernet") {
- if (serie.ethernet === "Sim" || serie.ethernet_mac === "Sim") {
- scores[key] += 25;
- reasons[key].push("Controlador MAC Ethernet cabeado para conexões imunes a ruídos RF");
- } else {
- scores[key] -= 10;
- reasons[key].push("Requer shield ou controlador externo para conexão de rede cabeada");
- }
- } else if (answers.connectivity === "none") {
- if (serie.wifi === "Não" || serie.bluetooth === "Não" || key === "ESP32-H2" || key === "ESP32-C2") {
- scores[key] += 15;
- reasons[key].push("Microcontrolador focado em baixo custo e alta eficiência para circuitos locais");
- } else {
- scores[key] += 5;
- }
- }
- // 3. FONTE DE ALIMENTAÇÃO & CONSUMO (power)
- if (answers.power === "battery") {
+ 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(`Standby em Deep Sleep de apenas ${sleep} maximiza fontes recarregáveis`);
- } else {
- scores[key] += 10;
- reasons[key].push(`Gerenciamento térmico e modo de suspensão em ${sleep}`);
+ reasons[key].push(`Consumo em Deep Sleep ultrabaixo de apenas ${sleep} preserva baterias compactas`);
}
- } else {
- scores[key] -= 10;
- reasons[key].push("Standby de energia menos otimizado para longos ciclos de bateria");
}
- } else if (answers.power === "always-on") {
- if (serie.nucleos.includes("2")) {
- scores[key] += 10;
- reasons[key].push("Desempenho multitarefa constante garantido por núcleos redundantes");
+ 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 (parseInt(serie.frequencia) >= 240) {
+ if (key === "ESP32-C2" || key === "ESP32-C3" || key === "ESP32-H2") {
scores[key] += 10;
- reasons[key].push(`Velocidade de cálculo mantida em clock máximo de ${serie.frequencia}`);
+ 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");
}
}
- // 4. INTERFACE E PERIFÉRICOS (hardware)
- if (answers.hardware === "display-camera") {
- if ((serie.lcd || serie.mipi_dsi) && (serie.camera || serie.mipi_csi)) {
- scores[key] += 25;
- reasons[key].push("Possui barramento flexível LCD e câmera digital rodando simultaneamente");
- } else if (serie.lcd || serie.mipi_dsi || serie.camera || serie.mipi_csi) {
+ // 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("Suporte para telas gráficas ou interfaces de captura de imagem");
- } else {
- scores[key] -= 50;
- reasons[key].push("Incompatível: Sem barramentos físicos dedicados para telas e câmeras");
- }
- } else if (answers.hardware === "usb-native") {
- if (serie.usb && serie.usb !== "Não") {
- scores[key] += 25;
- reasons[key].push(`Interface física USB OTG integrada (${serie.usb}) para depuração direta`);
+ reasons[key].push("Wi-Fi 6 (802.11ax), porém operando apenas na faixa de 2.4 GHz");
} else {
scores[key] -= 35;
- reasons[key].push("Incompatível: Requer depurador USB-Serial de placa externa");
+ alerts[key].push("Não possui suporte a Wi-Fi na banda de 5 GHz");
}
- } else if (answers.hardware === "many-gpios") {
- const gpios = parseInt(serie.gpio);
- if (gpios >= 35) {
- scores[key] += 20;
- reasons[key].push(`Grade extensiva de portas de expansão com ${gpios} pinos GPIO livres`);
- } else if (gpios >= 22) {
- scores[key] += 10;
- reasons[key].push(`Portas GPIO moderadas (${gpios} pinos)`);
+ } 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;
- reasons[key].push(`Grade de pinagem física restrita (${gpios} GPIOs)`);
+ alerts[key].push("Sem rádio 802.15.4 integrado para Thread/Zigbee");
}
- } else if (answers.hardware === "basic") {
+ } 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. INTELIGÊNCIA ARTIFICIAL (ai)
- if (answers.ai === "ai-ml") {
- if (serie.aceleradores_ia) {
- scores[key] += 30;
- reasons[key].push("Acelerador vetorial neural de silício dedicado (inferências Edge AI ultra-rápidas)");
+ // 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] -= 25;
- reasons[key].push("Desempenho de IA limitado por falta de aceleração nativa em hardware");
+ 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;
}
- // 6. SEGURANÇA CRIPTOGRÁFICA (security)
- // Agora lê os campos destrinchados, então cada requisito pontua o
- // bloco de hardware que realmente o atende.
- const seg = serie.seguranca || {};
+ // 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 === "matter") {
- if (temECDSA) {
- scores[key] += 30;
- reasons[key].push(`ECDSA em hardware (${seg.ecc}): atestado de dispositivo Matter assinado sem custo de CPU`);
- } else if (temECC) {
- scores[key] += 10;
- reasons[key].push(`Tem ECC (${seg.ecc}) mas não o periférico ECDSA: a assinatura roda parcialmente em software`);
+ 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;
- reasons[key].push("Sem curvas elípticas em hardware: assinatura ECDSA inteiramente por software, lenta no provisionamento");
+ alerts[key].push("Sem periférico Key Manager nem proteção DPA");
}
- } else if (answers.security === "chaves") {
- if (seg.key_manager === "Sim") {
+ } else if (answers.security === "matter_ecdsa") {
+ if (temECDSA) {
scores[key] += 30;
- reasons[key].push("Key Manager: a chave é provisionada e usada sem nunca ficar legível para o firmware");
- } else if (seg.assinatura_digital === "Sim") {
+ reasons[key].push(`Acelerador de assinatura digital ECDSA determinístico em hardware (${seg.ecc})`);
+ } else if (temECC) {
scores[key] += 15;
- reasons[key].push("Periférico Digital Signature protege a chave RSA via eFuse, mas sem Key Manager para as demais");
+ reasons[key].push(`Coprocessador de curvas elípticas ECC (${seg.ecc})`);
} else {
- scores[key] -= 20;
- reasons[key].push("Sem Key Manager nem Digital Signature: a chave privada fica exposta na memória do firmware");
+ scores[key] -= 25;
+ alerts[key].push("Sem acelerador de curvas elípticas (ECC) em hardware (assinatura por software mais lenta)");
}
- } else if (answers.security === "boot") {
+ } 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;
- reasons[key].push("Secure Boot apenas na versão V1 (legada), sem as proteções do esquema V2");
+ alerts[key].push("Secure Boot em esquema V1 (legado com limitações de segurança)");
} else {
scores[key] -= 20;
- reasons[key].push(`Secure Boot indisponível: ${seg.secure_boot}`);
+ alerts[key].push("Sem Secure Boot V2 estável");
}
- } else if (answers.security === "tls") {
+ } else if (answers.security === "standard_tls") {
if (temAES) {
- scores[key] += 10;
- reasons[key].push(`Handshake e tráfego TLS acelerados por hardware (${seg.aes}, ${seg.sha})`);
+ scores[key] += 15;
+ reasons[key].push(`Criptografia de tráfego TLS acelerada por hardware (${seg.aes})`);
} else {
- scores[key] -= 10;
- reasons[key].push(`Sem acelerador AES (só ${seg.sha}): o tráfego TLS é cifrado pela CPU e pesa no desempenho`);
+ 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 };
+
+ return { scores, reasons, alerts };
};
- const { scores: allScores, reasons: allReasons } = (showResults && Object.values(answers).every(a => a !== null))
- ? calculateRecommendations()
- : { scores: {}, reasons: {} };
+ // Parametric Direct Filter Matcher
+ const filteredChips = useMemo(() => {
+ if (mode !== "filter") return [];
- const recommendations = Object.entries(allScores)
- .filter(([_, score]) => score > 0)
- .sort(([, a], [, b]) => b - a);
+ return Object.entries(seriesData).filter(([key, serie]) => {
+ const seg = serie.seguranca || {};
- // Rearrange podium for premium visual styling: 2nd Place | 1st Place | 3rd Place
- const getPodiumOrder = (topThree) => {
- if (topThree.length < 2) return topThree;
- if (topThree.length === 2) return [topThree[1], topThree[0]];
- return [topThree[1], topThree[0], topThree[2]];
- };
+ 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 desktopPodium = getPodiumOrder(topThree);
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 (
- Responda a **6 perguntas simples** sobre o propósito, conexões de hardware, alimentação e segurança do seu projeto e encontre instantaneamente o silício Espressif perfeito para sua bancada.
+
+
+ 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 */}
+
- Revise suas escolhas de arquitetura abaixo. Você pode ajustar qualquer especificação individual antes de processar as recomendações.
+ Revise suas escolhas abaixo antes de calcular o ranking de compatibilidade com os dados do catálogo de silício.
Ver Detalhes
@@ -873,128 +1543,275 @@ export default function Seletor() {
)}
- {/* Bottom navigation buttons */}
-
+ {/* Navigation Actions */}
+
- Comparar Lado a Lado
+ Comparador Completo
- Refazer Quiz
+ Refazer com Outros Critérios
-
- {/* Secondary showcase tools */}
-
-
- Próximos Passos de Desenvolvimento
-
-
-
-
-
-
-
- Catálogo de Placas
-
-
- Explore placas de desenvolvimento oficiais e módulos contendo o silício recomendado com links seguros de compra.
-
-
-
-
-
-
-
-
- Explorar SDKs & Frameworks
-
-
- Descubra qual SDK oficial da Espressif (ESP-IDF, Arduino Core, MicroPython) oferece a melhor pilha de drivers.
-
-
-
-
-
-
-
-
- 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 de engenharia.
-
-
-
-
)}
- {/* STEP 3B: No Results Found */}
- {showResults && recommendations.length === 0 && (
-
-
-
-
-
-
- Sem Correspondência Exata
-
-
- Não foi possível encontrar um único microcontrolador ESP32 que atenda simultaneamente a todos os critérios. Isso ocorre quando requisitamos combinações extremas (ex: Ethernet industrial cabeada + BLE portátil com economia de bateria ultra-baixa).
-
+ {/* 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.
+
+ 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.
+
+
+
+
diff --git a/app/series/layout.jsx b/app/series/layout.jsx
index b451022..803821f 100644
--- a/app/series/layout.jsx
+++ b/app/series/layout.jsx
@@ -1,10 +1,5 @@
-import { paginaMeta } from "@/lib/seo";
+import { paginaMeta, jsonLd } from "@/lib/seo";
-/**
- * A página desta rota é um client component, e client component não pode
- * exportar metadata. Sem este layout, ela herdaria o título genérico do site,
- * e o Google veria várias páginas com o mesmo título e a mesma descrição.
- */
export const metadata = paginaMeta({
titulo: "Séries ESP32",
descricao: "As 12 séries de ESP32 lado a lado: ESP32, S2, S3, S31, C2, C3, C5, C6, C61, P4, H2 e H4. Arquitetura, memória, rádio, periféricos e pinagem de cada uma, em português.",
@@ -12,11 +7,40 @@ export const metadata = paginaMeta({
keywords: ["séries ESP32", "modelos de ESP32", "ESP32 S3", "ESP32 C6", "ESP32 P4", "diferença entre ESP32"],
});
-// Um layout que define title como string simples substitui o template do root
-// para toda a subárvore, e as páginas de série perdiam o sufixo "· ESPDocs".
-// Redeclarar o template aqui devolve o comportamento às filhas.
metadata.title = { default: "Séries ESP32", template: "%s · ESPDocs" };
+const faqs = [
+ {
+ pergunta: "Quantas séries de ESP32 existem atualmente?",
+ resposta: "Atualmente o ecossistema Espressif conta com 12 séries principais: ESP32 clássico, ESP32-S2, ESP32-S3, ESP32-S31, ESP32-C2, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-C61, ESP32-P4, ESP32-H2 e ESP32-H4.",
+ },
+ {
+ pergunta: "Quais são as séries mais recentes da Espressif?",
+ resposta: "As séries mais recentes incluem o ESP32-P4 (focado em alto desempenho com dual-core RISC-V a 400 MHz), o ESP32-C5 (primeiro chip com Wi-Fi dual-band 2.4/5 GHz da Espressif) e o ESP32-C61 (Wi-Fi 6 e Bluetooth 6 de baixo custo).",
+ },
+];
+
export default function Layout({ children }) {
- return children;
+ return (
+ <>
+
+
+ {children}
+ >
+ );
}
diff --git a/app/sitemap.js b/app/sitemap.js
index a88c754..34f1be1 100644
--- a/app/sitemap.js
+++ b/app/sitemap.js
@@ -10,34 +10,39 @@ import { SITE } from "@/lib/seo";
* JSON, uma série nova entra aqui sozinha.
*/
export default function sitemap() {
- const agora = new Date();
+ // Usar uma data de revisão estável evita que todo deploy force o Googlebot
+ // a reprocessar páginas idênticas ao mesmo tempo.
+ const dataRevisao = new Date("2026-08-25T00:00:00.000Z");
const fixas = [
- { caminho: "", prioridade: 1.0, frequencia: "weekly" },
- { caminho: "/series", prioridade: 0.9, frequencia: "weekly" },
- { caminho: "/comparacao", prioridade: 0.9, frequencia: "weekly" },
- { caminho: "/seletor", prioridade: 0.8, frequencia: "monthly" },
- { caminho: "/frameworks", prioridade: 0.8, frequencia: "monthly" },
- { caminho: "/glossario", prioridade: 0.7, frequencia: "monthly" },
- { caminho: "/catalogo", prioridade: 0.6, frequencia: "weekly" },
- { caminho: "/sobre", prioridade: 0.4, frequencia: "yearly" },
+ { caminho: "", prioridade: 1.0, frequencia: "weekly", lastModified: dataRevisao },
+ { caminho: "/series", prioridade: 0.9, frequencia: "weekly", lastModified: dataRevisao },
+ { caminho: "/comparacao", prioridade: 0.9, frequencia: "weekly", lastModified: dataRevisao },
+ { caminho: "/diagnostico", prioridade: 0.9, frequencia: "weekly", lastModified: dataRevisao },
+ { caminho: "/seletor", prioridade: 0.8, frequencia: "monthly", lastModified: dataRevisao },
+ { caminho: "/frameworks", prioridade: 0.8, frequencia: "monthly", lastModified: dataRevisao },
+ { caminho: "/glossario", prioridade: 0.7, frequencia: "monthly", lastModified: dataRevisao },
+ { caminho: "/catalogo", prioridade: 0.6, frequencia: "weekly", lastModified: dataRevisao },
+ { caminho: "/sobre", prioridade: 0.4, frequencia: "yearly", lastModified: dataRevisao },
];
const series = Object.keys(seriesData).map((chave) => ({
caminho: `/series/${chave}`,
prioridade: 0.9,
frequencia: "monthly",
+ lastModified: dataRevisao,
}));
const frameworks = Object.keys(frameworksData).map((chave) => ({
caminho: `/frameworks/${encodeURIComponent(chave)}`,
prioridade: 0.6,
frequencia: "monthly",
+ lastModified: dataRevisao,
}));
- return [...fixas, ...series, ...frameworks].map(({ caminho, prioridade, frequencia }) => ({
+ return [...fixas, ...series, ...frameworks].map(({ caminho, prioridade, frequencia, lastModified }) => ({
url: `${SITE.url}${caminho}`,
- lastModified: agora,
+ lastModified,
changeFrequency: frequencia,
priority: prioridade,
}));
diff --git a/app/sobre/page.jsx b/app/sobre/page.jsx
index 91b79f8..5f2bd86 100644
--- a/app/sobre/page.jsx
+++ b/app/sobre/page.jsx
@@ -1,4 +1,4 @@
-import { paginaMeta } from "@/lib/seo";
+import { paginaMeta, jsonLd } from "@/lib/seo";
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import Link from "next/link";
@@ -38,6 +38,23 @@ export default function Sobre() {
return (
+ {/* Metadados E-E-A-T de autoria e organização para o Google */}
+
+
+
Ir para o conteúdo
diff --git a/components/Footer.jsx b/components/Footer.jsx
index ba80da9..8452537 100644
--- a/components/Footer.jsx
+++ b/components/Footer.jsx
@@ -1,6 +1,7 @@
"use client";
import { useEffect, useState } from "react";
+import Link from "next/link";
import { ExternalLink } from "lucide-react";
export default function Footer() {
@@ -46,6 +47,14 @@ export default function Footer() {
Recursos