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 seriesDataFr from "@/data/fr/series.json"; import frameworksDataFr from "@/data/fr/frameworks.json"; import seriesDataDe from "@/data/de/series.json"; import frameworksDataDe from "@/data/de/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 TOOLS_FR = [ { href: "/seletor", title: "Sélecteur intelligent", desc: "Répondez à huit questions sur votre projet et découvrez les puces recommandées, avec justification technique.", icon: SlidersHorizontal, action: "Trouver ma puce", }, { href: "/comparacao", title: "Comparateur de séries", desc: "Comparez jusqu'à quatre modèles côte à côte : cœurs, radio, mémoire, périphériques et sécurité.", icon: Scale, action: "Comparer maintenant", }, { href: "/diagnostico", title: "Diagnostic de pannes", desc: "Causes et solutions pour brownout, bootloop, Guru Meditation, watchdog et erreurs de flash.", icon: AlertTriangle, action: "Ouvrir le diagnostic", }, { href: "/componentes", title: "Component Registry", desc: "Pilotes, bibliothèques et BSP du registre officiel Espressif, avec manifeste prêt pour votre projet.", icon: Box, action: "Explorer les composants", }, { href: "/frameworks", title: "Frameworks et SDKs", desc: "ESP-IDF, Arduino, Rust, Matter, MicroPython et les outils gravitant autour de la puce.", icon: Terminal, action: "Voir les frameworks", }, { href: "/catalogo", title: "Catalogue de cartes", desc: "DevKits et modules réels, avec interface USB, capteurs intégrés et lien vers la boutique officielle.", icon: Cpu, action: "Voir les cartes", }, ]; const TOOLS_DE = [ { href: "/seletor", title: "Intelligente Auswahl", desc: "Beantworten Sie acht Fragen zu Ihrem Projekt und erhalten Sie passende Chip-Empfehlungen mit technischer Begründung.", icon: SlidersHorizontal, action: "Meinen Chip finden", }, { href: "/comparacao", title: "Serienvergleich", desc: "Vergleichen Sie bis zu vier Modelle nebeneinander: Kerne, Funk, Speicher, Peripherie und Sicherheit.", icon: Scale, action: "Jetzt vergleichen", }, { href: "/diagnostico", title: "Fehlerdiagnose", desc: "Ursachen und Lösungen für Brownout, Bootloops, Guru Meditation, Watchdog und Flash-Fehler.", icon: AlertTriangle, action: "Diagnose öffnen", }, { href: "/componentes", title: "Component Registry", desc: "Treiber, Bibliotheken und BSPs aus der offiziellen Espressif-Registry, mit fertigem Manifest für Ihr Projekt.", icon: Box, action: "Komponenten erkunden", }, { href: "/frameworks", title: "Frameworks & SDKs", desc: "ESP-IDF, Arduino, Rust, Matter, MicroPython und die Werkzeuge rund um den Chip.", icon: Terminal, action: "Frameworks ansehen", }, { href: "/catalogo", title: "Board-Katalog", desc: "Reale DevKits und Module, mit USB-Schnittstelle, integrierten Sensoren und Link zum offiziellen Shop.", icon: Cpu, action: "Boards ansehen", }, ]; 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 unavailable with 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.", }, ]; const ERRORS_FR = [ { code: "Brownout detector was triggered", cause: "Baisse de tension lors du démarrage de la radio.", fix: "Condensateur de 10 à 100 µF au plus près de la puce et alimentation 5 V avec courant suffisant.", }, { code: "Guru Meditation Error", cause: "Pointeur invalide, dépassement de pile ou mauvaise utilisation des interruptions.", fix: "Analysez le backtrace avec addr2line et dimensionnez la pile de la tâche sous FreeRTOS.", }, { code: "ADC2 indisponible avec le Wi-Fi", cause: "Le contrôleur radio réserve l'ADC2 tant qu'il est actif.", fix: "Utilisez les broches de l'ADC1 pour les capteurs analogiques fonctionnant conjointement avec le Wi-Fi.", }, { code: "Flash Read err / bootloader", cause: "Tension ou mode de flash incorrect, ou broche de strapping forcée au démarrage.", fix: "Vérifiez la ligne 3,3 V, les pull-ups de démarrage et la configuration de flash dans esptool.", }, ]; const ERRORS_DE = [ { code: "Brownout detector was triggered", cause: "Spannungseinbruch beim Starten der Funkeinheit.", fix: "Kondensator mit 10–100 µF nah am Chip und 5-V-Netzteil mit ausreichender Stromstärke.", }, { code: "Guru Meditation Error", cause: "Ungültiger Zeiger, Stack-Überlauf oder fehlerhafte Interrupt-Nutzung.", fix: "Backtrace mit addr2line analysieren und Stack-Größe der FreeRTOS-Task anpassen.", }, { code: "ADC2 nicht verfügbar bei aktivem Wi-Fi", cause: "Der Funk-Controller reserviert ADC2, solange er aktiv ist.", fix: "Nutzen Sie ADC1-Pins für analoge Sensoren, die gleichzeitig mit Wi-Fi betrieben werden.", }, { code: "Flash Read err / bootloader", cause: "Falsche Flash-Spannung/-Modus oder beim Booten falsch beschalteter Strapping-Pin.", fix: "3,3-V-Schiene, Boot-Pull-ups und Flash-Konfiguration in esptool überprüfen.", }, ]; export default async function Home({ params }) { const { locale } = await params; const isPt = locale === "pt"; const isEn = locale === "en"; const isEs = locale === "es"; const isFr = locale === "fr"; const isDe = locale === "de"; const getLinkHref = (href) => getLocalizedHref(`/${locale}${href}`, locale); const seriesData = isPt ? seriesDataPt : isEs ? seriesDataEs : isFr ? seriesDataFr : isDe ? seriesDataDe : seriesDataEn; const frameworksData = isPt ? frameworksDataPt : isEs ? frameworksDataEs : isFr ? frameworksDataFr : isDe ? frameworksDataDe : frameworksDataEn; const tools = isPt ? TOOLS_PT : isEs ? TOOLS_ES : isFr ? TOOLS_FR : isDe ? TOOLS_DE : TOOLS_EN; const errors = isPt ? ERRORS_PT : isEs ? ERRORS_ES : isFr ? ERRORS_FR : isDe ? ERRORS_DE : 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. ) : isFr ? ( <> L'ESP32,
sans bruit. ) : isDe ? ( <> Der ESP32,
ohne Umwege. ) : ( <> 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." : isFr ? "Spécifications, brochage, comparaisons et diagnostics en une seule lecture. Moins de traduction de fiches techniques, plus de temps à l'établi." : isDe ? "Spezifikationen, Pinbelegung, Vergleiche und Diagnose auf einen Blick. Weniger Datenblatt-Übersetzung, mehr Zeit am Prüfplatz." : "Specifications, pinouts, comparisons and diagnostics in a single read. Less datasheet translation, more workbench time."}

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

{isPt ? "Séries em destaque" : isEs ? "Series destacadas" : isFr ? "Séries en vedette" : isDe ? "Vorgestellte Serien" : "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." : isFr ? "L'essentiel de chaque famille, avant d'ouvrir la fiche technique." : isDe ? "Das Wesentliche jeder Familie, bevor Sie das Datenblatt öffnen." : "The essentials of each family before opening the datasheet."}

{isPt ? "Índice completo" : isEs ? "Índice completo" : isFr ? "Index complet" : isDe ? "Vollständiger Index" : "Full index"}
{featured.map(([key, serie]) => (

{key}

{serie.arquitetura}

{serie.descricao}

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

{isPt ? "Ferramentas" : isEs ? "Herramientas" : isFr ? "Outils" : isDe ? "Werkzeuge" : "Tools"}

{isPt ? "Comece pelo problema." : isEs ? "Empiece por el problema." : isFr ? "Commencez par le problème." : isDe ? "Beginnen Sie beim Problem." : "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." : isFr ? "Chaque outil répond à une étape concrète du projet, sans inscription ni détour." : isDe ? "Jedes Werkzeug löst einen konkreten Projektschritt – ohne Registrierung und ohne Umwege." : "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" : isFr ? "Diagnostic" : isDe ? "Diagnose" : "Diagnostics"}

{isPt ? "O primeiro boot não precisa virar noite." : isEs ? "El primer arranque no tiene por qué desvelarlo." : isFr ? "Le premier démarrage n'a pas à vous gâcher la nuit." : isDe ? "Der erste Boot muss nicht die Nacht kosten." : "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." : isFr ? "Les erreurs les plus courantes ont une cause connue. Ce guide part du message dans le terminal pour arriver au réglage matériel ou logiciel." : isDe ? "Die häufigsten Fehler haben bekannte Ursachen. Dieser Leitfaden geht von der Terminalmeldung aus und führt zur passenden Hardware- oder Firmware-Anpassung." : "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+" : isFr ? "4 exemples sur 30+" : isDe ? "4 Beispiele von 30+" : "4 examples of 30+"}
{errors.map((item) => ( {item.code} {item.cause} {item.fix} ))}

{isPt ? "Curadoria independente" : isEs ? "Curaduría independiente" : isFr ? "Sélection indépendante" : isDe ? "Unabhängige Kuration" : "Independent curation"}

{isPt ? "Feito para consultar no meio do projeto." : isEs ? "Diseñado para consultar en mitad del proyecto." : isFr ? "Conçu pour être consulté en plein projet." : isDe ? "Gemacht für das Nachschlagen mitten im Projekt." : "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." : isFr ? "ESPDocs organise les données publiques d'Espressif et renvoie systématiquement vers la source officielle. Pour les décisions critiques, la fiche technique et le Technical Reference Manual restent la référence définitive." : isDe ? "ESPDocs strukturiert öffentliche Espressif-Daten und verweist stets auf die offizielle Quelle. Für kritische Entscheidungen bleiben das Datenblatt und das Technical Reference Manual maßgeblich." : "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."}

); }