import Header from "@/components/Header"; import Footer from "@/components/Footer"; import BookCover from "@/components/BookCover"; import Link from "next/link"; import seriesDataPt from "@/public/series.json"; import frameworksDataPt from "@/public/frameworks.json"; import seriesDataEn from "@/data/en/series.json"; import frameworksDataEn from "@/data/en/frameworks.json"; import seriesDataEs from "@/data/es/series.json"; import frameworksDataEs from "@/data/es/frameworks.json"; import { SITE } from "@/lib/seo"; import { getLocalizedHref } from "@/i18n/links"; import { AlertTriangle, ArrowRight, ArrowUpRight, BookOpen, Box, Cpu, Scale, SlidersHorizontal, Terminal, } from "lucide-react"; const FEATURED = ["ESP32", "ESP32-S3", "ESP32-C6", "ESP32-C3", "ESP32-P4", "ESP32-H2"]; const TOOLS_PT = [ { href: "/seletor", title: "Seletor inteligente", desc: "Responda oito perguntas sobre o projeto e receba os chips mais compatíveis, com justificativa técnica.", icon: SlidersHorizontal, action: "Encontrar meu chip", }, { href: "/comparacao", title: "Comparador de séries", desc: "Coloque até quatro modelos lado a lado e compare núcleos, rádio, memória, periféricos e segurança.", icon: Scale, action: "Comparar agora", }, { href: "/diagnostico", title: "Diagnóstico de falhas", desc: "Causas e correções para brownout, bootloop, Guru Meditation, watchdog e falhas de flash.", icon: AlertTriangle, action: "Abrir diagnóstico", }, { href: "/componentes", title: "Component Registry", desc: "Drivers, bibliotecas e BSPs do registro oficial da Espressif, com manifesto pronto para o projeto.", icon: Box, action: "Explorar componentes", }, { href: "/frameworks", title: "Frameworks e SDKs", desc: "ESP-IDF, Arduino, Rust, Matter, MicroPython e as ferramentas que ficam em volta do chip.", icon: Terminal, action: "Ver frameworks", }, { href: "/catalogo", title: "Catálogo de placas", desc: "DevKits e módulos reais, com interface USB, sensores integrados e link para a loja oficial.", icon: Cpu, action: "Ver placas", }, ]; const TOOLS_EN = [ { href: "/seletor", title: "Smart Selector", desc: "Answer eight questions about your project and find recommended chips, backed by technical rationale.", icon: SlidersHorizontal, action: "Find my chip", }, { href: "/comparacao", title: "Series Comparator", desc: "Place up to four models side by side and compare cores, radio, memory, peripherals, and security.", icon: Scale, action: "Compare now", }, { href: "/diagnostico", title: "Fault Diagnostics", desc: "Root causes and fixes for brownout, bootloop, Guru Meditation, watchdog, and flash errors.", icon: AlertTriangle, action: "Open diagnostics", }, { href: "/componentes", title: "Component Registry", desc: "Drivers, libraries and BSPs from the official Espressif registry, with ready-to-use manifests.", icon: Box, action: "Explore components", }, { href: "/frameworks", title: "Frameworks & SDKs", desc: "ESP-IDF, Arduino, Rust, Matter, MicroPython and the tools built around the silicon.", icon: Terminal, action: "View frameworks", }, { href: "/catalogo", title: "Board Catalog", desc: "Real DevKits and modules, with USB interfaces, integrated sensors and direct store links.", icon: Cpu, action: "View boards", }, ]; const TOOLS_ES = [ { href: "/seletor", title: "Selector inteligente", desc: "Responda a ocho preguntas sobre su proyecto y reciba los chips más compatibles, con justificación técnica.", icon: SlidersHorizontal, action: "Encontrar mi chip", }, { href: "/comparacao", title: "Comparador de series", desc: "Compare hasta cuatro modelos frente a frente: núcleos, radio, memoria, periféricos y seguridad.", icon: Scale, action: "Comparar ahora", }, { href: "/diagnostico", title: "Diagnóstico de fallos", desc: "Causas y soluciones para brownout, bootloop, Guru Meditation, watchdog y fallos de flash.", icon: AlertTriangle, action: "Abrir diagnóstico", }, { href: "/componentes", title: "Component Registry", desc: "Drivers, bibliotecas y BSPs del registro oficial de Espressif, con manifiesto listo para su proyecto.", icon: Box, action: "Explorar componentes", }, { href: "/frameworks", title: "Frameworks y SDKs", desc: "ESP-IDF, Arduino, Rust, Matter, MicroPython y las herramientas que rodean al silicio.", icon: Terminal, action: "Ver frameworks", }, { href: "/catalogo", title: "Catálogo de placas", desc: "DevKits y módulos reales, con interfaz USB, sensores integrados y enlace directo a la tienda oficial.", icon: Cpu, action: "Ver placas", }, ]; const ERRORS_PT = [ { code: "Brownout detector was triggered", cause: "Queda de tensão na inicialização do rádio.", fix: "Capacitor de 10–100 µF junto ao chip e fonte de 5 V com corrente suficiente.", }, { code: "Guru Meditation Error", cause: "Ponteiro inválido, stack overflow ou uso incorreto de interrupção.", fix: "Leia o backtrace com addr2line e dimensione a stack da task no FreeRTOS.", }, { code: "ADC2 indisponível com Wi-Fi", cause: "O controlador de rádio reserva o ADC2 enquanto está ativo.", fix: "Use os pinos do ADC1 para sensores analógicos que convivem com o Wi-Fi.", }, { code: "Flash Read err / bootloader", cause: "Tensão ou modo de flash incorretos, ou pino de strapping preso no boot.", fix: "Confira 3,3 V, pull-ups de boot e a configuração de flash no esptool.", }, ]; const ERRORS_EN = [ { code: "Brownout detector was triggered", cause: "Voltage sag upon radio startup.", fix: "10–100 µF capacitor close to chip and a 5 V supply with sufficient current.", }, { code: "Guru Meditation Error", cause: "Invalid pointer, stack overflow, or improper ISR usage.", fix: "Inspect backtrace with addr2line and properly size FreeRTOS task stacks.", }, { code: "ADC2 indisponível com Wi-Fi", cause: "Internal radio controller reserves ADC2 while active.", fix: "Use ADC1 pins for analog sensors operating alongside Wi-Fi.", }, { code: "Flash Read err / bootloader", cause: "Incorrect flash voltage/mode or strapping pin pulled during boot.", fix: "Check 3.3 V rail, boot pull-ups, and flash configuration in esptool.", }, ]; const ERRORS_ES = [ { code: "Brownout detector was triggered", cause: "Caída de tensión al inicializar la etapa de radio.", fix: "Condensador de 10–100 µF junto al chip y fuente de 5 V con corriente suficiente.", }, { code: "Guru Meditation Error", cause: "Puntero inválido, desbordamiento de pila o uso incorrecto de interrupciones.", fix: "Analice el backtrace con addr2line y dimensione la pila de la tarea en FreeRTOS.", }, { code: "ADC2 no disponible con Wi-Fi", cause: "El controlador de radio reserva ADC2 mientras permanece activo.", fix: "Utilice los pines de ADC1 para sensores analógicos que funcionen junto con Wi-Fi.", }, { code: "Flash Read err / bootloader", cause: "Tensión o modo de flash incorrectos, o pin de strapping forzado en el arranque.", fix: "Compruebe la línea de 3,3 V, los pull-ups de arranque y la configuración de flash en esptool.", }, ]; export default async function Home({ params }) { const { locale } = await params; const isPt = locale === "pt"; const isEn = locale === "en"; const isEs = locale === "es"; const getLinkHref = (href) => getLocalizedHref(`/${locale}${href}`, locale); const seriesData = isPt ? seriesDataPt : isEs ? seriesDataEs : seriesDataEn; const frameworksData = isPt ? frameworksDataPt : isEs ? frameworksDataEs : frameworksDataEn; const tools = isPt ? TOOLS_PT : isEs ? TOOLS_ES : TOOLS_EN; const errors = isPt ? ERRORS_PT : isEs ? ERRORS_ES : ERRORS_EN; const seriesCount = Object.keys(seriesData).length; const frameworkCount = Object.keys(frameworksData).length; const featured = FEATURED.map((key) => [key, seriesData[key]]).filter(([, serie]) => Boolean(serie)); return (

{isPt ? ( <> O ESP32,
sem ruído. ) : isEs ? ( <> El ESP32,
sin ruido. ) : ( <> The ESP32,
without noise. )}

{isPt ? "Especificações, pinagem, comparações e diagnóstico em uma leitura só. Menos tradução de datasheet, mais tempo com o protótipo na bancada." : isEs ? "Especificaciones, patillaje, comparaciones y diagnóstico en una sola lectura. Menos traducción de hojas de datos, más tiempo con el prototipo en el banco de trabajo." : "Specifications, pinouts, comparisons and diagnostics in a single read. Less datasheet translation, more workbench time."}

{seriesCount} {isPt ? "séries" : isEs ? "series" : "series"} {frameworkCount} frameworks {isPt ? ( <> 78 capítulos no livro 100% em português ) : isEs ? ( <> 100% en español ) : ( <> 100% in English )}

{isPt ? "Séries em destaque" : isEs ? "Series destacadas" : "Featured series"}

{isPt ? "O essencial de cada família, antes de abrir o datasheet." : isEs ? "Lo esencial de cada familia, antes de abrir la hoja de datos." : "The essentials of each family before opening the datasheet."}

{isPt ? "Índice completo" : isEs ? "Índice completo" : "Full index"}
{featured.map(([key, serie]) => (

{key}

{serie.arquitetura}

{serie.descricao}

{serie.frequencia} {isPt ? "Ficha" : isEs ? "Ficha" : "Spec sheet"}
))}
{isPt && (
)}

{isPt ? "Ferramentas" : isEs ? "Herramientas" : "Tools"}

{isPt ? "Comece pelo problema." : isEs ? "Empiece por el problema." : "Start with the problem."}

{isPt ? "Cada ferramenta resolve uma etapa concreta do projeto, sem cadastro e sem rodeio." : isEs ? "Cada herramienta resuelve una fase concreta del proyecto, sin registros ni rodeos." : "Each tool addresses a concrete development phase, with no sign-ups and zero fluff."}

{tools.map((tool) => { const Icon = tool.icon; return (

{tool.title}

{tool.desc}

{tool.action} ); })}

{isPt ? "Diagnóstico" : isEs ? "Diagnóstico" : "Diagnostics"}

{isPt ? "O primeiro boot não precisa virar noite." : isEs ? "El primer arranque no tiene por qué desvelarlo." : "First boot doesn't have to take all night."}

{isPt ? "Os erros mais comuns têm causa conhecida. O guia parte da mensagem no terminal e chega ao ajuste de hardware ou firmware." : isEs ? "Los errores más comunes tienen una causa conocida. Esta guía parte del mensaje en el terminal y llega al ajuste de hardware o firmware." : "Common errors have known causes. This guide starts with the serial terminal log and leads to the hardware or firmware adjustment."}

{isPt ? "4 exemplos de 30+" : isEs ? "4 ejemplos de 30+" : "4 examples of 30+"}
{errors.map((item) => ( {item.code} {item.cause} {item.fix} ))}

{isPt ? "Curadoria independente" : isEs ? "Curaduría independiente" : "Independent curation"}

{isPt ? "Feito para consultar no meio do projeto." : isEs ? "Diseñado para consultar en mitad del proyecto." : "Built for quick lookup mid-project."}

{isPt ? "O ESPDocs organiza dados públicos da Espressif e aponta sempre para a fonte oficial. Para decisões críticas, o datasheet e o Technical Reference Manual continuam sendo a palavra final." : isEs ? "ESPDocs organiza datos públicos de Espressif y apunta siempre a la fuente oficial. Para decisiones críticas, la hoja de datos y el Technical Reference Manual continúan teniendo la última palabra." : "ESPDocs organizes public Espressif data and points directly to official sources. For critical engineering decisions, the datasheet and Technical Reference Manual remain the definitive authority."}

); }