diff --git a/app/catalogo/page.jsx b/app/catalogo/page.jsx index 3d56c10..63d1f7c 100644 --- a/app/catalogo/page.jsx +++ b/app/catalogo/page.jsx @@ -4,380 +4,389 @@ import { useState, useEffect } from 'react'; import Header from "@/components/Header"; import Footer from "@/components/Footer"; import BoardCard from "@/components/BoardCard"; +import { + Search, + Filter, + ShoppingCart, + CheckCircle, + AlertTriangle, + RefreshCw, + Layers, + ChevronDown +} from 'lucide-react'; export default function PlacasPage() { - const [boards, setBoards] = useState([]); - const [filteredBoards, setFilteredBoards] = useState([]); - const [headers, setHeaders] = useState([]); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - const [searchTerm, setSearchTerm] = useState(''); - const [activeFilters, setActiveFilters] = useState({}); - const [filterOptions, setFilterOptions] = useState({}); + const [boards, setBoards] = useState([]); + const [filteredBoards, setFilteredBoards] = useState([]); + const [headers, setHeaders] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [searchTerm, setSearchTerm] = useState(''); + const [activeFilters, setActiveFilters] = useState({}); + const [filterOptions, setFilterOptions] = useState({}); - const excludedColumns = ['Nome', 'Link', 'Imagem']; + const excludedColumns = ['Nome', 'Link', 'Imagem', 'Loja Oficial']; - useEffect(() => { - fetchBoards(); - }, []); + useEffect(() => { + fetchBoards(); + }, []); - useEffect(() => { - applyFilters(); - }, [boards, searchTerm, activeFilters]); + useEffect(() => { + applyFilters(); + }, [boards, searchTerm, activeFilters]); - const fetchBoards = async () => { - try { - setLoading(true); - const response = await fetch('/api/placas'); - - if (!response.ok) { - throw new Error('Erro ao carregar dados das placas'); - } + const fetchBoards = async () => { + try { + setLoading(true); + const response = await fetch('/api/placas'); + + if (!response.ok) { + throw new Error('Erro ao carregar dados das placas'); + } - const result = await response.json(); - setBoards(result.data); - setHeaders(result.headers); - setFilteredBoards(result.data); - - generateFilterOptions(result.data, result.headers); - } catch (err) { - setError(err.message); - } finally { - setLoading(false); - } - }; + const result = await response.json(); + setBoards(result.data); + setHeaders(result.headers); + setFilteredBoards(result.data); + + generateFilterOptions(result.data, result.headers); + } catch (err) { + setError(err.message); + } finally { + setLoading(false); + } + }; - const generateFilterOptions = (data, headers) => { - const options = {}; - const filterableColumns = headers.filter(h => !excludedColumns.includes(h)); + const generateFilterOptions = (data, headers) => { + const options = {}; + const filterableColumns = headers.filter(h => !excludedColumns.includes(h)); - filterableColumns.forEach(column => { - const uniqueValues = new Set(); - data.forEach(item => { - const value = item[column]; - if (value && value.toString().trim()) { - uniqueValues.add(value.toString().trim()); - } - }); - - const values = Array.from(uniqueValues).sort(); - - // Verificar se é um filtro binário (apenas Sim/Não/Opcional) - const binaryValues = ['Sim', 'Não', 'Opcional']; - const isBinaryFilter = values.every(v => binaryValues.includes(v)); - - options[column] = { - values: values, - isBinary: isBinaryFilter - }; - }); + filterableColumns.forEach(column => { + const uniqueValues = new Set(); + data.forEach(item => { + const value = item[column]; + if (value && value.toString().trim()) { + uniqueValues.add(value.toString().trim()); + } + }); + + const values = Array.from(uniqueValues).sort(); + + // Verificar se é um filtro binário (apenas Sim/Não/Opcional) + const binaryValues = ['Sim', 'Não', 'Opcional']; + const isBinaryFilter = values.every(v => binaryValues.includes(v)); + + options[column] = { + values: values, + isBinary: isBinaryFilter + }; + }); - setFilterOptions(options); - }; + setFilterOptions(options); + }; - const applyFilters = () => { - let filtered = [...boards]; + const applyFilters = () => { + let filtered = [...boards]; - if (searchTerm) { - filtered = filtered.filter(board => { - const searchLower = searchTerm.toLowerCase(); - return ( - board.Nome?.toLowerCase().includes(searchLower) || - board.Descrição?.toLowerCase().includes(searchLower) - ); - }); - } + if (searchTerm) { + filtered = filtered.filter(board => { + const searchLower = searchTerm.toLowerCase(); + return ( + board.Nome?.toLowerCase().includes(searchLower) || + board.Descrição?.toLowerCase().includes(searchLower) + ); + }); + } - Object.keys(activeFilters).forEach(column => { - if (activeFilters[column] && activeFilters[column].length > 0) { - filtered = filtered.filter(board => { - const boardValue = board[column]?.toString().trim(); - - // Para filtros binários, o valor armazenado é 'binary-enabled' - if (activeFilters[column].includes('binary-enabled')) { - return boardValue === 'Sim' || boardValue === 'Opcional'; - } - - return activeFilters[column].includes(boardValue); - }); - } - }); + Object.keys(activeFilters).forEach(column => { + if (activeFilters[column] && activeFilters[column].length > 0) { + filtered = filtered.filter(board => { + const boardValue = board[column]?.toString().trim(); + + // Para filtros binários, o valor armazenado é 'binary-enabled' + if (activeFilters[column].includes('binary-enabled')) { + return boardValue === 'Sim' || boardValue === 'Opcional'; + } + + return activeFilters[column].includes(boardValue); + }); + } + }); - setFilteredBoards(filtered); - }; + setFilteredBoards(filtered); + }; - const handleFilterToggle = (column, value) => { - setActiveFilters(prev => { - const newFilters = { ...prev }; - - if (!newFilters[column]) { - newFilters[column] = [value]; - } else { - const index = newFilters[column].indexOf(value); - if (index > -1) { - // Remove o valor (criar novo array sem o valor) - newFilters[column] = newFilters[column].filter(v => v !== value); - if (newFilters[column].length === 0) { - delete newFilters[column]; - } - } else { - // Adiciona o valor (criar novo array com o valor) - newFilters[column] = [...newFilters[column], value]; - } - } + const handleFilterToggle = (column, value) => { + setActiveFilters(prev => { + const newFilters = { ...prev }; + + if (!newFilters[column]) { + newFilters[column] = [value]; + } else { + const index = newFilters[column].indexOf(value); + if (index > -1) { + // Remove o valor + newFilters[column] = newFilters[column].filter(v => v !== value); + if (newFilters[column].length === 0) { + delete newFilters[column]; + } + } else { + // Adiciona o valor + newFilters[column] = [...newFilters[column], value]; + } + } - return newFilters; - }); - }; + return newFilters; + }); + }; - const clearFilters = () => { - setActiveFilters({}); - setSearchTerm(''); - }; + const clearFilters = () => { + setActiveFilters({}); + setSearchTerm(''); + }; - const activeFilterCount = Object.keys(activeFilters).length + (searchTerm ? 1 : 0); + const activeFilterCount = Object.keys(activeFilters).length + (searchTerm ? 1 : 0); - if (loading) { - return ( -
-
+ if (loading) { + return ( +
+
-
-
-
⏳
-

Carregando placas...

-
-
+
+
+ +

Consultando banco de placas...

+
+
-
-
- ); - } +
+ ); + } - if (error) { - return ( -
-
+ if (error) { + return ( +
+
-
-
-
❌
-

Erro ao carregar dados

-

{error}

+
+
+
+ +
+

Falha ao sincronizar dados

+

{error}

- -
-
+ +
+
-
-
- ); - } +
+ ); + } - const filterableColumns = headers.filter(h => !excludedColumns.includes(h)); + const filterableColumns = headers.filter(h => !excludedColumns.includes(h)); - return ( -
-
+ return ( +
+
-
-
-
- 🛒 - Encontre sua placa ideal -
- -

- Catálogo de Placas ESP32 -

+
+ {/* Top Hero Heading Block */} +
+
+ + Encontre sua placa ideal +
+ +

+ Catálogo de Placas ESP32 +

-

- Encontre a placa perfeita para o seu projeto -

-
- - - -

- Todos os links são verificados e de fontes confiáveis -

-
-
+

+ Compare e selecione placas oficiais e alternativas de desenvolvimento do microcontrolador ESP32 para seus projetos. +

-
-
-
- {/* Header dos Filtros */} -
-
-
-

- 🔍 Filtros -

- {activeFilterCount > 0 && ( -

- {activeFilterCount} filtro(s) ativo(s) -

- )} -
- {activeFilterCount > 0 && ( - - )} -
-
+
+ +

+ Links de lojas integradas de fontes verificadas e confiáveis +

+
+
- {/* Conteúdo dos Filtros */} -
- {/* Barra de Busca */} -
- -
- setSearchTerm(e.target.value)} - className="w-full px-4 py-3 pl-10 border-2 border-gray-200 rounded-xl focus:border-purple-500 focus:outline-none transition-colors text-sm bg-gray-50 focus:bg-white" - /> - - - -
-
+
+ {/* Left Filters Sidebar */} +
+
+ + {/* Sidebar Banner Header */} +
+
+
+

+ + Filtros de Busca +

+ {activeFilterCount > 0 && ( +

+ {activeFilterCount} selecionado(s) +

+ )} +
+ + {activeFilterCount > 0 && ( + + )} +
+
- {/* Separador */} -
+ {/* Sidebar Filters Area */} +
+ {/* Text search by name */} +
+ +
+ setSearchTerm(e.target.value)} + className="w-full px-4 py-3 pl-10 border border-slate-200 dark:border-slate-800 rounded-2xl focus:ring-2 focus:ring-purple-500 dark:focus:ring-purple-500 focus:outline-none transition-colors text-xs bg-slate-50/50 dark:bg-slate-950/20 text-slate-800 dark:text-slate-100" + /> + +
+
- {/* Filtros por Categoria */} -
- {filterableColumns.map((column) => { - const filterData = filterOptions[column]; - if (!filterData) return null; - - const isActive = activeFilters[column]?.length > 0; - - return ( -
- {filterData.isBinary ? ( - // Filtro binário: checkbox integrado ao título - - ) : ( - // Filtro normal: título separado + múltiplas opções - <> -

- {column} - {isActive && ( - - {activeFilters[column].length} - - )} -

-
- {filterData.values.map((option) => ( - - ))} -
- - )} -
- ); - })} -
-
-
-
+ {/* Dinamic filters container with customized scrollbar */} +
+ {filterableColumns.map((column) => { + const filterData = filterOptions[column]; + if (!filterData) return null; + + const isActive = activeFilters[column]?.length > 0; + + return ( +
+ {filterData.isBinary ? ( + // Binary filter (checkbox inside title wrapper) +
+
+
+
- {filteredBoards.length === 0 ? ( -
-
🔍
-

Nenhuma placa encontrada

-

Tente ajustar os filtros

-
- ) : ( -
- {filteredBoards.map((board, index) => ( - - ))} -
- )} -
-
- + {/* Right Catalog Boards Grid */} +
+
+

+ Total Encontrado: {filteredBoards.length} Placa(s) +

+
-
- ); -} + {filteredBoards.length === 0 ? ( +
+ +

Nenhuma Placa Correspondente

+

Tente ajustar ou redefinir seus filtros laterais para expandir a busca.

+
+ ) : ( +
+ {filteredBoards.map((board, index) => ( + + ))} +
+ )} + + + -// Estilos customizados para scrollbar -const styles = ` - .custom-scrollbar::-webkit-scrollbar { - width: 6px; - } - - .custom-scrollbar::-webkit-scrollbar-track { - background: #f1f1f1; - border-radius: 10px; - } - - .custom-scrollbar::-webkit-scrollbar-thumb { - background: linear-gradient(to bottom, #3b82f6, #9333ea); - border-radius: 10px; - } - - .custom-scrollbar::-webkit-scrollbar-thumb:hover { - background: linear-gradient(to bottom, #2563eb, #7c3aed); - } -`; + + ); } \ No newline at end of file diff --git a/components/Header.jsx b/components/Header.jsx index 9278ab5..838d934 100644 --- a/components/Header.jsx +++ b/components/Header.jsx @@ -1,181 +1,223 @@ "use client"; import { usePathname } from "next/navigation"; -import { useState } from "react"; +import { useState, useEffect } from "react"; import Link from "next/link"; - -import Button from "@mui/material/Button"; -import Drawer from "@mui/material/Drawer"; -import List from "@mui/material/List"; -import ListItem from "@mui/material/ListItem"; - -import MenuIcon from "@mui/icons-material/Menu"; -import HomeIcon from "@mui/icons-material/Home"; -import AboutIcon from "@mui/icons-material/Info"; -import ModelsIcon from "@mui/icons-material/Memory"; -import FrameworksIcon from "@mui/icons-material/Apps"; -import CompareIcon from "@mui/icons-material/CompareArrows"; -import ShoppingCartIcon from "@mui/icons-material/ShoppingCart"; -import MenuBookIcon from "@mui/icons-material/MenuBook"; -import FindInPageIcon from "@mui/icons-material/FindInPage"; +import { useTheme } from "next-themes"; +import { createPortal } from "react-dom"; +import { + Home, + Info, + BookOpen, + Cpu, + SlidersHorizontal, + Terminal, + Scale, + ShoppingBag, + Menu, + X, + Sun, + Moon +} from "lucide-react"; export default function Header() { - const [drawerOpen, setDrawerOpen] = useState(false); + const [drawerOpen, setDrawerOpen] = useState(false); + const [mounted, setMounted] = useState(false); + const pathname = usePathname(); - const pathname = usePathname(); - const menuItems = [ - { text: "Início", href: "/", icon: , featured: true }, - { text: "Sobre o Projeto", brief: "Sobre", href: "/sobre", icon: }, - { text: "Glossário", href: "/glossario", icon: }, - { text: "Séries", href: "/series", icon: , featured: true }, - { text: "Seletor de ESP32", brief: "Seletor", href: "/seletor", icon: , featured: true }, - { text: "Frameworks", href: "/frameworks", icon: , featured: true }, - { text: "Comparar Séries", brief: "Comparar", href: "/comparacao", icon: , featured: true }, - { text: "Catálogo de Placas", brief: "Catálogo", href: "/catalogo", icon: }, - ]; + useEffect(() => { + setMounted(true); + }, []); - const featuredItems = menuItems.filter(item => item.featured); + const menuItems = [ + { text: "Início", href: "/", icon: , featured: true }, + { text: "Sobre o Projeto", brief: "Sobre", href: "/sobre", icon: }, + { text: "Glossário", href: "/glossario", icon: }, + { text: "Séries", href: "/series", icon: , featured: true }, + { text: "Seletor de ESP32", brief: "Seletor", href: "/seletor", icon: , featured: true }, + { text: "Frameworks", href: "/frameworks", icon: , featured: true }, + { text: "Comparar Séries", brief: "Comparar", href: "/comparacao", icon: , featured: true }, + { text: "Catálogo de Placas", brief: "Catálogo", href: "/catalogo", icon: }, + ]; - function isActive(href) { - if (href === "/") { - return pathname === "/"; - } - - return String(pathname).includes(href) && href !== "/"; - } + const featuredItems = menuItems.filter(item => item.featured); - return ( -
-
- -

- ESPDocs -

- + function isActive(href) { + if (href === "/") { + return pathname === "/"; + } + return String(pathname).includes(href) && href !== "/"; + } - {/* Menu Desktop - visível em telas médias e grandes */} - + // Lock scroll when mobile menu is open + useEffect(() => { + if (drawerOpen) { + document.body.style.overflow = "hidden"; + } else { + document.body.style.overflow = ""; + } + return () => { + document.body.style.overflow = ""; + }; + }, [drawerOpen]); - {/* Botão Menu Mobile - visível apenas em telas pequenas */} -
- -
-
+ return ( +
+
+ {/* LOGO */} + +

+ ESPDocs +

+ - {/* Drawer Mobile */} - setDrawerOpen(false)} - id="mobile-menu-drawer" - > -
-
-

- Menu -

-
-
+ {/* Menu Desktop */} +
- ); + {/* Full Menu Burger Trigger */} + + + + {/* Botões Mobile (Theme + Burger) */} +
+ + +
+ + + {/* Render side-panel and overlay at body level via React Portal to prevent layout leakage */} + {mounted && createPortal( + <> + {drawerOpen && ( +
setDrawerOpen(false)} + /> + )} + +
+ {/* Drawer Header */} +
+

+ Menu Navegação +

+ +
+ + {/* Drawer Menu Items */} + + + {/* Drawer Footer Info */} +
+

+ ESPDocs • Plataforma Não Oficial +

+
+
+ + , document.body + )} +
+ ); +} + +/* Internal ThemeToggle Component */ +function ThemeToggle() { + const { resolvedTheme, setTheme } = useTheme(); + const [mounted, setMounted] = useState(false); + + useEffect(() => setMounted(true), []); + + if (!mounted) { + return ( +
+ ); + } + + return ( + + ); } \ No newline at end of file diff --git a/components/Providers.jsx b/components/Providers.jsx new file mode 100644 index 0000000..cd21f87 --- /dev/null +++ b/components/Providers.jsx @@ -0,0 +1,11 @@ +"use client"; + +import { ThemeProvider } from "next-themes"; + +export default function Providers({ children }) { + return ( + + {children} + + ); +} diff --git a/components/SeriesTabMenu.jsx b/components/SeriesTabMenu.jsx index 7aa41eb..5f58710 100644 --- a/components/SeriesTabMenu.jsx +++ b/components/SeriesTabMenu.jsx @@ -1,80 +1,82 @@ 'use client'; import { useState } from 'react'; +import { ChevronDown } from 'lucide-react'; export default function SeriesTabMenu({ tabs, color }) { - const availableTabs = tabs.filter(tab => tab.available); - const [activeTab, setActiveTab] = useState(availableTabs[0]?.id || 'specs'); + const availableTabs = tabs.filter(tab => tab.available); + const [activeTab, setActiveTab] = useState(availableTabs[0]?.id || 'specs'); - const activeTabContent = availableTabs.find(tab => tab.id === activeTab)?.content; + const activeTabContent = availableTabs.find(tab => tab.id === activeTab)?.content; - return ( -
-
- {availableTabs.map((tab) => ( - - ))} -
+ return ( +
+ {/* Desktop Tabs */} +
+ {availableTabs.map((tab) => { + const isActive = activeTab === tab.id; + return ( + + ); + })} +
-
-
- - -
- {availableTabs.map((tab) => ( - tab.id !== activeTab && ( - - ) - ))} -
-
-
+ {/* Mobile Dropdown Tab Selector */} +
+
+ + +
+ {availableTabs.map((tab) => ( + tab.id !== activeTab && ( + + ) + ))} +
+
+
-
- {activeTabContent} -
-
- ); +
+ {activeTabContent} +
+
+ ); } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8aca966..c3abc6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,8 +12,11 @@ "@emotion/styled": "^11.14.1", "@mui/icons-material": "^7.3.4", "@mui/material": "^7.3.4", + "framer-motion": "^12.40.0", "googleapis": "^165.0.0", + "lucide-react": "^1.16.0", "next": "^15.5.9", + "next-themes": "^0.4.6", "react": "19.1.0", "react-dom": "19.1.0" }, @@ -1877,16 +1880,6 @@ "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "license": "MIT" }, - "node_modules/@types/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.8.tgz", - "integrity": "sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==", - "license": "MIT", - "peer": true, - "dependencies": { - "csstype": "^3.2.2" - } - }, "node_modules/@types/react-transition-group": { "version": "4.4.12", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", @@ -4019,6 +4012,33 @@ "node": ">=12.20.0" } }, + "node_modules/framer-motion": { + "version": "12.40.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.40.0.tgz", + "integrity": "sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.40.0", + "motion-utils": "^12.39.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -5453,6 +5473,15 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, + "node_modules/lucide-react": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.16.0.tgz", + "integrity": "sha512-dYwyPzb4MEKpGUmNYk3WKWPnMrHs3FKM+q94kAnJrcDIqqn1hq2xY8scaS2ovsOCM5D51ey2gaRG3PBb1vgoYQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -5528,6 +5557,21 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/motion-dom": { + "version": "12.40.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.40.0.tgz", + "integrity": "sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.39.0" + } + }, + "node_modules/motion-utils": { + "version": "12.39.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz", + "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5627,6 +5671,16 @@ } } }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -7098,21 +7152,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", diff --git a/package.json b/package.json index 4256724..de13c70 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,11 @@ "@emotion/styled": "^11.14.1", "@mui/icons-material": "^7.3.4", "@mui/material": "^7.3.4", + "framer-motion": "^12.40.0", "googleapis": "^165.0.0", + "lucide-react": "^1.16.0", "next": "^15.5.9", + "next-themes": "^0.4.6", "react": "19.1.0", "react-dom": "19.1.0" }, diff --git a/public/conexoes/ESP32-C2.json b/public/conexoes/ESP32-C2.json new file mode 100644 index 0000000..fca199a --- /dev/null +++ b/public/conexoes/ESP32-C2.json @@ -0,0 +1,307 @@ +[ + { + "numero": "1", + "nome": "ANT", + "tipo": "analog", + "funcoes": ["Conexão de antena de RF (Wi-Fi e Bluetooth)"], + "categorias": ["Antena", "RF"], + "avisos": ["Pino de RF dedicado. Evite traçar pistas longas ou sem casamento de impedância de 50 ohms."] + }, + { + "numero": "2", + "nome": "VDDA3P3", + "tipo": "power", + "funcoes": ["Alimentação analógica de 3.3V"], + "categorias": ["Power"], + "avisos": [ + "Tensão recomendada: 3.3V (3.0V a 3.6V)", + "Fornece energia para os circuitos analógicos e de RF do chip" + ] + }, + { + "numero": "3", + "nome": "VDDA3P3", + "tipo": "power", + "funcoes": ["Alimentação analógica de 3.3V"], + "categorias": ["Power"], + "avisos": [ + "Tensão recomendada: 3.3V (3.0V a 3.6V)", + "Fornece energia para os circuitos analógicos e de RF do chip" + ] + }, + { + "numero": "4", + "nome": "GPIO0", + "tipo": "io", + "alimentacao": ["VDD3P3_RTC"], + "funcoes": [ + "GPIO0", + "ADC1_CH0" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC1 Canal 0"] + }, + { + "numero": "5", + "nome": "GPIO1", + "tipo": "io", + "alimentacao": ["VDD3P3_RTC"], + "funcoes": [ + "GPIO1", + "ADC1_CH1" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC1 Canal 1"] + }, + { + "numero": "6", + "nome": "GPIO2", + "tipo": "io", + "alimentacao": ["VDD3P3_RTC"], + "funcoes": [ + "GPIO2", + "ADC1_CH2", + "FSPIQ" + ], + "categorias": [ + "GPIO", + "ADC", + "SPI" + ], + "avisos": ["Mapeado para a função SPI MISO (FSPIQ) por padrão na inicialização do flash"] + }, + { + "numero": "7", + "nome": "CHIP_EN", + "tipo": "analog", + "funcoes": ["Habilitar o chip (Power-up / Reset)"], + "categorias": ["Power"], + "avisos": [ + "Ativo Alto. Puxe para nível alto para inicializar o chip.", + "Não deixe este pino flutuando. Use um circuito RC de atraso externo para inicialização estável." + ] + }, + { + "numero": "8", + "nome": "GPIO3", + "tipo": "io", + "alimentacao": ["VDD3P3_RTC"], + "funcoes": [ + "GPIO3", + "ADC1_CH3" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC1 Canal 3"] + }, + { + "numero": "9", + "nome": "GPIO4", + "tipo": "io", + "alimentacao": ["VDD3P3_RTC"], + "funcoes": [ + "GPIO4", + "MTMS", + "FSPIQ", + "ADC1_CH4" + ], + "categorias": [ + "GPIO", + "JTAG", + "SPI", + "ADC" + ], + "avisos": [ + "Pino multifuncional: JTAG MTMS, SPI2 MISO e ADC1 Canal 4.", + "Pode ser usado para depuração JTAG em conjunto com outros pinos JTAG." + ] + }, + { + "numero": "10", + "nome": "GPIO5", + "tipo": "io", + "alimentacao": ["VDD3P3_RTC"], + "funcoes": [ + "GPIO5", + "MTDI", + "FSPIWP" + ], + "categorias": [ + "GPIO", + "JTAG", + "SPI" + ], + "avisos": ["Pino multifuncional: JTAG MTDI e SPI2 Write Protect (FSPIWP)."] + }, + { + "numero": "11", + "nome": "VDD3P3_RTC", + "tipo": "power", + "funcoes": ["Alimentação do domínio de RTC e IOs de baixo consumo"], + "categorias": ["Power"], + "avisos": ["Tensão recomendada: 3.3V"] + }, + { + "numero": "12", + "nome": "GPIO6", + "tipo": "io", + "alimentacao": ["VDD3P3_RTC"], + "funcoes": [ + "GPIO6", + "MTCK", + "FSPICLK" + ], + "categorias": [ + "GPIO", + "JTAG", + "SPI" + ], + "avisos": ["Pino multifuncional: JTAG MTCK e SPI2 Clock (FSPICLK)."] + }, + { + "numero": "13", + "nome": "GPIO7", + "tipo": "io", + "alimentacao": ["VDD3P3_RTC"], + "funcoes": [ + "GPIO7", + "MTDO", + "FSPID" + ], + "categorias": [ + "GPIO", + "JTAG", + "SPI" + ], + "avisos": ["Pino multifuncional: JTAG MTDO e SPI2 MOSI (FSPID)."] + }, + { + "numero": "14", + "nome": "GPIO8", + "tipo": "io", + "alimentacao": ["VDD3P3_CPU"], + "funcoes": ["GPIO8"], + "categorias": ["GPIO", "Strapping"], + "avisos": [ + "Pino de Strapping para controle de boot.", + "Em conjunto com o GPIO9, seleciona o modo de inicialização do SoC (deve estar em 1 durante o reset para Joint Download Boot se GPIO9=0)." + ] + }, + { + "numero": "15", + "nome": "GPIO9", + "tipo": "io", + "alimentacao": ["VDD3P3_CPU"], + "funcoes": ["GPIO9"], + "categorias": ["GPIO", "Strapping"], + "avisos": [ + "Pino de Strapping principal. Nível alto (1) no reset activa SPI Boot (padrão via pull-up fraco).", + "Nível baixo (0) no reset coloca o chip no modo de download UART/SPI." + ] + }, + { + "numero": "16", + "nome": "GPIO10", + "tipo": "io", + "alimentacao": ["VDD3P3_CPU"], + "funcoes": [ + "GPIO10", + "FSPICS0" + ], + "categorias": [ + "GPIO", + "SPI" + ], + "avisos": ["Pino multifuncional: SPI2 Chip Select 0 (FSPICS0)."] + }, + { + "numero": "17", + "nome": "VDD3P3_CPU", + "tipo": "power", + "funcoes": ["Alimentação digital da CPU e IOs correspondentes (3.3V)"], + "categorias": ["Power"], + "avisos": ["Tensão recomendada: 3.3V"] + }, + { + "numero": "18", + "nome": "GPIO18", + "tipo": "io", + "alimentacao": ["VDD3P3_CPU"], + "funcoes": ["GPIO18"], + "categorias": ["GPIO"] + }, + { + "numero": "19", + "nome": "GPIO19", + "tipo": "io", + "alimentacao": ["VDD3P3_CPU"], + "funcoes": [ + "GPIO19", + "U0RXD" + ], + "categorias": [ + "GPIO", + "UART" + ], + "avisos": ["Pino de recepção UART0 (Serial RX por padrão para gravação e monitoramento)."] + }, + { + "numero": "20", + "nome": "GPIO20", + "tipo": "io", + "alimentacao": ["VDD3P3_CPU"], + "funcoes": [ + "GPIO20", + "U0TXD" + ], + "categorias": [ + "GPIO", + "UART" + ], + "avisos": ["Pino de transmissão UART0 (Serial TX por padrão para gravação e monitoramento)."] + }, + { + "numero": "21", + "nome": "VDDA", + "tipo": "power", + "funcoes": ["Alimentação de entrada analógica de 3.3V"], + "categorias": ["Power"] + }, + { + "numero": "22", + "nome": "XTAL_N", + "tipo": "analog", + "funcoes": ["Conexão externa do cristal oscilador (Saída)"], + "categorias": ["Clock"] + }, + { + "numero": "23", + "nome": "XTAL_P", + "tipo": "analog", + "funcoes": ["Conexão externa do cristal oscilador (Entrada)"], + "categorias": ["Clock"] + }, + { + "numero": "24", + "nome": "VDDA", + "tipo": "power", + "funcoes": ["Alimentação de entrada analógica de 3.3V"], + "categorias": ["Power"] + }, + { + "numero": "25", + "nome": "GND", + "tipo": "power", + "funcoes": ["Pino de aterramento central (Exposed Pad)"], + "categorias": ["Power"], + "avisos": ["Deve ser devidamente soldado ao plano de terra (GND) da PCB para desempenho estável e dissipação térmica."] + } +] diff --git a/public/conexoes/ESP32-C61.json b/public/conexoes/ESP32-C61.json new file mode 100644 index 0000000..f2e85f2 --- /dev/null +++ b/public/conexoes/ESP32-C61.json @@ -0,0 +1,536 @@ +[ + { + "numero": "1", + "nome": "ANT_2G", + "tipo": "analog", + "funcoes": ["Conexão de antena de RF (Wi-Fi e Bluetooth)"], + "categorias": ["Antena", "RF"], + "avisos": ["Pino de RF dedicado a 2.4 GHz. Requer casamento de impedância de 50 ohms."] + }, + { + "numero": "2", + "nome": "VDDA3", + "tipo": "power", + "funcoes": ["Alimentação do domínio analógico de 3.3V"], + "categorias": ["Power"], + "avisos": ["Tensão recomendada: 3.3V (3.0V a 3.6V). Fornece energia para circuitos de RF e clock."] + }, + { + "numero": "3", + "nome": "VDDA4", + "tipo": "power", + "funcoes": ["Alimentação do domínio analógico de 3.3V"], + "categorias": ["Power"], + "avisos": ["Tensão recomendada: 3.3V (3.0V a 3.6V). Fornece energia para circuitos de RF e clock."] + }, + { + "numero": "4", + "nome": "CHIP_PU", + "tipo": "analog", + "funcoes": ["Habilitar o chip (Power-up / Reset)"], + "categorias": ["Power"], + "avisos": [ + "Ativo Alto. Puxe para nível alto para inicializar o chip.", + "Não deixe este pino flutuando. Recomenda-se usar um circuito RC externo para reset limpo." + ] + }, + { + "numero": "5", + "nome": "VDDPST1", + "tipo": "power", + "funcoes": ["Alimentação digital dos domínios HP (High Performance) e LP (Low Power)"], + "categorias": ["Power"], + "avisos": ["Tensão recomendada: 3.3V. Alimenta a parte digital de baixo consumo e pinos associados."] + }, + { + "numero": "6", + "nome": "GPIO0", + "tipo": "io", + "alimentacao": ["VDDPST1"], + "funcoes": [ + "GPIO0", + "XTAL_32K_P" + ], + "categorias": [ + "GPIO", + "Clock" + ], + "avisos": ["Pino multifuncional de baixo consumo. Pode ser conectado ao cristal oscilador de 32 kHz externo (Entrada P)."] + }, + { + "numero": "7", + "nome": "GPIO1", + "tipo": "io", + "alimentacao": ["VDDPST1"], + "funcoes": [ + "GPIO1", + "XTAL_32K_N", + "ADC1_CH0" + ], + "categorias": [ + "GPIO", + "Clock", + "ADC" + ], + "avisos": ["Pino multifuncional. Conexão do cristal de 32 kHz externo (Saída N) e entrada analógica ADC1 Canal 0."] + }, + { + "numero": "8", + "nome": "GPIO2", + "tipo": "io", + "alimentacao": ["VDDPST1"], + "funcoes": ["GPIO2"], + "categorias": ["GPIO"] + }, + { + "numero": "9", + "nome": "GPIO3", + "tipo": "io", + "alimentacao": ["VDDPST1"], + "funcoes": [ + "GPIO3", + "MTMS", + "ADC1_CH1" + ], + "categorias": [ + "GPIO", + "JTAG", + "ADC", + "Strapping" + ], + "avisos": [ + "Pino multifuncional: JTAG MTMS, ADC1 Canal 1 e pino de Strapping para controle de borda de clock do SDIO.", + "Flutuante por padrão durante o reset." + ] + }, + { + "numero": "10", + "nome": "GPIO4", + "tipo": "io", + "alimentacao": ["VDDPST1"], + "funcoes": [ + "GPIO4", + "MTDI", + "ADC1_CH2" + ], + "categorias": [ + "GPIO", + "JTAG", + "ADC", + "Strapping" + ], + "avisos": [ + "Pino multifuncional: JTAG MTDI, ADC1 Canal 2 e pino de Strapping para controle de borda de clock do SDIO.", + "Flutuante por padrão durante o reset." + ] + }, + { + "numero": "11", + "nome": "GPIO5", + "tipo": "io", + "alimentacao": ["VDDPST1"], + "funcoes": [ + "GPIO5", + "MTCK", + "ADC1_CH3" + ], + "categorias": [ + "GPIO", + "JTAG", + "ADC" + ], + "avisos": ["Pino multifuncional: JTAG MTCK e entrada analógica ADC1 Canal 3."] + }, + { + "numero": "12", + "nome": "GPIO6", + "tipo": "io", + "alimentacao": ["VDDPST1"], + "funcoes": [ + "GPIO6", + "MTDO" + ], + "categorias": [ + "GPIO", + "JTAG" + ], + "avisos": ["Pino multifuncional JTAG MTDO."] + }, + { + "numero": "13", + "nome": "GPIO25", + "tipo": "io", + "alimentacao": ["VDDPST2"], + "funcoes": [ + "GPIO25", + "SDIO_CMD", + "FSPICS0" + ], + "categorias": [ + "GPIO", + "SDIO", + "SPI" + ], + "avisos": ["Pino multifuncional de alta velocidade: SDIO Comando ou SPI2 Chip Select 0."] + }, + { + "numero": "14", + "nome": "GPIO26", + "tipo": "io", + "alimentacao": ["VDDPST2"], + "funcoes": [ + "GPIO26", + "SDIO_CLK", + "FSPICLK" + ], + "categorias": [ + "GPIO", + "SDIO", + "SPI" + ], + "avisos": ["Pino multifuncional de alta velocidade: SDIO Clock ou SPI2 Clock."] + }, + { + "numero": "15", + "nome": "GPIO27", + "tipo": "io", + "alimentacao": ["VDDPST2"], + "funcoes": [ + "GPIO27", + "SDIO_DATA0", + "FSPID" + ], + "categorias": [ + "GPIO", + "SDIO", + "SPI" + ], + "avisos": ["Pino multifuncional de alta velocidade: SDIO Dados 0 ou SPI2 MOSI (FSPID)."] + }, + { + "numero": "16", + "nome": "GPIO28", + "tipo": "io", + "alimentacao": ["VDDPST2"], + "funcoes": [ + "GPIO28", + "SDIO_DATA1", + "FSPIQ" + ], + "categorias": [ + "GPIO", + "SDIO", + "SPI" + ], + "avisos": ["Pino de alta velocidade: SDIO Dados 1 ou SPI2 MISO (FSPIQ)."] + }, + { + "numero": "17", + "nome": "GPIO22", + "tipo": "io", + "alimentacao": ["VDDPST2"], + "funcoes": [ + "GPIO22", + "SDIO_DATA2", + "FSPIWP" + ], + "categorias": [ + "GPIO", + "SDIO", + "SPI" + ], + "avisos": ["Pino de alta velocidade: SDIO Dados 2 ou SPI2 Write Protect."] + }, + { + "numero": "18", + "nome": "GPIO23", + "tipo": "io", + "alimentacao": ["VDDPST2"], + "funcoes": [ + "GPIO23", + "SDIO_DATA3", + "FSPIHD" + ], + "categorias": [ + "GPIO", + "SDIO", + "SPI" + ], + "avisos": ["Pino de alta velocidade: SDIO Dados 3 ou SPI2 Hold."] + }, + { + "numero": "19", + "nome": "GPIO14", + "tipo": "io", + "alimentacao": ["VDD_SPI", "VDDPST2"], + "funcoes": [ + "GPIO14", + "SPICS1" + ], + "categorias": [ + "GPIO", + "SPI" + ], + "avisos": ["Pino dedicado para Chip Select 1 da interface de memória SPI Flash/PSRAM."] + }, + { + "numero": "20", + "nome": "GPIO15", + "tipo": "io", + "alimentacao": ["VDD_SPI", "VDDPST2"], + "funcoes": [ + "GPIO15", + "SPICS0" + ], + "categorias": [ + "GPIO", + "SPI" + ], + "avisos": ["Pino dedicado para Chip Select 0 da interface de memória SPI Flash."] + }, + { + "numero": "21", + "nome": "VDDPST2", + "tipo": "power", + "funcoes": ["Alimentação do domínio digital HP (High Performance)"], + "categorias": ["Power"], + "avisos": ["Tensão recomendada: 3.3V (3.0V a 3.6V). Alimenta as interfaces digitais rápidas."] + }, + { + "numero": "22", + "nome": "GPIO16", + "tipo": "io", + "alimentacao": ["VDD_SPI", "VDDPST2"], + "funcoes": [ + "GPIO16", + "SPIQ" + ], + "categorias": [ + "GPIO", + "SPI" + ], + "avisos": ["Pino de dados Q (MISO) da interface de memória flash SPI."] + }, + { + "numero": "23", + "nome": "GPIO17", + "tipo": "io", + "alimentacao": ["VDD_SPI", "VDDPST2"], + "funcoes": [ + "GPIO17", + "SPIWP" + ], + "categorias": [ + "GPIO", + "SPI" + ], + "avisos": ["Pino de proteção contra escrita (Write Protect) da interface de memória flash SPI."] + }, + { + "numero": "24", + "nome": "VDD_SPI", + "tipo": "power", + "funcoes": ["Tensão de saída LDO gerada a partir de VDDPST2 para alimentar a flash e PSRAM"], + "categorias": ["Power"], + "avisos": [ + "Tensão de saída configurável via software de acordo com as especificações da flash interna/externa (normalmente 3.3V ou 1.8V).", + "Não deve ser usado como fonte geral de energia de alta corrente." + ] + }, + { + "numero": "25", + "nome": "GPIO19", + "tipo": "io", + "alimentacao": ["VDD_SPI", "VDDPST2"], + "funcoes": [ + "GPIO19", + "SPIHD" + ], + "categorias": [ + "GPIO", + "SPI" + ], + "avisos": ["Pino de controle de Hold da interface de memória flash SPI."] + }, + { + "numero": "26", + "nome": "GPIO20", + "tipo": "io", + "alimentacao": ["VDD_SPI", "VDDPST2"], + "funcoes": [ + "GPIO20", + "SPICLK" + ], + "categorias": [ + "GPIO", + "SPI" + ], + "avisos": ["Pino de sinal de clock da interface de memória flash SPI."] + }, + { + "numero": "27", + "nome": "GPIO21", + "tipo": "io", + "alimentacao": ["VDD_SPI", "VDDPST2"], + "funcoes": [ + "GPIO21", + "SPID" + ], + "categorias": [ + "GPIO", + "SPI" + ], + "avisos": ["Pino de dados D (MOSI) da interface de memória flash SPI."] + }, + { + "numero": "28", + "nome": "GPIO12", + "tipo": "io", + "alimentacao": ["VDDPST2"], + "funcoes": [ + "GPIO12", + "USB_D-" + ], + "categorias": [ + "GPIO", + "USB" + ], + "avisos": ["Pino de sinal negativo do transceptor USB Serial/JTAG integrado."] + }, + { + "numero": "29", + "nome": "GPIO13", + "tipo": "io", + "alimentacao": ["VDDPST2"], + "funcoes": [ + "GPIO13", + "USB_D+" + ], + "categorias": [ + "GPIO", + "USB" + ], + "avisos": [ + "Pino de sinal positivo do transceptor USB Serial/JTAG integrado.", + "Possui resistor de pull-up integrado ativado por padrão na inicialização do USB." + ] + }, + { + "numero": "30", + "nome": "GPIO24", + "tipo": "io", + "alimentacao": ["VDDPST2"], + "funcoes": ["GPIO24"], + "categorias": ["GPIO"] + }, + { + "numero": "31", + "nome": "GPIO8", + "tipo": "io", + "alimentacao": ["VDDPST2"], + "funcoes": ["GPIO8"], + "categorias": ["GPIO", "Strapping"], + "avisos": [ + "Pino de Strapping para seleção do modo de boot e controle de impressão das mensagens da ROM.", + "Flutuante por padrão durante o reset. Nível alto (1) ativa a impressão do log de inicialização." + ] + }, + { + "numero": "32", + "nome": "GPIO9", + "tipo": "io", + "alimentacao": ["VDDPST2"], + "funcoes": ["GPIO9"], + "categorias": ["GPIO", "Strapping"], + "avisos": [ + "Pino de Strapping principal para seleção do modo de boot.", + "Equipado com pull-up fraco integrado. Nível alto (1) no reset ativa SPI Boot (carrega do flash). Nível baixo (0) força o modo de Download." + ] + }, + { + "numero": "33", + "nome": "GPIO10", + "tipo": "io", + "alimentacao": ["VDDPST2"], + "funcoes": [ + "GPIO10", + "U0RXD" + ], + "categorias": [ + "GPIO", + "UART" + ], + "avisos": ["Recepção serial UART0 (Serial RX para gravação do firmware externa e depuração)."] + }, + { + "numero": "34", + "nome": "GPIO11", + "tipo": "io", + "alimentacao": ["VDDPST2"], + "funcoes": [ + "GPIO11", + "U0TXD" + ], + "categorias": [ + "GPIO", + "UART" + ], + "avisos": ["Transmissão serial UART0 (Serial TX para gravação do firmware externa e depuração)."] + }, + { + "numero": "35", + "nome": "GPIO29", + "tipo": "io", + "alimentacao": ["VDDPST2"], + "funcoes": ["GPIO29"], + "categorias": ["GPIO"] + }, + { + "numero": "36", + "nome": "GPIO7", + "tipo": "io", + "alimentacao": ["VDDPST2"], + "funcoes": ["GPIO7"], + "categorias": ["GPIO", "Strapping"], + "avisos": [ + "Pino de Strapping para seleção da fonte dos sinais JTAG (inicialização precoce).", + "Sem resistores de pull internos no reset. Deve ser mantido estável por circuito externo se usado." + ] + }, + { + "numero": "37", + "nome": "VDDA1", + "tipo": "power", + "funcoes": ["Alimentação do domínio analógico de 3.3V"], + "categorias": ["Power"] + }, + { + "numero": "38", + "nome": "XTAL_N", + "tipo": "analog", + "funcoes": ["Conexão externa do cristal oscilador de 40 MHz (Saída N)"], + "categorias": ["Clock"] + }, + { + "numero": "39", + "nome": "XTAL_P", + "tipo": "analog", + "funcoes": ["Conexão externa do cristal oscilador de 40 MHz (Entrada P)"], + "categorias": ["Clock"] + }, + { + "numero": "40", + "nome": "VDDA2", + "tipo": "power", + "funcoes": ["Alimentação do domínio analógico de 3.3V"], + "categorias": ["Power"] + }, + { + "numero": "41", + "nome": "GND", + "tipo": "power", + "funcoes": ["Pino de aterramento central (Exposed Pad)"], + "categorias": ["Power"], + "avisos": ["Deve ser adequadamente soldado ao plano de terra (GND) da PCB para controle de RF e térmica estáveis."] + } +] diff --git a/public/conexoes/ESP32-S31.json b/public/conexoes/ESP32-S31.json new file mode 100644 index 0000000..4ef1ed9 --- /dev/null +++ b/public/conexoes/ESP32-S31.json @@ -0,0 +1,956 @@ +[ + { + "numero": "1", + "nome": "ANT", + "tipo": "analog", + "funcoes": ["Conexão de antena de RF (Wi-Fi e Bluetooth)"], + "categorias": ["Antena", "RF"], + "avisos": ["Pino de RF dedicado para 2.4 GHz. Requer casamento de impedância de 50 ohms."] + }, + { + "numero": "2", + "nome": "VDDA3", + "tipo": "power", + "funcoes": ["Alimentação do domínio analógico (3.3V)"], + "categorias": ["Power"], + "avisos": ["Tensão recomendada: 3.3V (3.0V a 3.6V). Alimenta a seção de RF e clock."] + }, + { + "numero": "3", + "nome": "VDDA4", + "tipo": "power", + "funcoes": ["Alimentação do domínio analógico (3.3V)"], + "categorias": ["Power"], + "avisos": ["Tensão recomendada: 3.3V (3.0V a 3.6V). Alimenta a seção de RF e clock."] + }, + { + "numero": "4", + "nome": "CHIP_PU", + "tipo": "analog", + "funcoes": ["Habilitar o chip (Power-up / Reset)"], + "categorias": ["Power"], + "avisos": [ + "Ativo Alto. Puxe para nível alto para inicializar o chip.", + "Não deixe este pino flutuando. Recomenda-se usar um circuito RC externo de atraso para inicialização estável." + ] + }, + { + "numero": "5", + "nome": "GPIO0", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO0", + "XTAL_32K_N" + ], + "categorias": [ + "GPIO", + "Clock" + ], + "avisos": ["Pino de clock de baixo consumo. Pode ser conectado ao cristal de 32.768 kHz externo (Pino N)."] + }, + { + "numero": "6", + "nome": "GPIO1", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO1", + "XTAL_32K_P", + "ADC1_CH0" + ], + "categorias": [ + "GPIO", + "Clock", + "ADC" + ], + "avisos": ["Pino multifuncional. Cristal de 32.768 kHz externo (Pino P) e entrada analógica ADC1 Canal 0."] + }, + { + "numero": "7", + "nome": "GPIO2", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO2", + "ADC1_CH1" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC1 Canal 1."] + }, + { + "numero": "8", + "nome": "GPIO3", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO3", + "ADC1_CH2" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC1 Canal 2."] + }, + { + "numero": "9", + "nome": "GPIO4", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO4", + "ADC1_CH3" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC1 Canal 3."] + }, + { + "numero": "10", + "nome": "GPIO5", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO5", + "ADC1_CH4" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC1 Canal 4."] + }, + { + "numero": "11", + "nome": "VDDPST_1", + "tipo": "power", + "funcoes": ["Alimentação de I/O do domínio 1 (3.3V)"], + "categorias": ["Power"], + "avisos": ["Tensão recomendada: 3.3V."] + }, + { + "numero": "12", + "nome": "GPIO6", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO6", + "ADC1_CH5" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC1 Canal 5."] + }, + { + "numero": "13", + "nome": "GPIO7", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO7", + "ADC1_CH6" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC1 Canal 6."] + }, + { + "numero": "14", + "nome": "GPIO8", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO8", + "ADC1_CH7" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC1 Canal 7."] + }, + { + "numero": "15", + "nome": "GPIO9", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO9", + "ADC1_CH8" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC1 Canal 8."] + }, + { + "numero": "16", + "nome": "GPIO10", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO10", + "ADC1_CH9" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC1 Canal 9."] + }, + { + "numero": "17", + "nome": "GPIO11", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO11", + "ADC1_CH10" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC1 Canal 10."] + }, + { + "numero": "18", + "nome": "VREF_TOUCH", + "tipo": "analog", + "funcoes": ["Tensão de referência para os pinos Touch capacitivos"], + "categorias": ["Touch"], + "avisos": ["Pino analógico dedicado para estabilização de leitura capacitiva."] + }, + { + "numero": "19", + "nome": "GPIO12", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO12", + "ADC2_CH0" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC2 Canal 0."] + }, + { + "numero": "20", + "nome": "GPIO13", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO13", + "ADC2_CH1" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC2 Canal 1."] + }, + { + "numero": "21", + "nome": "GPIO14", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO14", + "ADC2_CH2" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC2 Canal 2."] + }, + { + "numero": "22", + "nome": "GPIO15", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO15", + "ADC2_CH3" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC2 Canal 3."] + }, + { + "numero": "23", + "nome": "GPIO16", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO16", + "ADC2_CH4" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC2 Canal 4."] + }, + { + "numero": "24", + "nome": "GPIO17", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO17", + "ADC2_CH5" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC2 Canal 5."] + }, + { + "numero": "25", + "nome": "GPIO18", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO18", + "ADC2_CH6" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC2 Canal 6."] + }, + { + "numero": "26", + "nome": "GPIO19", + "tipo": "io", + "alimentacao": ["VDDPST_1"], + "funcoes": [ + "GPIO19", + "ADC2_CH7" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino de entrada analógica ADC2 Canal 7."] + }, + { + "numero": "27", + "nome": "SDIO_DATA0", + "tipo": "io", + "alimentacao": ["VDDPST_SD"], + "funcoes": [ + "SDIO_DATA0", + "FSPID" + ], + "categorias": [ + "SDIO", + "SPI" + ], + "avisos": ["Pino da interface SDIO de alta velocidade (Dados 0) ou SPI2 MOSI."] + }, + { + "numero": "28", + "nome": "SDIO_DATA1", + "tipo": "io", + "alimentacao": ["VDDPST_SD"], + "funcoes": [ + "SDIO_DATA1", + "FSPIQ" + ], + "categorias": [ + "SDIO", + "SPI" + ], + "avisos": ["Pino da interface SDIO de alta velocidade (Dados 1) ou SPI2 MISO."] + }, + { + "numero": "29", + "nome": "SDIO_DATA2", + "tipo": "io", + "alimentacao": ["VDDPST_SD"], + "funcoes": [ + "SDIO_DATA2", + "FSPIWP" + ], + "categorias": [ + "SDIO", + "SPI" + ], + "avisos": ["Pino da interface SDIO de alta velocidade (Dados 2) ou SPI2 Write Protect."] + }, + { + "numero": "30", + "nome": "VDD_PSRAM_1P8_1", + "tipo": "power", + "funcoes": ["Alimentação de 1.8V para PSRAM integrada no encapsulamento"], + "categorias": ["Power"], + "avisos": ["Gerado pelo LDO interno para alimentar a PSRAM integrada. Não conectar a circuitos de potência externa."] + }, + { + "numero": "31", + "nome": "SDIO_DATA3", + "tipo": "io", + "alimentacao": ["VDDPST_SD"], + "funcoes": [ + "SDIO_DATA3", + "FSPIHD" + ], + "categorias": [ + "SDIO", + "SPI" + ], + "avisos": ["Pino da interface SDIO de alta velocidade (Dados 3) ou SPI2 Hold."] + }, + { + "numero": "32", + "nome": "SDIO_CLK", + "tipo": "io", + "alimentacao": ["VDDPST_SD"], + "funcoes": [ + "SDIO_CLK", + "FSPICLK" + ], + "categorias": [ + "SDIO", + "SPI" + ], + "avisos": ["Clock da interface SDIO de alta velocidade ou SPI2 Clock."] + }, + { + "numero": "33", + "nome": "SDIO_CMD", + "tipo": "io", + "alimentacao": ["VDDPST_SD"], + "funcoes": [ + "SDIO_CMD", + "FSPICS0" + ], + "categorias": [ + "SDIO", + "SPI" + ], + "avisos": ["Comando da interface SDIO de alta velocidade ou SPI2 Chip Select 0."] + }, + { + "numero": "34", + "nome": "VDD_PSRAM_1P8_2", + "tipo": "power", + "funcoes": ["Alimentação de 1.8V para PSRAM integrada no encapsulamento"], + "categorias": ["Power"] + }, + { + "numero": "35", + "nome": "VDD_LDO_1P8", + "tipo": "power", + "funcoes": ["Pino de entrada/saída LDO de 1.8V"], + "categorias": ["Power"] + }, + { + "numero": "36", + "nome": "SPICS", + "tipo": "io", + "alimentacao": ["VDD_SPI"], + "funcoes": ["SPICS"], + "categorias": ["SPI"], + "avisos": ["Chip Select dedicado para a Flash SPI externa ou interna."] + }, + { + "numero": "37", + "nome": "SPIQ", + "tipo": "io", + "alimentacao": ["VDD_SPI"], + "funcoes": ["SPIQ"], + "categorias": ["SPI"], + "avisos": ["Dado Q (MISO) dedicado para a Flash SPI externa ou interna."] + }, + { + "numero": "38", + "nome": "SPIWP", + "tipo": "io", + "alimentacao": ["VDD_SPI"], + "funcoes": ["SPIWP"], + "categorias": ["SPI"], + "avisos": ["Write Protect dedicado para a Flash SPI externa ou interna."] + }, + { + "numero": "39", + "nome": "VDD_SPI", + "tipo": "power", + "funcoes": ["Tensão de alimentação dedicada para a interface Flash SPI"], + "categorias": ["Power"], + "avisos": ["Tensão típica: 3.3V ou 1.8V gerada internamente."] + }, + { + "numero": "40", + "nome": "SPIHD", + "tipo": "io", + "alimentacao": ["VDD_SPI"], + "funcoes": ["SPIHD"], + "categorias": ["SPI"], + "avisos": ["Hold dedicado para a Flash SPI externa ou interna."] + }, + { + "numero": "41", + "nome": "SPICLK", + "tipo": "io", + "alimentacao": ["VDD_SPI"], + "funcoes": ["SPICLK"], + "categorias": ["SPI"], + "avisos": ["Clock dedicado para a Flash SPI externa ou interna."] + }, + { + "numero": "42", + "nome": "SPID", + "tipo": "io", + "alimentacao": ["VDD_SPI"], + "funcoes": ["SPID"], + "categorias": ["SPI"], + "avisos": ["Dado D (MOSI) dedicado para a Flash SPI externa ou interna."] + }, + { + "numero": "43", + "nome": "VCCA/VDDPST_2", + "tipo": "power", + "funcoes": ["Alimentação analógica e digital do domínio 2 (3.3V)"], + "categorias": ["Power"] + }, + { + "numero": "44", + "nome": "USB_DP", + "tipo": "analog", + "funcoes": ["Pino positivo do transceptor USB Serial/JTAG integrado"], + "categorias": ["USB"], + "avisos": ["USB D+. Possui pull-up de hardware interno."] + }, + { + "numero": "45", + "nome": "USB_DM", + "tipo": "analog", + "funcoes": ["Pino negativo do transceptor USB Serial/JTAG integrado"], + "categorias": ["USB"], + "avisos": ["USB D-."] + }, + { + "numero": "46", + "nome": "GPIO33", + "tipo": "io", + "alimentacao": ["VDDPST_3"], + "funcoes": [ + "GPIO33", + "ADC2_CH8" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino multifuncional: GPIO33 e ADC2 Canal 8."] + }, + { + "numero": "47", + "nome": "GPIO34", + "tipo": "io", + "alimentacao": ["VDDPST_3"], + "funcoes": [ + "GPIO34", + "ADC2_CH9" + ], + "categorias": [ + "GPIO", + "ADC" + ], + "avisos": ["Pino multifuncional: GPIO34 e ADC2 Canal 9."] + }, + { + "numero": "48", + "nome": "GPIO35", + "tipo": "io", + "alimentacao": ["VDDPST_3"], + "funcoes": [ + "GPIO35", + "ADC2_CH10" + ], + "categorias": [ + "GPIO", + "ADC" + ] + }, + { + "numero": "49", + "nome": "GPIO36", + "tipo": "io", + "alimentacao": ["VDDPST_3"], + "funcoes": [ + "GPIO36", + "ADC2_CH11" + ], + "categorias": [ + "GPIO", + "ADC" + ] + }, + { + "numero": "50", + "nome": "GPIO37", + "tipo": "io", + "alimentacao": ["VDDPST_3"], + "funcoes": [ + "GPIO37", + "ADC2_CH12" + ], + "categorias": [ + "GPIO", + "ADC" + ] + }, + { + "numero": "51", + "nome": "GPIO38", + "tipo": "io", + "alimentacao": ["VDDPST_3"], + "funcoes": [ + "GPIO38", + "ADC2_CH13" + ], + "categorias": [ + "GPIO", + "ADC" + ] + }, + { + "numero": "52", + "nome": "GPIO39", + "tipo": "io", + "alimentacao": ["VDDPST_3"], + "funcoes": [ + "GPIO39", + "ADC2_CH14" + ], + "categorias": [ + "GPIO", + "ADC" + ] + }, + { + "numero": "53", + "nome": "GPIO40", + "tipo": "io", + "alimentacao": ["VDDPST_3"], + "funcoes": [ + "GPIO40", + "ADC2_CH15" + ], + "categorias": [ + "GPIO", + "ADC" + ] + }, + { + "numero": "54", + "nome": "VDDPST_3", + "tipo": "power", + "funcoes": ["Alimentação de I/O do domínio 3 (3.3V)"], + "categorias": ["Power"] + }, + { + "numero": "55", + "nome": "GPIO42", + "tipo": "io", + "alimentacao": ["VDDPST_3"], + "funcoes": [ + "GPIO42", + "ADC2_CH16" + ], + "categorias": [ + "GPIO", + "ADC" + ] + }, + { + "numero": "56", + "nome": "GPIO43", + "tipo": "io", + "alimentacao": ["VDDPST_3"], + "funcoes": [ + "GPIO43", + "ADC2_CH17" + ], + "categorias": [ + "GPIO", + "ADC" + ] + }, + { + "numero": "57", + "nome": "GPIO44", + "tipo": "io", + "alimentacao": ["VDDPST_3"], + "funcoes": [ + "GPIO44", + "ADC2_CH18" + ], + "categorias": [ + "GPIO", + "ADC" + ] + }, + { + "numero": "58", + "nome": "GPIO45", + "tipo": "io", + "alimentacao": ["VDDPST_3"], + "funcoes": [ + "GPIO45", + "ADC2_CH19" + ], + "categorias": [ + "GPIO", + "ADC" + ] + }, + { + "numero": "59", + "nome": "GPIO46", + "tipo": "io", + "alimentacao": ["VDDPST_3"], + "funcoes": [ + "GPIO46", + "ADC2_CH20" + ], + "categorias": [ + "GPIO", + "ADC" + ] + }, + { + "numero": "60", + "nome": "GPIO47", + "tipo": "io", + "alimentacao": ["VDDPST_3"], + "funcoes": [ + "GPIO47", + "ADC2_CH21" + ], + "categorias": [ + "GPIO", + "ADC" + ] + }, + { + "numero": "61", + "nome": "GPIO48", + "tipo": "io", + "alimentacao": ["VDDPST_3"], + "funcoes": ["GPIO48"], + "categorias": ["GPIO"] + }, + { + "numero": "62", + "nome": "GPIO49", + "tipo": "io", + "alimentacao": ["VDDPST_3"], + "funcoes": ["GPIO49"], + "categorias": ["GPIO"] + }, + { + "numero": "63", + "nome": "VREF_ADC", + "tipo": "analog", + "funcoes": ["Tensão de referência estável externa para calibração do ADC"], + "categorias": ["Power", "ADC"], + "avisos": ["Pino analógico dedicado para calibração precisa do conversor analógico-digital."] + }, + { + "numero": "64", + "nome": "VDDPST_4", + "tipo": "power", + "funcoes": ["Alimentação de I/O do domínio 4 (3.3V)"], + "categorias": ["Power"] + }, + { + "numero": "65", + "nome": "GPIO50", + "tipo": "io", + "alimentacao": ["VDDPST_4"], + "funcoes": ["GPIO50"], + "categorias": ["GPIO"] + }, + { + "numero": "66", + "nome": "GPIO51", + "tipo": "io", + "alimentacao": ["VDDPST_4"], + "funcoes": ["GPIO51"], + "categorias": ["GPIO"] + }, + { + "numero": "67", + "nome": "GPIO52", + "tipo": "io", + "alimentacao": ["VDDPST_4"], + "funcoes": ["GPIO52"], + "categorias": ["GPIO"] + }, + { + "numero": "68", + "nome": "GPIO53", + "tipo": "io", + "alimentacao": ["VDDPST_4"], + "funcoes": ["GPIO53"], + "categorias": ["GPIO"] + }, + { + "numero": "69", + "nome": "GPIO54", + "tipo": "io", + "alimentacao": ["VDDPST_4"], + "funcoes": [ + "GPIO54", + "MTDO" + ], + "categorias": [ + "GPIO", + "JTAG" + ], + "avisos": ["Pino multifuncional: JTAG MTDO."] + }, + { + "numero": "70", + "nome": "GPIO55", + "tipo": "io", + "alimentacao": ["VDDPST_4"], + "funcoes": [ + "GPIO55", + "MTCK" + ], + "categorias": [ + "GPIO", + "JTAG" + ], + "avisos": ["Pino multifuncional: JTAG MTCK."] + }, + { + "numero": "71", + "nome": "GPIO56", + "tipo": "io", + "alimentacao": ["VDDPST_4"], + "funcoes": [ + "GPIO56", + "MTDI" + ], + "categorias": [ + "GPIO", + "JTAG" + ], + "avisos": ["Pino multifuncional: JTAG MTDI."] + }, + { + "numero": "72", + "nome": "GPIO57", + "tipo": "io", + "alimentacao": ["VDDPST_4"], + "funcoes": [ + "GPIO57", + "MTMS" + ], + "categorias": [ + "GPIO", + "JTAG" + ], + "avisos": ["Pino multifuncional: JTAG MTMS."] + }, + { + "numero": "73", + "nome": "GPIO58", + "tipo": "io", + "alimentacao": ["VDDPST_4"], + "funcoes": ["GPIO58"], + "categorias": ["GPIO"] + }, + { + "numero": "74", + "nome": "GPIO59", + "tipo": "io", + "alimentacao": ["VDDPST_4"], + "funcoes": ["GPIO59"], + "categorias": ["GPIO"] + }, + { + "numero": "75", + "nome": "GPIO60", + "tipo": "io", + "alimentacao": ["VDDPST_4"], + "funcoes": ["GPIO60"], + "categorias": ["GPIO", "Strapping"], + "avisos": [ + "Pino de Strapping para boot (junto com GPIO61).", + "Equipado com pull-up interno ativo por padrão." + ] + }, + { + "numero": "76", + "nome": "GPIO61", + "tipo": "io", + "alimentacao": ["VDDPST_4"], + "funcoes": ["GPIO61"], + "categorias": ["GPIO", "Strapping"], + "avisos": [ + "Pino de Strapping principal para seleção de boot.", + "Equipado com pull-up interno ativo por padrão. Nível alto (1) no reset ativa SPI Boot. Nível baixo (0) força o modo Download." + ] + }, + { + "numero": "77", + "nome": "VDDA1", + "tipo": "power", + "funcoes": ["Alimentação do domínio analógico de 3.3V"], + "categorias": ["Power"] + }, + { + "numero": "78", + "nome": "XTAL_N", + "tipo": "analog", + "funcoes": ["Conexão externa do cristal oscilador de alta velocidade (Saída N)"], + "categorias": ["Clock"] + }, + { + "numero": "79", + "nome": "XTAL_P", + "tipo": "analog", + "funcoes": ["Conexão externa do cristal oscilador de alta velocidade (Entrada P)"], + "categorias": ["Clock"] + }, + { + "numero": "80", + "nome": "VDDA2", + "tipo": "power", + "funcoes": ["Alimentação do domínio analógico de 3.3V"], + "categorias": ["Power"] + }, + { + "numero": "81", + "nome": "GND", + "tipo": "power", + "funcoes": ["Pino de aterramento central (Exposed Pad)"], + "categorias": ["Power"], + "avisos": ["Deve ser adequadamente soldado ao plano de terra (GND) da PCB para controle de RF e dissipação térmica estáveis."] + } +] diff --git a/public/datasheets/ESP32-C2 (ESP8684).pdf b/public/datasheets/ESP32-C2 (ESP8684).pdf new file mode 100644 index 0000000..994ff39 Binary files /dev/null and b/public/datasheets/ESP32-C2 (ESP8684).pdf differ diff --git a/public/datasheets/ESP32-C3.pdf b/public/datasheets/ESP32-C3.pdf new file mode 100644 index 0000000..a4bfc75 Binary files /dev/null and b/public/datasheets/ESP32-C3.pdf differ diff --git a/public/datasheets/ESP32-C5.pdf b/public/datasheets/ESP32-C5.pdf new file mode 100644 index 0000000..c668d07 Binary files /dev/null and b/public/datasheets/ESP32-C5.pdf differ diff --git a/public/datasheets/ESP32-C6.pdf b/public/datasheets/ESP32-C6.pdf new file mode 100644 index 0000000..98dd38c Binary files /dev/null and b/public/datasheets/ESP32-C6.pdf differ diff --git a/public/datasheets/ESP32-C61.pdf b/public/datasheets/ESP32-C61.pdf new file mode 100644 index 0000000..77fb6b2 Binary files /dev/null and b/public/datasheets/ESP32-C61.pdf differ diff --git a/public/datasheets/ESP32-H2.pdf b/public/datasheets/ESP32-H2.pdf new file mode 100644 index 0000000..e0cb861 Binary files /dev/null and b/public/datasheets/ESP32-H2.pdf differ diff --git a/public/datasheets/ESP32-P4.pdf b/public/datasheets/ESP32-P4.pdf new file mode 100644 index 0000000..3596db4 Binary files /dev/null and b/public/datasheets/ESP32-P4.pdf differ diff --git a/public/datasheets/ESP32-S2.pdf b/public/datasheets/ESP32-S2.pdf new file mode 100644 index 0000000..d2ceea6 Binary files /dev/null and b/public/datasheets/ESP32-S2.pdf differ diff --git a/public/datasheets/ESP32-S3.pdf b/public/datasheets/ESP32-S3.pdf new file mode 100644 index 0000000..833b265 Binary files /dev/null and b/public/datasheets/ESP32-S3.pdf differ diff --git a/public/datasheets/ESP32-S31.pdf b/public/datasheets/ESP32-S31.pdf new file mode 100644 index 0000000..a7befae Binary files /dev/null and b/public/datasheets/ESP32-S31.pdf differ diff --git a/public/datasheets/ESP32.pdf b/public/datasheets/ESP32.pdf new file mode 100644 index 0000000..e39bff2 Binary files /dev/null and b/public/datasheets/ESP32.pdf differ diff --git a/public/placas/esp32-c5.png b/public/placas/esp32-c5.png index 8e99706..e6d9ac9 100644 Binary files a/public/placas/esp32-c5.png and b/public/placas/esp32-c5.png differ diff --git a/public/placas/esp32-c6.png b/public/placas/esp32-c6.png index 57290ba..ca1a8e7 100644 Binary files a/public/placas/esp32-c6.png and b/public/placas/esp32-c6.png differ diff --git a/public/placas/esp32-c61.png b/public/placas/esp32-c61.png index af802c5..10c9db8 100644 Binary files a/public/placas/esp32-c61.png and b/public/placas/esp32-c61.png differ diff --git a/public/placas/esp32-h2.png b/public/placas/esp32-h2.png index 1e326e6..5e7a2bb 100644 Binary files a/public/placas/esp32-h2.png and b/public/placas/esp32-h2.png differ diff --git a/public/placas/esp32-s3.png b/public/placas/esp32-s3.png index 0fcd270..8a492a1 100644 Binary files a/public/placas/esp32-s3.png and b/public/placas/esp32-s3.png differ diff --git a/public/placas/esp32-s31.png b/public/placas/esp32-s31.png new file mode 100644 index 0000000..a03a91f Binary files /dev/null and b/public/placas/esp32-s31.png differ diff --git a/public/placas/esp32.png b/public/placas/esp32.png index a954087..b92c1de 100644 Binary files a/public/placas/esp32.png and b/public/placas/esp32.png differ diff --git a/public/series.json b/public/series.json index f7be945..6123a6b 100644 --- a/public/series.json +++ b/public/series.json @@ -131,6 +131,86 @@ "placa": "/placas/esp32-s3.png", "cor": "#fd7e14" }, + "ESP32-S31": { + "nome_completo": "ESP32-S31", + "icone": "🌀", + "descricao": "Processador dual-core RISC-V de alta performance a 320MHz com Wi-Fi 6, Bluetooth 5.4 e Classic, Zigbee/Thread, Matter e aceleração IA", + "arquitetura": "RISC-V dual-core de 32 bits (HP) + RISC-V single-core (LP)", + "nucleos": "2 (Dual-core HP) + 1 (Single-core LP)", + "frequencia": "Até 320 MHz", + "coprocessador_ulp": "Sim (RISC-V, LP CPU de 40 MHz)", + "aceleradores_ia": "Sim (Custom AI and DSP extension XespV)", + "wifi": "Wi-Fi 6 (802.11ax) 2.4 GHz", + "bluetooth": "Bluetooth 5.4 LE e Bluetooth Classic", + "zigbee_thread": "IEEE 802.15.4 (Zigbee 3.0, Thread 1.4)", + "matter": "Sim", + "memoria_sram": "512 KB (HP SRAM)", + "memoria_sram_rtc": "32 KB (LP SRAM)", + "memoria_rom": "320 KB", + "flash_externa": "Até 256 MB via QSPI", + "psram_externa": "Suporta até 64 MB (16 MB ou 32 MB DDR OPI integrados no encapsulamento)", + "gpio": "60", + "adc": "2x SAR ADC de 12 bits, até 16 canais", + "dac": "Sim (2x DAC de 10 bits e 2x DAC de 12 bits)", + "touch": "14 canais capacitivos", + "uart": "5 (4 UART + 1 LP UART)", + "spi": "7 (6 SPI + 1 LP SPI)", + "i2c": "3 (2 I2C + 1 LP I2C)", + "i2s": "2", + "pwm": "LED PWM (até 8 canais), Motor PWM (MCPWM)", + "usb": "1 (USB 2.0 High-Speed OTG e USB Serial/JTAG)", + "can": "Sim (CAN FD Controller)", + "sensor_temperatura": "1 (interno)", + "consumo_energia": { + "active": "Consumo otimizado de alta performance configurável", + "light_sleep": "0.1-0.8 mA", + "deep_sleep": "Baixo consumo com LP CPU ativa" + }, + "temperatura_operacao": "-40°C a 85°C", + "temperatura_armazenamento": "-40°C a 150°C", + "datasheet": "https://documentation.espressif.com/esp32-s31_datasheet_en.html", + "manual_tecnico": "https://documentation.espressif.com/esp32-s31_technical_reference_manual_en.html", + "guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s31/get-started/index.html", + "placa": "/placas/esp32-s31.png", + "cor": "#ff2a5f" + }, + "ESP32-C2": { + "nome_completo": "ESP32-C2 (ESP8684)", + "icone": "🌱", + "descricao": "Microcontrolador RISC-V ultra econômico e de baixo consumo com Wi-Fi 4 e Bluetooth 5.0 LE", + "arquitetura": "RISC-V single-core de 32 bits", + "nucleos": "1 (Single-core)", + "frequencia": "Até 120 MHz", + "wifi": "IEEE 802.11 b/g/n (2.4 GHz, até 72.2 Mbps)", + "bluetooth": "Bluetooth 5.0 LE", + "memoria_sram": "272 KB (16 KB para cache)", + "memoria_sram_rtc": "Não", + "memoria_rom": "576 KB", + "flash_externa": "Não suportada diretamente (2 MB ou 4 MB de Flash integrados no encapsulamento)", + "psram_externa": "Não", + "gpio": "14", + "adc": "1x SAR ADC de 12 bits, até 5 canais", + "dac": "Não", + "touch": "Não", + "uart": "2", + "spi": "3 (SPI0/1 para Flash interna, SPI2 para uso geral)", + "i2c": "1 (Master-only)", + "i2s": "Não", + "pwm": "LED PWM (até 6 canais)", + "sensor_temperatura": "1 (interno)", + "consumo_energia": { + "active_cpu_120mhz": "13 mA", + "light_sleep": "130 µA", + "deep_sleep": "5 µA" + }, + "temperatura_operacao": "-40°C a 105°C", + "temperatura_armazenamento": "-40°C a 150°C", + "datasheet": "https://documentation.espressif.com/esp32-c2_datasheet_en.html", + "manual_tecnico": "https://documentation.espressif.com/esp32-c2_technical_reference_manual_en.html", + "guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c2/get-started/index.html", + "placa": "/placas/esp32-c2.png", + "cor": "#8c52ff" + }, "ESP32-C3": { "nome_completo": "ESP32-C3", "icone": "💎", @@ -174,20 +254,22 @@ "ESP32-C5": { "nome_completo": "ESP32-C5", "icone": "📶", - "descricao": "O primeiro com suporte a Wi-Fi 6 dual-band e Bluetooth 5.3, equipado com um processador RISC-V", - "arquitetura": "RISC-V single-core de 32 bits", - "nucleos": "1 (Single-core)", + "descricao": "O primeiro com suporte a Wi-Fi 6 dual-band e Bluetooth 6.0, equipado com CPU RISC-V e coprocessador ULP", + "arquitetura": "RISC-V single-core de 32 bits (HP) + RISC-V single-core (LP)", + "nucleos": "1 (Single-core HP) + 1 (Single-core LP)", "frequencia": "Até 240 MHz", + "coprocessador_ulp": "Sim (RISC-V, LP CPU de 48 MHz)", "wifi": "Wi-Fi 6 (802.11ax) dual-band 2.4 GHz e 5 GHz", - "bluetooth": "Bluetooth 5.3 LE", - "zigbee_thread": "IEEE 802.15.4", - "memoria_sram": "560 KB", + "bluetooth": "Bluetooth 6.0 LE", + "zigbee_thread": "IEEE 802.15.4 (Zigbee 3.0, Thread 1.4)", + "matter": "Sim", + "memoria_sram": "384 KB", "memoria_sram_rtc": "16 KB", "memoria_rom": "320 KB", "flash_externa": "Até 16 MB via QSPI", "psram_externa": "Não", "gpio": "29", - "adc": "1x SAR ADC de 12 bits, até 7 canais", + "adc": "1x SAR ADC de 12 bits, até 6 canais", "dac": "Não", "touch": "Não", "uart": "3", @@ -213,20 +295,21 @@ "ESP32-C6": { "nome_completo": "ESP32-C6", "icone": "🌐", - "descricao": "Recursos de segurança avançada, Wi-Fi 6, Bluetooth, Zigbee e Thread com suporte a Matter", - "arquitetura": "RISC-V single-core de 32 bits", - "nucleos": "1 (Single-core)", + "descricao": "Recursos de segurança avançada, Wi-Fi 6, Bluetooth 5.3, Zigbee e Thread com suporte a Matter", + "arquitetura": "RISC-V single-core de 32 bits (HP) + RISC-V single-core (LP)", + "nucleos": "1 (Single-core HP) + 1 (Single-core LP)", "frequencia": "Até 160 MHz", + "coprocessador_ulp": "Sim (RISC-V, LP CPU de 20 MHz)", "wifi": "Wi-Fi 6 (802.11ax) 2.4 GHz", "bluetooth": "Bluetooth 5.3 LE", - "zigbee_thread": "IEEE 802.15.4 (Zigbee, Thread)", + "zigbee_thread": "IEEE 802.15.4 (Zigbee 3.0, Thread 1.3)", "matter": "Sim", "memoria_sram": "512 KB", "memoria_sram_rtc": "16 KB", "memoria_rom": "320 KB", "flash_externa": "Até 16 MB via QSPI", "psram_externa": "Não", - "gpio": "30 ou 22", + "gpio": "30", "adc": "1x SAR ADC de 12 bits, até 7 canais", "dac": "Não", "touch": "Não", @@ -236,7 +319,7 @@ "i2s": "1", "pwm": "LED PWM (até 6 canais), Motor PWM", "usb": "1 (USB Serial/JTAG)", - "sdio": "1 (SD/SDIO/MMC Host)", + "sdio": "1 (SDIO 2.0 Slave)", "sensor_temperatura": "1 (interno)", "consumo_energia": { "active_wifi6": "Varia conforme perfil TX/RX", @@ -251,11 +334,52 @@ "placa": "/placas/esp32-c6.png", "cor": "#17a2b8" }, + "ESP32-C61": { + "nome_completo": "ESP32-C61", + "icone": "🛰️", + "descricao": "Microcontrolador RISC-V econômico de 160MHz com Wi-Fi 6, Bluetooth 5.0 LE e suporte a Flash/PSRAM no encapsulamento", + "arquitetura": "RISC-V single-core de 32 bits", + "nucleos": "1 (Single-core)", + "frequencia": "Até 160 MHz", + "wifi": "Wi-Fi 6 (802.11ax) 2.4 GHz", + "bluetooth": "Bluetooth 5.0 LE", + "zigbee_thread": "Não", + "matter": "Não", + "memoria_sram": "320 KB", + "memoria_sram_rtc": "Não", + "memoria_rom": "256 KB", + "flash_externa": "Até 16 MB via QSPI (modelos com 4 MB ou 8 MB integrados no encapsulamento)", + "psram_externa": "Até 16 MB via QSPI (modelos com 2 MB ou 8 MB integrados no encapsulamento)", + "gpio": "30", + "adc": "1x SAR ADC de 12 bits, até 4 canais", + "dac": "Não", + "touch": "Não", + "uart": "3", + "spi": "3 (2 para Flash/PSRAM, 1 para uso geral)", + "i2c": "1", + "i2s": "1", + "pwm": "LED PWM (até 6 canais)", + "usb": "1 (USB Serial/JTAG)", + "sdio": "1 (SDIO 2.0 Slave)", + "sensor_temperatura": "1 (interno)", + "consumo_energia": { + "active": "Baixo consumo com clock dinâmico", + "light_sleep": "0.1-0.8 mA", + "deep_sleep": "7 µA" + }, + "temperatura_operacao": "-40°C a 105°C", + "temperatura_armazenamento": "-40°C a 150°C", + "datasheet": "https://documentation.espressif.com/esp32-c61_datasheet_en.html", + "manual_tecnico": "https://documentation.espressif.com/esp32-c61_technical_reference_manual_en.html", + "guia_de_programacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c61/get-started/index.html", + "placa": "/placas/esp32-c61.png", + "cor": "#0dcaf0" + }, "ESP32-P4": { "nome_completo": "ESP32-P4", "icone": "⚡", - "descricao": "Alto desempenho com processador RISC-V dual-core a 400MHz e aceleradores de IA", - "arquitetura": "RISC-V de 32 bits dual-core de alto desempenho + single-core de baixo consumo", + "descricao": "Alto desempenho com processador RISC-V dual-core a 400MHz, aceleradores de IA e ricas interfaces de mídia", + "arquitetura": "RISC-V de 32 bits dual-core de alto desempenho (HP) + single-core de baixo consumo (LP)", "nucleos": "2 (Dual-core HP) + 1 (Single-core LP)", "frequencia": "Até 400 MHz", "aceleradores_ia": "Sim (Vector Instructions, aceleradores de IA)", @@ -263,9 +387,10 @@ "bluetooth": "Não", "ethernet": "Sim (Ethernet MAC integrado)", "memoria_sram": "768 KB", - "memoria_rom": "768 KB", + "memoria_sram_rtc": "32 KB", + "memoria_rom": "128 KB", "flash_externa": "Até 128 MB via QSPI/Octal SPI", - "psram_externa": "Até 32 MB via QSPI/Octal SPI", + "psram_externa": "Suporta até 64 MB (16 MB ou 32 MB integrados no encapsulamento via OPI/HPI)", "gpio": "55", "adc": "1x SAR ADC de 12 bits, até 8 canais", "dac": "Não", @@ -298,13 +423,13 @@ "ESP32-H2": { "nome_completo": "ESP32-H2", "icone": "🔋", - "descricao": "Focado em ultra-baixo consumo com Bluetooth, Zigbee e Thread. Mas sem suporte a Wi-Fi", + "descricao": "Focado em ultra-baixo consumo com Bluetooth 5.3, Zigbee e Thread. Mas sem suporte a Wi-Fi", "arquitetura": "RISC-V single-core de 32 bits", "nucleos": "1 (Single-core)", "frequencia": "Até 96 MHz", "wifi": "Não", - "bluetooth": "Bluetooth 5.2 LE", - "zigbee_thread": "IEEE 802.15.4 (Zigbee, Thread)", + "bluetooth": "Bluetooth 5.3 LE", + "zigbee_thread": "IEEE 802.15.4 (Zigbee 3.0, Thread 1.3)", "matter": "Sim", "memoria_sram": "320 KB", "memoria_sram_rtc": "16 KB",