Add public/series.json containing detailed ESP32 family specifications

Add a new JSON file public/series.json that defines detailed metadata for multiple
ESP32 series variants. The file includes entries for: ESP32, ESP32-S2, ESP32-S3,
ESP32-C3, ESP32-C5, ESP32-C6, ESP32-P4 and ESP32-H2.

Each entry provides human-friendly and technical fields such as:
- nome_completo, icone, descricao
- arquitetura, nucleos, frequencia, coprocessador_ulp, aceleradores_ia (when applicable)
- wireless capabilities (Wi‑Fi, Bluetooth, Zigbee/Thread, Matter), USB, Ethernet
- memory details (SRAM, RTC SRAM, ROM, external flash/PSRAM)
- peripherals and I/O counts (GPIO, ADC, DAC, touch, UART, SPI, I2C, I2S, PWM, SDIO, etc.)
- sensor info, temperature ranges, datasheet links and UI color values

This file will be used to power device/series lists and UI displays with consistent,
localized technical descriptions and links to datasheets.
This commit is contained in:
Lucas Rayan committed 2025-10-22 00:04:06 -03:00
1 parent 3d06c74447
commit f49d9a8921
41 files changed
+14794 -132

No files matched your search

+33 -131
View File
@@ -1,139 +1,41 @@
# Logs # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html) # dependencies
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json /node_modules
/.pnp
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.*
!.env.example
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
.cache
# Sveltekit cache directory
.svelte-kit/
# vitepress build output
**/.vitepress/dist
# vitepress cache directory
**/.vitepress/cache
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# Firebase cache directory
.firebase/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v3
.pnp.* .pnp.*
.yarn/* .yarn/*
!.yarn/patches !.yarn/patches
!.yarn/plugins !.yarn/plugins
!.yarn/releases !.yarn/releases
!.yarn/sdks
!.yarn/versions !.yarn/versions
# Vite logs files # testing
vite.config.js.timestamp-* /coverage
vite.config.ts.timestamp-*
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# env files (can opt-in for committing if needed)
.env*
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts
+36 -1
View File
@@ -1 +1,36 @@
# esp32 This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
## Getting Started
First, run the development server:
```bash
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file.
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
## Learn More
To learn more about Next.js, take a look at the following resources:
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
## Deploy on Vercel
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
+236
View File
@@ -0,0 +1,236 @@
"use client";
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import { useState } from "react";
import Link from "next/link";
import seriesData from "@/public/series.json";
export default function Comparacao() {
const [selectedSeries, setSelectedSeries] = useState(["ESP32", "ESP32-S3"]);
const series = Object.entries(seriesData);
const toggleSeries = (seriesKey) => {
if (selectedSeries.includes(seriesKey)) {
if (selectedSeries.length > 2) {
setSelectedSeries(selectedSeries.filter(s => s !== seriesKey));
}
} else {
if (selectedSeries.length < 4) {
setSelectedSeries([...selectedSeries, seriesKey]);
}
}
};
const compareFields = [
{ category: "Geral", fields: [
{ key: "nome_completo", label: "Nome Completo" },
{ key: "descricao", label: "Descrição" },
]},
{ category: "Processador", fields: [
{ key: "arquitetura", label: "Arquitetura" },
{ key: "nucleos", label: "Núcleos" },
{ key: "frequencia", label: "Frequência" },
{ key: "coprocessador_ulp", label: "Coprocessador ULP" },
{ key: "aceleradores_ia", label: "Aceleradores de IA" },
]},
{ category: "Conectividade", fields: [
{ key: "wifi", label: "Wi-Fi" },
{ key: "bluetooth", label: "Bluetooth" },
{ key: "zigbee_thread", label: "Zigbee/Thread" },
{ key: "matter", label: "Matter" },
{ key: "ethernet", label: "Ethernet" },
]},
{ category: "Memória", fields: [
{ key: "memoria_sram", label: "SRAM" },
{ key: "memoria_sram_rtc", label: "SRAM RTC" },
{ key: "memoria_rom", label: "ROM" },
{ key: "flash_externa", label: "Flash Externa" },
{ key: "psram_externa", label: "PSRAM Externa" },
]},
{ category: "Periféricos Digitais", fields: [
{ key: "gpio", label: "GPIO" },
{ key: "uart", label: "UART" },
{ key: "spi", label: "SPI" },
{ key: "i2c", label: "I²C" },
{ key: "i2s", label: "I²S" },
{ key: "pwm", label: "PWM" },
{ key: "can", label: "CAN" },
{ key: "usb", label: "USB" },
{ key: "sdio", label: "SDIO" },
]},
{ category: "Periféricos Analógicos", fields: [
{ key: "adc", label: "ADC" },
{ key: "dac", label: "DAC" },
{ key: "touch", label: "Touch Capacitivo" },
{ key: "sensor_hall", label: "Sensor Hall" },
{ key: "sensor_temperatura", label: "Sensor de Temperatura" },
]},
{ category: "Interfaces Especiais", fields: [
{ key: "lcd", label: "LCD" },
{ key: "camera", label: "Câmera" },
{ key: "mipi_csi", label: "MIPI CSI" },
{ key: "mipi_dsi", label: "MIPI DSI" },
{ key: "ethernet_mac", label: "Ethernet MAC" },
]},
{ category: "Especificações Ambientais", fields: [
{ key: "temperatura_operacao", label: "Temp. Operação" },
{ key: "temperatura_armazenamento", label: "Temp. Armazenamento" },
]},
];
const renderValue = (value) => {
if (!value || value === "Não") {
return <span className="text-red-500 font-semibold">✗</span>;
}
if (value === "Sim") {
return <span className="text-green-500 font-semibold">✓</span>;
}
return <span className="text-gray-700">{value}</span>;
};
return (
<div className="bg-linear-to-br from-blue-50 via-white to-purple-50 min-h-screen">
<Header />
<main className="px-4 pt-16 pb-8 max-w-7xl mx-auto">
<div className="text-center mb-12">
<div className="inline-block mb-6">
<div className="bg-linear-to-r from-blue-600 to-purple-600 text-white px-4 py-2 rounded-full text-sm font-semibold shadow-lg">
📊 Compare Séries
</div>
</div>
<h1 className="text-5xl md:text-6xl font-extrabold bg-linear-to-r from-blue-600 via-purple-600 to-pink-600 bg-clip-text text-transparent mb-4">
Comparação de Séries
</h1>
<p className="text-lg text-gray-600 max-w-2xl mx-auto">
Compare especificações técnicas entre diferentes séries ESP32 para escolher o ideal para seu projeto
</p>
</div>
<div className="mb-12">
<h2 className="text-2xl font-bold text-gray-800 mb-4 text-center">
Selecione as Séries (2-4)
</h2>
<div className="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-8 gap-4">
{series.map(([key, seriesItem]) => (
<button
key={key}
onClick={() => toggleSeries(key)}
className={`p-4 rounded-xl border-2 transition-all duration-300 transform hover:scale-105 ${
selectedSeries.includes(key)
? 'border-purple-500 shadow-lg bg-white'
: 'border-gray-200 hover:border-gray-300 bg-white opacity-60'
}`}
style={{
borderColor: selectedSeries.includes(key) ? seriesItem.cor : undefined
}}
>
<div className="text-4xl mb-2">{seriesItem.icone}</div>
<div className="text-sm font-semibold text-gray-800">{key}</div>
{selectedSeries.includes(key) && (
<div className="mt-2">
<span className="inline-block w-3 h-3 rounded-full" style={{ backgroundColor: seriesItem.cor }}></span>
</div>
)}
</button>
))}
</div>
<p className="text-center text-sm text-gray-500 mt-4">
{selectedSeries.length} de 4 séries selecionadas
</p>
</div>
<div className="bg-white rounded-2xl shadow-xl overflow-hidden border border-gray-200">
<div className="overflow-x-auto">
<table className="w-full">
<thead>
<tr className="bg-linear-to-r from-blue-600 to-purple-600">
<th className="px-6 py-4 text-left text-white font-bold bg-linear-to-r from-blue-600 to-purple-600 z-10">
Especificação
</th>
{selectedSeries.map(seriesKey => {
const seriesItem = seriesData[seriesKey];
return (
<th key={seriesKey} className="px-6 py-4 text-center text-white font-bold min-w-[200px]">
<div className="flex flex-col items-center gap-2">
<span className="text-3xl">{seriesItem.icone}</span>
<span>{seriesKey}</span>
<span className="inline-block w-4 h-4 rounded-full" style={{ backgroundColor: seriesItem.cor }}></span>
</div>
</th>
);
})}
</tr>
</thead>
<tbody>
{compareFields.map(({ category, fields }) => (
<>
<tr key={category} className="bg-gray-100">
<td colSpan={selectedSeries.length + 1} className="px-6 py-3 font-bold text-gray-800 bg-gray-100 z-10">
{category}
</td>
</tr>
{fields.map(({ key, label }) => (
<tr key={key} className="border-b border-gray-200 hover:bg-gray-50 transition-colors">
<td className="px-6 py-4 font-medium text-gray-700 bg-white z-10 border-r border-gray-200">
{label}
</td>
{selectedSeries.map(seriesKey => {
const seriesItem = seriesData[seriesKey];
const value = seriesItem[key];
return (
<td key={seriesKey} className="px-6 py-4 text-center">
{renderValue(value)}
</td>
);
})}
</tr>
))}
</>
))}
</tbody>
</table>
</div>
</div>
<div className="mt-12 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
{selectedSeries.map(seriesKey => {
const seriesItem = seriesData[seriesKey];
return (
<a
key={seriesKey}
href={seriesItem.datasheet}
target="_blank"
rel="noopener noreferrer"
className="bg-white p-6 rounded-xl shadow-lg hover:shadow-2xl transform hover:-translate-y-2 transition-all duration-300 border-2"
style={{ borderColor: seriesItem.cor }}
>
<div className="text-4xl mb-3">{seriesItem.icone}</div>
<Link href={`/series/${seriesKey}`} className="no-underline">
<h3 className="text-lg font-bold text-gray-800 mb-2">{seriesKey}</h3>
</Link>
<p className="text-sm text-gray-600">Datasheet Oficial</p>
<a
className="flex items-center text-purple-600 font-semibold"
href={seriesItem.datasheet}
target="_blank"
rel="noopener noreferrer"
>
<span>Abrir PDF</span>
<svg className="w-4 h-4 ml-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" />
</svg>
</a>
</a>
);
})}
</div>
</main>
<Footer />
</div>
);
}
+188
View File
@@ -0,0 +1,188 @@
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import Link from "next/link";
import frameworksData from "@/public/frameworks.json";
import { notFound } from "next/navigation";
export default function FrameworkDetail({ params }) {
const { key } = params;
const framework = frameworksData[key];
if (!framework) {
notFound();
}
const features = framework.caracteristicas || [];
const useCases = framework.casos_uso || [];
return (
<div className="bg-linear-to-br from-blue-50 via-white to-purple-50 min-h-screen">
<Header />
<main className="px-4 pt-16 pb-8 max-w-7xl mx-auto">
<div className="mb-8">
<Link href="/frameworks" className="inline-flex items-center text-gray-600 hover:text-purple-600 transition-colors mb-4">
<span className="mr-2">←</span> Voltar para Frameworks
</Link>
<div className="bg-white rounded-3xl shadow-xl p-8 border-2 border-gray-100"
style={{ borderColor: framework.cor + '30' }}>
<div className="flex items-start justify-between flex-wrap gap-4">
<div className="flex items-center gap-4">
<span className="text-6xl">{framework.icone}</span>
<div>
<h1 className="text-4xl md:text-5xl font-extrabold text-gray-800 mb-2">
{framework.nome}
</h1>
<p className="text-xl text-gray-600 mb-2">{framework.nome_completo}</p>
<span className="inline-block px-4 py-2 rounded-full text-sm font-semibold text-white"
style={{ backgroundColor: framework.cor }}>
{framework.tipo}
</span>
</div>
</div>
<div className="flex items-center gap-3">
{framework.documentacao && (
<a
href={framework.documentacao}
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center gap-2 bg-linear-to-r from-blue-600 to-purple-600 text-white px-5 py-2 rounded-xl font-semibold shadow hover:shadow-lg transition"
>
📘 Documentação
</a>
)}
{framework.repositorio && (
<a
href={framework.repositorio}
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center gap-2 bg-white text-gray-800 px-5 py-2 rounded-xl font-semibold shadow border-2 border-gray-100 hover:border-purple-300 transition"
>
🔗 Repositório
</a>
)}
</div>
</div>
<p className="text-lg text-gray-700 mt-6 leading-relaxed">
{framework.descricao}
</p>
</div>
</div>
<div className="grid md:grid-cols-3 gap-6 mb-8">
<div className="bg-white rounded-2xl shadow-lg p-6 border-l-4" style={{ borderColor: framework.cor }}>
<h3 className="text-sm font-semibold text-gray-600 mb-2">LINGUAGEM</h3>
<p className="text-3xl font-bold text-gray-800">{framework.linguagem}</p>
<p className="text-gray-600 mt-1">Principal</p>
</div>
<div className="bg-white rounded-2xl shadow-lg p-6 border-l-4" style={{ borderColor: framework.cor }}>
<h3 className="text-sm font-semibold text-gray-600 mb-2">TIPO</h3>
<p className="text-3xl font-bold text-gray-800">{framework.tipo}</p>
<p className="text-gray-600 mt-1">Categoria</p>
</div>
<div className="bg-white rounded-2xl shadow-lg p-6 border-l-4" style={{ borderColor: framework.cor }}>
<h3 className="text-sm font-semibold text-gray-600 mb-2">FUNÇÃO PRINCIPAL</h3>
<p className="text-3xl font-bold text-gray-800">{framework.funcao_principal}</p>
</div>
</div>
<div className="grid lg:grid-cols-3 gap-6 mb-8">
<div className="lg:col-span-2 bg-white rounded-2xl shadow-lg p-6 border-2 border-gray-100">
<h2 className="text-2xl font-bold text-gray-800 mb-4 pb-3 border-b-2" style={{ borderColor: framework.cor }}>
✨ Principais Características
</h2>
<ul className="list-disc list-inside space-y-2 text-gray-700">
{features.map((f, i) => (
<li key={i} className="pl-2">{f}</li>
))}
</ul>
<h2 className="text-2xl font-bold text-gray-800 mt-8 mb-4 pb-3 border-b-2" style={{ borderColor: framework.cor }}>
📦 Casos de Uso
</h2>
<div className="grid md:grid-cols-2 gap-3">
{useCases.map((u, i) => (
<div key={i} className="bg-gray-50 p-3 rounded-lg text-gray-700">{u}</div>
))}
</div>
</div>
<div className="bg-white rounded-2xl shadow-lg p-6 border-2 border-gray-100">
<h2 className="text-2xl font-bold text-gray-800 mb-4 pb-3 border-b-2" style={{ borderColor: framework.cor }}>
📋 Detalhes Rápidos
</h2>
<div className="space-y-3 text-gray-700">
<div><span className="font-semibold">Nome completo:</span> {framework.nome_completo}</div>
<div><span className="font-semibold">Linguagem:</span> {framework.linguagem}</div>
<div><span className="font-semibold">Tipo:</span> {framework.tipo}</div>
<div><span className="font-semibold">Cor (tema):</span> <span className="inline-block w-4 h-4 rounded ml-2" style={{ backgroundColor: framework.cor }} /></div>
</div>
</div>
</div>
{framework.exemplo_codigo && (
<div className="bg-white rounded-2xl shadow-lg p-6 border-2 border-gray-100 mb-8">
<h3 className="text-lg font-semibold text-gray-800 mb-4" style={{ borderColor: framework.cor }}>
Exemplo de Código
</h3>
<div className="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-auto text-sm" style={{ maxHeight: 480 }}>
<pre className="whitespace-pre-wrap">
<code>{framework.exemplo_codigo}</code>
</pre>
</div>
</div>
)}
<div className="flex gap-4 mt-6">
{framework.documentacao && (
<a
href={framework.documentacao}
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center gap-2 bg-linear-to-r from-blue-600 to-purple-600 text-white px-6 py-3 rounded-xl font-semibold shadow hover:shadow-xl transition"
>
📚 Documentação Oficial
</a>
)}
{framework.repositorio && (
<a
href={framework.repositorio}
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center gap-2 bg-white text-gray-800 px-6 py-3 rounded-xl font-semibold shadow border-2 border-gray-100 hover:border-purple-300 transition"
>
💻 Repositório no GitHub
</a>
)}
</div>
</main>
<Footer />
</div>
);
}
export async function generateMetadata({ params }) {
const { key } = params;
const framework = frameworksData[key];
if (!framework) {
return { title: "Framework não encontrado" };
}
return {
title: `${framework.nome} - ${framework.nome_completo}`,
description: framework.descricao,
};
}
export async function generateStaticParams() {
return Object.keys(frameworksData).map((key) => ({ key }));
}
+192
View File
@@ -0,0 +1,192 @@
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import Link from "next/link";
import frameworksData from "@/public/frameworks.json";
export default function Frameworks() {
const frameworks = Object.entries(frameworksData);
return (
<div className="bg-linear-to-br from-blue-50 via-white to-purple-50 min-h-screen">
<Header />
<main className="px-4 pt-16 pb-8 max-w-7xl mx-auto">
<div className="text-center mb-12">
<h1 className="text-5xl md:text-6xl font-extrabold bg-linear-to-r from-blue-600 via-purple-600 to-pink-600 bg-clip-text text-transparent mb-4">
Frameworks ESP32
</h1>
<p className="text-lg text-gray-600 max-w-3xl mx-auto">
Descubra os frameworks e bibliotecas disponíveis para ESP32. De desenvolvimento geral a
aplicações especializadas em áudio, visão computacional, IA e IoT.
</p>
</div>
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
{frameworks.map(([key, framework]) => (
<Link
key={key}
href={`/frameworks/${key}`}
className="group"
>
<div className="bg-white rounded-2xl shadow-lg hover:shadow-2xl transform hover:-translate-y-2 transition-all duration-300 border-2 border-gray-100 hover:border-opacity-50 h-full flex flex-col">
<div className="p-6 border-b border-gray-100">
<div className="flex items-center justify-between mb-3">
<span className="text-5xl">{framework.icone}</span>
<div className="flex flex-col gap-2 items-end">
<span className="px-3 py-1 rounded-full text-xs font-semibold text-white"
style={{ backgroundColor: framework.cor }}>
{framework.linguagem}
</span>
</div>
</div>
<h2 className="text-2xl font-bold text-gray-800 mb-1 group-hover:text-purple-600 transition-colors">
{framework.nome}
</h2>
<p className="text-xs text-gray-500 mb-3 font-medium">
{framework.nome_completo}
</p>
<p className="text-sm text-gray-600 line-clamp-3">
{framework.descricao}
</p>
</div>
<div className="p-6 space-y-4 grow">
<div>
<span className="inline-block px-3 py-1 rounded-lg text-xs font-semibold"
style={{
backgroundColor: `${framework.cor}20`,
color: framework.cor
}}>
{framework.tipo}
</span>
</div>
<div>
<h4 className="text-xs font-bold text-gray-700 mb-2 uppercase tracking-wide">
🎯 Função Principal
</h4>
<p className="text-sm text-gray-600 line-clamp-2">
{framework.funcao_principal}
</p>
</div>
<div>
<h4 className="text-xs font-bold text-gray-700 mb-2 uppercase tracking-wide">
⚡ Características
</h4>
<ul className="space-y-1">
{framework.caracteristicas.slice(0, 3).map((carac, idx) => (
<li key={idx} className="text-xs text-gray-600 flex items-start">
<span className="mr-2 mt-0.5" style={{ color: framework.cor }}>▪</span>
<span className="line-clamp-1">{carac}</span>
</li>
))}
{framework.caracteristicas.length > 3 && (
<li className="text-xs text-gray-400 italic">
+{framework.caracteristicas.length - 3} mais...
</li>
)}
</ul>
</div>
<div>
<h4 className="text-xs font-bold text-gray-700 mb-2 uppercase tracking-wide">
💼 Casos de Uso
</h4>
<div className="flex flex-wrap gap-2">
{framework.casos_uso.slice(0, 3).map((caso, idx) => (
<span key={idx} className="text-xs bg-gray-100 text-gray-700 px-2 py-1 rounded">
{caso}
</span>
))}
</div>
</div>
</div>
<div className="px-6 pb-6">
<div className="flex items-center justify-between text-sm font-semibold group-hover:text-purple-600 transition-colors">
<span>Ver Detalhes e Exemplos</span>
<span className="transform group-hover:translate-x-2 transition-transform">→</span>
</div>
</div>
</div>
</Link>
))}
</div>
<div className="mt-12 grid md:grid-cols-2 gap-6">
<div className="bg-white rounded-2xl shadow-lg p-8 border border-gray-100">
<h3 className="text-2xl font-bold text-gray-800 mb-4">
🎓 Iniciante no ESP32?
</h3>
<p className="text-gray-600 mb-4">
Se você está começando, recomendamos iniciar com <strong>Arduino</strong> ou <strong>MicroPython</strong>
para prototipagem rápida, ou <strong>ESP-IDF</strong> para projetos profissionais com controle total.
</p>
<div className="flex flex-wrap gap-2">
<Link href="/frameworks/Arduino" className="px-4 py-2 bg-blue-100 text-blue-700 rounded-lg text-sm font-semibold hover:bg-blue-200 transition-colors">
📘 Arduino
</Link>
<Link href="/frameworks/MicroPython" className="px-4 py-2 bg-purple-100 text-purple-700 rounded-lg text-sm font-semibold hover:bg-purple-200 transition-colors">
🐍 MicroPython
</Link>
<Link href="/frameworks/ESP-IDF" className="px-4 py-2 bg-red-100 text-red-700 rounded-lg text-sm font-semibold hover:bg-red-200 transition-colors">
⚙️ ESP-IDF
</Link>
</div>
</div>
<div className="bg-white rounded-2xl shadow-lg p-8 border border-gray-100">
<h3 className="text-2xl font-bold text-gray-800 mb-4">
🚀 Aplicações Especializadas?
</h3>
<p className="text-gray-600 mb-4">
Para projetos específicos, explore frameworks especializados como <strong>ESP-ADF</strong> (áudio),
<strong>ESP-WHO</strong> (visão), <strong>ESP-NN</strong> (IA) ou <strong>ESP-Matter</strong> (smart home).
</p>
<div className="flex flex-wrap gap-2">
<Link href="/frameworks/ESP-ADF" className="px-4 py-2 bg-blue-100 text-blue-700 rounded-lg text-sm font-semibold hover:bg-blue-200 transition-colors">
🎵 Áudio
</Link>
<Link href="/frameworks/ESP-WHO" className="px-4 py-2 bg-orange-100 text-orange-700 rounded-lg text-sm font-semibold hover:bg-orange-200 transition-colors">
📷 Visão
</Link>
<Link href="/frameworks/ESP-NN" className="px-4 py-2 bg-teal-100 text-teal-700 rounded-lg text-sm font-semibold hover:bg-teal-200 transition-colors">
🧠 IA
</Link>
<Link href="/frameworks/ESP-Matter" className="px-4 py-2 bg-yellow-100 text-yellow-700 rounded-lg text-sm font-semibold hover:bg-yellow-200 transition-colors">
🏠 Smart Home
</Link>
</div>
</div>
</div>
<div className="mt-8 bg-linear-to-r from-blue-600 via-purple-600 to-pink-600 rounded-2xl shadow-lg p-8 text-white">
<div className="flex flex-col md:flex-row items-center justify-between gap-6">
<div className="flex-1">
<h3 className="text-2xl font-bold mb-2">
💡 Precisa de Ajuda para Escolher?
</h3>
<p className="text-blue-100">
Compare frameworks, veja exemplos de código e entenda qual se adequa melhor ao seu projeto.
</p>
</div>
<Link
href="/comparacao-frameworks"
className="bg-white text-purple-600 px-6 py-3 rounded-xl font-semibold shadow-lg hover:shadow-xl transform hover:-translate-y-1 transition-all duration-300 whitespace-nowrap"
>
📊 Comparar Frameworks
</Link>
</div>
</div>
</main>
<Footer />
</div>
);
}
+1
View File
@@ -0,0 +1 @@
@import "tailwindcss";
+20
View File
@@ -0,0 +1,20 @@
import { Roboto } from "next/font/google";
import "./globals.css";
const roboto = Roboto({ subsets: ["latin"] });
export const metadata = {
title: "ESPDocs",
description: "Documentação não oficial do ESP32 em português.",
authors: { name: "Lucas Rayan Guerra", url: "https://cienciaembarcada.com.br" },
};
export default function RootLayout({ children }) {
return (
<html lang="pt-BR">
<body className={`${roboto.className} font-sans`}>
{children}
</body>
</html>
);
}
+150
View File
@@ -0,0 +1,150 @@
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import Link from "next/link";
export default function Sobre() {
const features = [
{ icon: "📚", title: "Documentação Curada", desc: "Conteúdos organizados por níveis — do iniciante ao avançado." },
{ icon: "🔧", title: "Exemplos Práticos", desc: "Projetos e trechos de código para aprender fazendo." },
{ icon: "🌐", title: "Comunidade", desc: "Contribuições abertas e canal para dúvidas e trocas." },
{ icon: "♿", title: "Acessibilidade", desc: "Textos claros, contraste adequado e navegação por teclado." },
];
return (
<div className="bg-linear-to-br from-blue-50 via-white to-purple-50 min-h-screen text-gray-800">
<a href="#conteudo" className="sr-only focus:not-sr-only focus:absolute focus:top-4 focus:left-4 focus:bg-white focus:px-4 focus:py-2 focus:rounded-md focus:shadow focus:ring-2 focus:ring-purple-500">
Ir para o conteúdo
</a>
<Header />
<main id="conteudo" className="px-4 pt-16 pb-20 max-w-6xl mx-auto">
<header className="relative overflow-hidden rounded-2xl p-8 md:p-12 bg-linear-to-r from-blue-600 via-purple-600 to-pink-500 text-white shadow-lg">
<div className="absolute right-0 top-0 -mr-40 -mt-24 opacity-20 pointer-events-none">
<svg width="400" height="300" viewBox="0 0 600 400" fill="none" aria-hidden="true">
<path d="M0 200 C150 100 350 300 600 200 L600 400 L0 400 Z" fill="white" />
</svg>
</div>
<div className="relative z-10 max-w-4xl mx-auto">
<h1 className="text-4xl md:text-5xl font-extrabold leading-tight bg-clip-text text-transparent bg-linear-to-r from-white to-purple-100 mb-3">
Sobre o ESPDocs
</h1>
<p className="text-lg md:text-xl opacity-90 max-w-3xl mb-6">
Uma documentação não oficial, em português, feita por e para a comunidade — com foco em clareza, exemplos práticos e colaboração aberta.
</p>
<div className="flex flex-col sm:flex-row gap-3 sm:gap-4 items-start sm:items-center">
<Link href="/" className="inline-flex items-center justify-center bg-white text-blue-700 px-4 py-2 rounded-lg font-semibold shadow-sm hover:shadow-md transition focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-white" aria-label="Voltar para a página inicial">
← Voltar
</Link>
<a
href="https://github.com/lucasrguerra/ESPDocs"
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center justify-center bg-white/20 border border-white/30 text-white px-4 py-2 rounded-lg font-semibold hover:bg-white/30 transition focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-white"
aria-label="Abrir repositório do projeto no GitHub (abre em nova aba)"
>
Contribuir no GitHub
</a>
</div>
</div>
</header>
<div className="mt-8 grid grid-cols-1 md:grid-cols-3 gap-6">
<section className="md:col-span-2 space-y-6">
<article className="bg-white/70 backdrop-blur-sm rounded-2xl p-6 shadow-sm border border-gray-100">
<h2 className="text-2xl font-bold mb-2">Nossa missão</h2>
<p className="text-gray-700 leading-relaxed">
Facilitar o aprendizado e acelerar projetos com ESP32 por meio de documentação clara, exemplos testados e comparativos práticos.
Priorizamos traduções fiéis, explicações passo a passo e dicas baseadas em experiência real de desenvolvimento.
</p>
</article>
<article className="bg-white rounded-2xl p-6 shadow-sm border border-gray-100">
<h2 className="text-2xl font-bold mb-2">Por que o ESPDocs?</h2>
<p className="text-gray-700 leading-relaxed mb-4">
Informações técnicas frequentemente estão dispersas entre datasheets, fóruns e repositórios. O ESPDocs centraliza esse conteúdo em português, com foco em aplicabilidade.
</p>
<ul role="list" className="grid sm:grid-cols-2 gap-4">
{features.map((f) => (
<li key={f.title} className="flex gap-3 items-start bg-gray-50 p-4 rounded-lg border border-gray-100">
<div className="text-2xl" aria-hidden="true">{f.icon}</div>
<div>
<h3 className="font-semibold text-gray-800">{f.title}</h3>
<p className="text-sm text-gray-600">{f.desc}</p>
</div>
</li>
))}
</ul>
</article>
<article className="bg-white/70 backdrop-blur-sm rounded-2xl p-6 shadow-sm border border-gray-100">
<h2 className="text-2xl font-bold mb-2">Como contribuir</h2>
<p className="text-gray-700 leading-relaxed mb-3">
Correções, traduções e novos exemplos são bem-vindos. Abra uma issue ou um pull request no repositório. Buscamos clareza nas descrições e exemplos testáveis.
</p>
<ol className="list-decimal list-inside text-gray-700 space-y-1">
<li>Fork do repositório e crie uma branch clara.</li>
<li>Adicione exemplos ou corrija o conteúdo com referências quando possível.</li>
<li>Abra um PR e descreva o que foi alterado.</li>
</ol>
</article>
<article className="bg-white rounded-2xl p-6 shadow-sm border border-gray-100">
<h2 className="text-2xl font-bold mb-2">Acessibilidade</h2>
<p className="text-gray-700 leading-relaxed">
O site prioriza leitura, contraste legível e navegação por teclado. Se encontrar barreiras, por favor relate-nos para que possamos melhorar.
</p>
</article>
</section>
<aside className="space-y-4">
<div className="bg-white rounded-2xl p-6 shadow-md border border-gray-100">
<div className="flex items-center justify-between mb-3">
<h3 className="text-lg font-semibold">Contribua</h3>
<span className="text-xs bg-green-100 text-green-800 px-2 py-1 rounded-full">Open Source</span>
</div>
<p className="text-gray-700 mb-4">Ajude a melhorar o ESPDocs com exemplos, correções e traduções.</p>
<div className="flex flex-col gap-3">
<a
href="https://github.com/lucasrguerra/ESPDocs"
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center justify-center px-4 py-2 rounded-lg bg-linear-to-r from-blue-600 to-purple-600 text-white font-semibold shadow-sm hover:shadow-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500"
aria-label="Abrir repositório no GitHub"
>
Ver repositório
</a>
<Link href="/contato" className="inline-flex items-center justify-center px-4 py-2 rounded-lg border border-gray-200 text-gray-700 hover:border-purple-400 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500" aria-label="Ir para a página de contato">
Entrar em contato
</Link>
</div>
<div className="mt-4 text-sm text-gray-500">
<strong>Nota:</strong> Conteúdo não oficial. Consulte sempre datasheets e documentos oficiais para decisões críticas.
</div>
</div>
<div className="bg-white/80 rounded-2xl p-4 shadow-sm border border-gray-100">
<h4 className="font-semibold mb-2">Resumo</h4>
<ul className="text-sm text-gray-700 space-y-2">
<li>🔎 Conteúdo técnico explicado.</li>
<li>🧪 Exemplos e projetos.</li>
<li>🤝 Comunidade e contribuições.</li>
</ul>
</div>
</aside>
</div>
</main>
<Footer />
</div>
);
}
+306
View File
@@ -0,0 +1,306 @@
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import Link from "next/link";
import seriesData from "@/public/series.json";
import { notFound } from "next/navigation";
import ConnectionsDiagram from "@/components/ConnectionsDiagram";
import Image from "next/image";
import SeriesTabMenu from "@/components/SeriesTabMenu";
export default function SerieDetail({ params }) {
const { key } = params;
const serie = seriesData[key];
if (!serie) {
notFound();
}
let conexoes = [];
try {
conexoes = require(`@/public/conexoes/${key}.json`);
} catch (error) {
console.log(`Arquivo de conexões não encontrado para ${key}`);
}
// Development board image mapping
const devBoardImages = {
"ESP32": "/placas/esp32.png",
"ESP32-S2": "/placas/esp32-s2.png",
"ESP32-S3": "/placas/esp32-s3.png",
"ESP32-C3": "/placas/esp32-c3.png",
"ESP32-C5": "/placas/esp32-c5.png",
"ESP32-C6": "/placas/esp32-c6.png",
"ESP32-H2": "/placas/esp32-h2.png",
"ESP32-C2": "/placas/esp32-c2.png",
"ESP32-P4": "/placas/esp32-p4.png",
};
const seriesKeys = Object.keys(seriesData);
const currentIndex = seriesKeys.indexOf(key);
const previousKey = currentIndex > 0 ? seriesKeys[currentIndex - 1] : null;
const nextKey = currentIndex < seriesKeys.length - 1 ? seriesKeys[currentIndex + 1] : null;
const processadorSpecs = [
{ label: "Arquitetura", value: serie.arquitetura, icon: "🔧" },
{ label: "Núcleos", value: serie.nucleos, icon: "⚙️" },
{ label: "Frequência", value: serie.frequencia, icon: "🚀" },
{ label: "Coprocessador ULP", value: serie.coprocessador_ulp || "Não", icon: "💤" },
{ label: "Aceleradores IA", value: serie.aceleradores_ia || "Não", icon: "🤖" },
];
const conectividadeSpecs = [
{ label: "Wi-Fi", value: serie.wifi || "Não", icon: "📶" },
{ label: "Bluetooth", value: serie.bluetooth || "Não", icon: "📱" },
{ label: "Zigbee/Thread", value: serie.zigbee_thread || "Não", icon: "🌐" },
{ label: "Matter", value: serie.matter || "Não", icon: "🏠" },
{ label: "Ethernet", value: serie.ethernet || serie.ethernet_mac || "Não", icon: "🔌" },
{ label: "CAN", value: serie.can || "Não", icon: "🚗" },
];
const memoriaSpecs = [
{ label: "SRAM", value: serie.memoria_sram, icon: "💾" },
{ label: "SRAM RTC", value: serie.memoria_sram_rtc, icon: "⏰" },
{ label: "ROM", value: serie.memoria_rom, icon: "📀" },
{ label: "Flash Externa", value: serie.flash_externa, icon: "💿" },
{ label: "PSRAM Externa", value: serie.psram_externa || "Não", icon: "🎯" },
];
const perifericos = [
{ label: "GPIO", value: serie.gpio, icon: "📍" },
{ label: "ADC", value: serie.adc, icon: "📊" },
{ label: "DAC", value: serie.dac || "Não", icon: "🔊" },
{ label: "Touch", value: serie.touch || "Não", icon: "👆" },
{ label: "UART", value: serie.uart, icon: "💬" },
{ label: "SPI", value: serie.spi, icon: "🔄" },
{ label: "I2C", value: serie.i2c, icon: "🔗" },
{ label: "I2S", value: serie.i2s, icon: "🎵" },
{ label: "PWM", value: serie.pwm, icon: "〰️" },
{ label: "USB", value: serie.usb || "Não", icon: "🔌" },
];
const interfacesEspeciais = [];
if (serie.lcd) interfacesEspeciais.push({ label: "LCD", value: serie.lcd, icon: "🖥️" });
if (serie.camera) interfacesEspeciais.push({ label: "Camera", value: serie.camera, icon: "📷" });
if (serie.mipi_csi) interfacesEspeciais.push({ label: "MIPI CSI", value: serie.mipi_csi, icon: "📹" });
if (serie.mipi_dsi) interfacesEspeciais.push({ label: "MIPI DSI", value: serie.mipi_dsi, icon: "🖼️" });
if (serie.sdio) interfacesEspeciais.push({ label: "SDIO", value: serie.sdio, icon: "💳" });
if (serie.sensor_hall) interfacesEspeciais.push({ label: "Sensor Hall", value: serie.sensor_hall, icon: "🧲" });
if (serie.sensor_temperatura) interfacesEspeciais.push({ label: "Sensor Temperatura", value: serie.sensor_temperatura, icon: "🌡️" });
const tabs = [
{
id: 'connections',
label: 'Diagrama de Conexões',
available: conexoes.length > 0,
content: (
<div className="bg-white rounded-3xl shadow-xl p-8 border-2 border-gray-100">
<ConnectionsDiagram connections={conexoes} color={serie.cor} />
</div>
)
},
{
id: 'devboard',
label: 'Placa de Desenvolvimento',
available: devBoardImages[key],
content: (
<div className="bg-white rounded-3xl shadow-xl p-8 border-2 border-gray-100">
<h2 className="text-2xl font-bold text-gray-800 mb-6 pb-3 border-b-2 flex items-center gap-3" style={{ borderColor: serie.cor }}>
<span>🔧</span>
Placa de Desenvolvimento Oficial
</h2>
<div className="flex justify-center">
<div className="relative w-full max-w-4xl">
<Image
src={devBoardImages[key]}
alt={`${key} DevKit - Placa de Desenvolvimento`}
width={1200}
height={800}
className="rounded-xl shadow-lg w-full h-auto"
priority
/>
<p className="text-center text-sm text-gray-600 mt-4">
{key} - Placa de desenvolvimento oficial da Espressif
</p>
</div>
</div>
</div>
)
},
{
id: 'specs',
label: 'Especificações',
available: true,
content: (
<div className="space-y-6">
<SpecSection title="⚙️ Processador" specs={processadorSpecs} cor={serie.cor} />
<SpecSection title="📡 Conectividade" specs={conectividadeSpecs} cor={serie.cor} />
<SpecSection title="💾 Memória" specs={memoriaSpecs} cor={serie.cor} />
<SpecSection title="🔌 Periféricos" specs={perifericos} cor={serie.cor} />
{interfacesEspeciais.length > 0 && (
<SpecSection title="✨ Interfaces Especiais" specs={interfacesEspeciais} cor={serie.cor} />
)}
<SpecSection
title="🌡️ Temperatura"
specs={[
{ label: "Operação", value: serie.temperatura_operacao, icon: "🔧" },
{ label: "Armazenamento", value: serie.temperatura_armazenamento, icon: "📦" },
]}
cor={serie.cor}
/>
</div>
)
}
];
return (
<div className="bg-linear-to-br from-blue-50 via-white to-purple-50 min-h-screen">
<Header />
<main className="px-4 pt-16 pb-8 max-w-7xl mx-auto">
<div className="mb-8">
<Link href="/series" className="inline-flex items-center text-gray-600 hover:text-purple-600 transition-colors mb-4">
<span className="mr-2">←</span> Voltar para Séries
</Link>
<div className="bg-white rounded-3xl shadow-xl p-8 border-2 border-gray-100"
style={{ borderColor: serie.cor + '30' }}>
<div className="flex items-start justify-between flex-wrap gap-4">
<div className="flex items-center gap-4">
<span className="text-6xl">{serie.icone}</span>
<div>
<h1 className="text-4xl md:text-5xl font-extrabold text-gray-800 mb-2">
{key}
</h1>
<p className="text-xl text-gray-600 mb-2">{serie.nome_completo}</p>
<span className="inline-block px-4 py-2 rounded-full text-sm font-semibold text-white"
style={{ backgroundColor: serie.cor }}>
{serie.arquitetura}
</span>
</div>
</div>
<a
href={serie.datasheet}
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center gap-2 bg-linear-to-r from-blue-600 to-purple-600 text-white px-6 py-3 rounded-xl font-semibold shadow-lg hover:shadow-xl transform hover:-translate-y-1 transition-all duration-300"
>
📄 Datasheet Oficial
</a>
</div>
<p className="text-lg text-gray-700 mt-6 leading-relaxed">
{serie.descricao}
</p>
</div>
</div>
<div className="grid md:grid-cols-3 gap-6 mb-8">
<div className="bg-white rounded-2xl shadow-lg p-6 border-l-4" style={{ borderColor: serie.cor }}>
<h3 className="text-sm font-semibold text-gray-600 mb-2">PROCESSADOR</h3>
<p className="text-3xl font-bold text-gray-800">{serie.nucleos.includes("2") ? "Dual-Core" : "Single-Core"}</p>
<p className="text-gray-600 mt-1">{serie.frequencia}</p>
</div>
<div className="bg-white rounded-2xl shadow-lg p-6 border-l-4" style={{ borderColor: serie.cor }}>
<h3 className="text-sm font-semibold text-gray-600 mb-2">MEMÓRIA SRAM</h3>
<p className="text-3xl font-bold text-gray-800">{serie.memoria_sram}</p>
<p className="text-gray-600 mt-1">+ {serie.memoria_sram_rtc} RTC</p>
</div>
<div className="bg-white rounded-2xl shadow-lg p-6 border-l-4" style={{ borderColor: serie.cor }}>
<h3 className="text-sm font-semibold text-gray-600 mb-2">GPIO</h3>
<p className="text-3xl font-bold text-gray-800">{serie.gpio}</p>
<p className="text-gray-600 mt-1">Pinos disponíveis</p>
</div>
</div>
<SeriesTabMenu tabs={tabs} color={serie.cor} />
<div className="flex justify-between items-center gap-4 mt-12">
{previousKey ? (
<Link
href={`/series/${previousKey}`}
className="flex items-center gap-2 bg-white px-6 py-3 rounded-xl shadow-lg hover:shadow-xl transform hover:-translate-x-1 transition-all duration-300 border-2 border-gray-100 hover:border-purple-300"
>
<span>←</span>
<div className="text-left">
<p className="text-xs text-gray-600">Anterior</p>
<p className="font-semibold text-gray-800">{previousKey}</p>
</div>
</Link>
) : (
<div />
)}
<Link
href="/comparacao"
className="bg-linear-to-r from-blue-600 to-purple-600 text-white px-6 py-3 rounded-xl font-semibold shadow-lg hover:shadow-xl transform hover:-translate-y-1 transition-all duration-300"
>
📊 Comparar Séries
</Link>
{nextKey ? (
<Link
href={`/series/${nextKey}`}
className="flex items-center gap-2 bg-white px-6 py-3 rounded-xl shadow-lg hover:shadow-xl transform hover:translate-x-1 transition-all duration-300 border-2 border-gray-100 hover:border-purple-300"
>
<div className="text-right">
<p className="text-xs text-gray-600">Próximo</p>
<p className="font-semibold text-gray-800">{nextKey}</p>
</div>
<span>→</span>
</Link>
) : (
<div />
)}
</div>
</main>
<Footer />
</div>
);
}
function SpecSection({ title, specs, cor }) {
return (
<div className="bg-white rounded-2xl shadow-lg p-6 border-2 border-gray-100">
<h2 className="text-2xl font-bold text-gray-800 mb-4 pb-3 border-b-2" style={{ borderColor: cor }}>
{title}
</h2>
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-4">
{specs.map((spec, index) => (
<div key={index} className="flex items-start gap-3 p-3 rounded-lg hover:bg-gray-50 transition-colors">
<span className="text-2xl">{spec.icon}</span>
<div className="flex-1">
<p className="text-sm font-semibold text-gray-600">{spec.label}</p>
<p className="text-base font-bold text-gray-800 mt-1">{spec.value}</p>
</div>
</div>
))}
</div>
</div>
);
}
export async function generateMetadata({ params }) {
const { key } = params;
const serie = seriesData[key];
if (!serie) {
return {
title: "Série não encontrada",
};
}
return {
title: `${key} - ${serie.nome_completo}`,
description: serie.descricao,
};
}
export async function generateStaticParams() {
return Object.keys(seriesData).map((key) => ({
key: key,
}));
}
+133
View File
@@ -0,0 +1,133 @@
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import Link from "next/link";
import seriesData from "@/public/series.json";
export default function Series() {
const series = Object.entries(seriesData);
return (
<div className="bg-linear-to-br from-blue-50 via-white to-purple-50 min-h-screen">
<Header />
<main className="px-4 pt-16 pb-8 max-w-7xl mx-auto">
<div className="text-center mb-12">
<h1 className="text-5xl md:text-6xl font-extrabold bg-linear-to-r from-blue-600 via-purple-600 to-pink-600 bg-clip-text text-transparent mb-4">
Séries ESP32
</h1>
<p className="text-lg text-gray-600 max-w-2xl mx-auto">
Explore toda a família ESP32. Cada série foi projetada para atender necessidades específicas,
desde projetos simples até aplicações de IA e IoT avançadas.
</p>
</div>
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
{series.map(([key, serie]) => (
<Link
key={key}
href={`/series/${key}`}
className="group"
>
<div className="bg-white rounded-2xl shadow-lg hover:shadow-2xl transform hover:-translate-y-2 transition-all duration-300 border-2 border-gray-100 hover:border-opacity-50 h-full"
style={{ '--hover-color': serie.cor }}>
<div className="p-6 border-b border-gray-100">
<div className="flex items-center justify-between mb-3">
<span className="text-4xl">{serie.icone}</span>
<span className="px-3 py-1 rounded-full text-xs font-semibold text-white"
style={{ backgroundColor: serie.cor }}>
{serie.arquitetura.includes("RISC-V") ? "RISC-V" : "Xtensa"}
</span>
</div>
<h2 className="text-2xl font-bold text-gray-800 mb-2 group-hover:text-purple-600 transition-colors">
{key}
</h2>
<p className="text-sm text-gray-600 line-clamp-2">
{serie.descricao}
</p>
</div>
<div className="p-6 space-y-3">
<div className="flex items-center justify-between text-sm">
<span className="text-gray-600">⚙️ Núcleos:</span>
<span className="font-semibold text-gray-800">{serie.nucleos}</span>
</div>
<div className="flex items-center justify-between text-sm">
<span className="text-gray-600">🚀 Frequência:</span>
<span className="font-semibold text-gray-800">{serie.frequencia}</span>
</div>
<div className="flex items-center justify-between text-sm">
<span className="text-gray-600">💾 SRAM:</span>
<span className="font-semibold text-gray-800">{serie.memoria_sram}</span>
</div>
<div className="flex items-center justify-between text-sm">
<span className="text-gray-600">📶 Wi-Fi:</span>
<span className="font-semibold text-gray-800">
{String(serie.wifi).includes("Não") ? "❌" : "✅"}
</span>
</div>
<div className="flex items-center justify-between text-sm">
<span className="text-gray-600">📱 Bluetooth:</span>
<span className="font-semibold text-gray-800">
{serie.bluetooth === "Não" ? "❌" : "✅"}
</span>
</div>
{serie.aceleradores_ia && (
<div className="pt-2 border-t border-gray-100">
<span className="inline-block px-2 py-1 bg-purple-100 text-purple-700 text-xs font-semibold rounded">
🤖 Aceleradores IA
</span>
</div>
)}
{serie.matter === "Sim" && (
<div className="pt-2 border-t border-gray-100">
<span className="inline-block px-2 py-1 bg-green-100 text-green-700 text-xs font-semibold rounded">
🏠 Suporte Matter
</span>
</div>
)}
</div>
<div className="px-6 pb-6">
<div className="flex items-center justify-between text-sm font-semibold group-hover:text-purple-600 transition-colors">
<span>Ver Detalhes</span>
<span className="transform group-hover:translate-x-2 transition-transform">→</span>
</div>
</div>
</div>
</Link>
))}
</div>
<div className="mt-8 bg-white rounded-2xl shadow-lg p-8 border border-gray-100">
<h3 className="text-2xl font-bold text-gray-800 mb-4 text-center">
💡 Não sabe qual escolher?
</h3>
<p className="text-gray-600 text-center max-w-2xl mx-auto mb-6">
Compare as especificações de cada série para encontrar a mais adequada ao seu projeto.
Considere requisitos de conectividade, processamento e recursos específicos.
</p>
<div className="flex justify-center">
<Link
href="/comparacao"
className="bg-linear-to-r from-blue-600 to-purple-600 text-white px-6 py-3 rounded-xl font-semibold shadow-lg hover:shadow-xl transform hover:-translate-y-1 transition-all duration-300"
>
📊 Comparar Séries
</Link>
</div>
</div>
</main>
<Footer />
</div>
);
}
+45
View File
@@ -0,0 +1,45 @@
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import Link from "next/link";
export default function Sobre() {
return (
<div className="bg-linear-to-br from-blue-50 via-white to-purple-50 min-h-screen">
<Header />
<main className="px-4 pt-16 pb-20 max-w-5xl mx-auto">
<div className="bg-white/60 backdrop-blur-sm rounded-2xl p-8 shadow-md border border-gray-100">
<div className="mb-6">
<Link href="/" className="text-sm text-blue-600 hover:underline">← Voltar</Link>
</div>
<h1 className="text-4xl md:text-5xl font-extrabold text-gray-900 mb-6">
Sobre o ESPDocs
</h1>
<p className="text-lg text-gray-700 mb-4">
O ESPDocs nasceu da paixão por explorar o potencial dos microcontroladores ESP32 e da vontade de compartilhar conhecimento de forma acessível e colaborativa. Criado por um entusiasta e desenvolvedor com mais de quatro anos de experiência prática com a plataforma, o projeto tem como propósito reunir, organizar e traduzir informações técnicas — muitas vezes dispersas — em um só lugar.
</p>
<p className="text-lg text-gray-700 mb-4">
Mais do que uma simples documentação não oficial, o ESPDocs é um espaço vivo de aprendizado. Aqui, cada detalhe sobre o hardware, frameworks, protocolos e boas práticas de desenvolvimento é tratado com cuidado e clareza, para que qualquer pessoa — do iniciante ao profissional — possa compreender e aplicar.
</p>
<p className="text-lg text-gray-700 mb-4">
A iniciativa surgiu com um foco especial na comunidade brasileira, que cresce e se destaca no cenário da eletrônica e IoT. O objetivo é facilitar o acesso ao conhecimento técnico em português, incentivar a experimentação e fortalecer a troca de experiências entre desenvolvedores, estudantes e pesquisadores.
</p>
<p className="text-lg text-gray-700 mb-4">
O ESPDocs é, acima de tudo, uma homenagem à curiosidade e ao espírito colaborativo que impulsionam a inovação.
</p>
<p className="text-lg text-gray-800 font-semibold mt-6">
ESPDocs — Documentando o futuro da IoT, em código aberto e em português.
</p>
</div>
</main>
<Footer />
</div>
);
}
+430
View File
@@ -0,0 +1,430 @@
"use client";
import { useState, useEffect } from "react";
const FILTER_CATEGORIES = [
{ id: "All", name: "Todos", color: "#64748b" },
{ id: "Ground", name: "Terra (GND)", color: "#64748b" },
{ id: "Power", name: "Alimentação", color: "#ef4444" },
{ id: "RTC", name: "RTC", color: "#f59e0b" },
{ id: "GPIO", name: "GPIO", color: "#22c55e" },
{ id: "ADC", name: "ADC", color: "#ec4899" },
{ id: "DAC", name: "DAC", color: "#a855f7" },
{ id: "Touch", name: "Touch", color: "#06b6d4" },
{ id: "UART", name: "UART", color: "#3b82f6" },
{ id: "SPI", name: "SPI", color: "#ef4444" },
{ id: "I2C", name: "I2C", color: "#10b981" },
{ id: "PWM", name: "PWM", color: "#f97316" },
{ id: "USB", name: "USB", color: "#8b5cf6" },
{ id: "Clock", name: "Clock", color: "#eab308" },
{ id: "JTAG", name: "JTAG", color: "#8b5cf6" },
{ id: "Strapping", name: "Inicialização", color: "#dc2626" },
];
export default function ConnectionsDiagram({ connections, color }) {
const [activeFilter, setActiveFilter] = useState("All");
const [selectedConnection, setSelectedConnection] = useState(null);
const [hoveredConnection, setHoveredConnection] = useState(null);
const isConnectionVisible = (connection) => {
if (activeFilter === "All") return true;
return connection.categorias.includes(activeFilter);
};
const getCategoryColor = (category) => {
const filter = FILTER_CATEGORIES.find((f) => f.id === category);
return filter?.color || "#64748b";
};
useEffect(() => {
const handleEscape = (e) => {
if (e.key === "Escape") setSelectedConnection(null);
};
if (selectedConnection) {
document.addEventListener("keydown", handleEscape);
document.body.style.overflow = "hidden";
}
return () => {
document.removeEventListener("keydown", handleEscape);
document.body.style.overflow = "unset";
};
}, [selectedConnection]);
if (!connections || connections.length === 0) {
return (
<div className="flex flex-col items-center justify-center py-16 px-4">
<div className="w-20 h-20 mb-6 rounded-full bg-gray-100 flex items-center justify-center">
<svg
className="w-10 h-10 text-gray-400"
fill="none"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path d="M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z" />
</svg>
</div>
<p className="text-lg font-medium text-gray-600">
Diagrama de conexões indisponível
</p>
<p className="text-sm text-gray-500 mt-2">
Este modelo ainda não possui dados de conexão
</p>
</div>
);
}
return (
<div className="space-y-8 pb-8">
<div className="space-y-3">
<h2 className="text-2xl font-bold text-gray-800 mb-6 pb-3 border-b-2 flex items-center gap-3" style={{ borderColor: color }}>
<span>📍</span>
Diagrama de Conexões Interativo
</h2>
<p className="text-lg text-gray-600 leading-relaxed max-w-3xl">
Clique em qualquer conexão para ver informações detalhadas ou use filtros para destacar funções específicas.
</p>
</div>
<div className="bg-white rounded-2xl shadow-sm border border-gray-200 p-6">
<div className="flex items-center gap-3 mb-4">
<svg
className="w-5 h-5 text-gray-700"
fill="none"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path d="M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z" />
</svg>
<h4 className="text-lg font-semibold text-gray-900">
Filtre por Função
</h4>
{activeFilter !== "All" && (
<span className="ml-auto text-sm text-gray-600">
{connections.filter(isConnectionVisible).length} de {connections.length} conexões
</span>
)}
</div>
<div className="flex flex-wrap gap-2.5">
{FILTER_CATEGORIES.map((filter) => {
const isActive = activeFilter === filter.id;
return (
<button
key={filter.id}
onClick={() => setActiveFilter(filter.id)}
aria-pressed={isActive}
aria-label={`Filter by ${filter.name}`}
className={`px-5 py-2.5 rounded-xl text-sm font-semibold transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 ${
isActive
? "shadow-lg transform scale-105 text-white"
: "bg-gray-50 text-gray-700 hover:bg-gray-100 hover:shadow-md"
}`}
style={{
backgroundColor: isActive ? filter.color : undefined,
focusRingColor: filter.color,
}}
>
{filter.name}
</button>
);
})}
</div>
</div>
<div className="bg-linear-to-br from-gray-50 to-gray-100 rounded-2xl p-8 border-2 border-gray-200 shadow-inner">
<div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 xl:grid-cols-8 gap-4">
{connections.map((connection, index) => {
const visible = isConnectionVisible(connection);
const isHovered = hoveredConnection === index;
return (
<button
key={index}
onClick={() => visible && setSelectedConnection(connection)}
onMouseEnter={() => visible && setHoveredConnection(index)}
onMouseLeave={() => setHoveredConnection(null)}
disabled={!visible}
aria-label={`Connection ${connection.nome}, number ${connection.numero}`}
className={`relative flex flex-col items-center justify-center p-2 rounded-2xl border-2 transition-all duration-300 ${
visible
? "opacity-100 hover:scale-110 hover:shadow-2xl hover:z-10 cursor-pointer active:scale-95"
: "opacity-15 cursor-not-allowed grayscale"
}`}
style={{
backgroundColor: visible ? connection.cor + "15" : "#f3f4f615",
borderColor: visible ? (isHovered ? connection.cor : connection.cor + "60") : "#d1d5db",
transform: isHovered ? "translateY(-2px)" : undefined,
}}
>
<div
className="w-12 h-12 rounded-full flex items-center justify-center text-white font-bold text-sm mb-3 shadow-lg ring-2 ring-white"
style={{ backgroundColor: connection.cor }}
>
{typeof connection.numero === "number"
? connection.numero
: connection.numero.substring(0, 4)}
</div>
<div className="text-xs font-bold text-center text-gray-900 leading-tight">
{connection.nome}
</div>
{connection.restricoes && (
<div
className="absolute -top-2 -right-2 bg-red-500 rounded-full p-1.5 shadow-lg"
aria-label="Has restrictions"
>
<svg
className="w-3.5 h-3.5 text-white"
fill="none"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
</svg>
</div>
)}
</button>
);
})}
</div>
</div>
{connections.some(c => c.restricoes) && (
<div className="bg-linear-to-r from-amber-50 to-yellow-50 border-2 border-amber-200 rounded-2xl p-6 shadow-sm">
<div className="flex gap-4">
<div className="shrink-0">
<div className="w-12 h-12 rounded-full bg-amber-100 flex items-center justify-center">
<svg
className="w-6 h-6 text-amber-600"
fill="none"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
</svg>
</div>
</div>
<div className="flex-1">
<p className="text-lg font-bold text-amber-900 mb-3">
Informações Importantes
</p>
<ul className="space-y-2.5 text-sm text-amber-800">
<li className="flex items-start gap-3">
<span className="text-amber-600 mt-0.5 font-bold">•</span>
<span className="leading-relaxed">
Conexões com ícones de aviso possuem restrições de uso. Clique para mais detalhes.
</span>
</li>
<li className="flex items-start gap-3">
<span className="text-amber-600 mt-0.5 font-bold">•</span>
<span className="leading-relaxed">
Sempre consulte o datasheet oficial antes de usar conexões com funções especiais.
</span>
</li>
</ul>
</div>
</div>
</div>
)}
{selectedConnection && (
<div
className="fixed inset-0 bg-black bg-opacity-60 backdrop-blur-sm flex items-center justify-center p-4 z-50 animate-fadeIn"
onClick={() => setSelectedConnection(null)}
role="dialog"
aria-modal="true"
aria-labelledby="modal-title"
>
<div
className="bg-white rounded-3xl shadow-2xl max-w-3xl w-full max-h-[90vh] overflow-hidden flex flex-col animate-slideUp"
onClick={(e) => e.stopPropagation()}
>
<div className="sticky top-0 bg-linear-to-r from-white to-gray-50 border-b-2 border-gray-200 p-8">
<div className="flex items-start justify-between gap-6">
<div className="flex items-center gap-5 flex-1">
<div
className="w-16 h-16 rounded-2xl flex items-center justify-center text-white font-bold text-xl shadow-xl ring-4 ring-white shrink-0"
style={{ backgroundColor: selectedConnection.cor }}
>
{typeof selectedConnection.numero === "number"
? selectedConnection.numero
: selectedConnection.numero.substring(0, 4)}
</div>
<div className="min-w-0">
<h3 id="modal-title" className="text-3xl font-bold text-gray-900 mb-1">
{selectedConnection.nome}
</h3>
<p className="text-base text-gray-600">
Conexão {selectedConnection.numero}
</p>
</div>
</div>
<button
onClick={() => setSelectedConnection(null)}
aria-label="Close modal"
className="text-gray-400 hover:text-gray-600 transition-colors p-2 hover:bg-gray-100 rounded-xl shrink-0"
>
<svg
className="w-7 h-7"
fill="none"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
</div>
<div className="flex-1 overflow-y-auto p-8 space-y-8">
<div>
<h4 className="text-lg font-bold text-gray-900 mb-4 flex items-center gap-2">
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path d="M7 3a1 1 0 000 2h6a1 1 0 100-2H7zM4 7a1 1 0 011-1h10a1 1 0 110 2H5a1 1 0 01-1-1zM2 11a2 2 0 012-2h12a2 2 0 012 2v4a2 2 0 01-2 2H4a2 2 0 01-2-2v-4z" />
</svg>
Categorias
</h4>
<div className="flex flex-wrap gap-2.5">
{selectedConnection.categorias.map((cat) => (
<span
key={cat}
className="px-4 py-2 rounded-xl text-sm font-bold text-white shadow-md ring-2 ring-white"
style={{ backgroundColor: getCategoryColor(cat) }}
>{cat}</span>
))}
</div>
</div>
<div>
<h4 className="text-lg font-bold text-gray-900 mb-4 flex items-center gap-2">
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M11.3 1.046A1 1 0 0112 2v5h4a1 1 0 01.82 1.573l-7 10A1 1 0 018 18v-5H4a1 1 0 01-.82-1.573l7-10a1 1 0 011.12-.38z" clipRule="evenodd" />
</svg>
Funções da Conexão
</h4>
<div className="bg-linear-to-br from-gray-50 to-gray-100 rounded-2xl p-6 border border-gray-200">
<ul className="space-y-3">
{selectedConnection.funcoes.map((func, index) => (
<li key={index} className="flex items-start gap-4 text-sm group">
<span
className="mt-1 shrink-0 w-2 h-2 rounded-full group-hover:scale-125 transition-transform"
style={{ backgroundColor: color }}
/>
<span className="text-gray-800 font-medium leading-relaxed">{func}</span>
</li>
))}
</ul>
</div>
</div>
{selectedConnection.restricoes && (
<div className="bg-linear-to-br from-red-50 to-rose-50 border-2 border-red-200 rounded-2xl p-6 shadow-sm">
<div className="flex gap-4">
<div className="shrink-0">
<div className="w-12 h-12 rounded-full bg-red-100 flex items-center justify-center">
<svg
className="w-6 h-6 text-red-600"
fill="none"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
</svg>
</div>
</div>
<div className="flex-1">
<p className="text-lg font-bold text-red-900 mb-3">
Alertas Importantes
</p>
<p className="text-sm text-red-800 leading-relaxed">
{selectedConnection.restricoes}
</p>
</div>
</div>
</div>
)}
</div>
<div className="sticky bottom-0 bg-linear-to-t from-gray-50 to-white border-t-2 border-gray-200 p-6">
<button
onClick={() => setSelectedConnection(null)}
className="w-full py-4 rounded-2xl font-bold text-white shadow-lg hover:shadow-xl transform hover:-translate-y-0.5 active:translate-y-0 transition-all duration-200 focus:outline-none focus:ring-4 focus:ring-offset-2"
style={{ backgroundColor: color }}
aria-label="Close modal"
>
Close
</button>
</div>
</div>
</div>
)}
<div className="bg-white rounded-2xl shadow-lg p-6 border-2 border-gray-100">
<h3 className="text-lg font-bold text-gray-800 mb-3">Sobre a Matriz de Conexões Flexível</h3>
<p className="text-gray-700 leading-relaxed">
O ESP32 possui uma matriz de conexões flexível que permite mapear diversas funções para múltiplos pinos.
Isso significa que muitas conexões podem ser configuradas para desempenhar diferentes papéis, dependendo das necessidades do seu projeto.
Consulte a documentação oficial para entender como aproveitar ao máximo essa flexibilidade.
</p>
</div>
<style jsx>{`
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes slideUp {
from {
transform: translateY(20px);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
.animate-fadeIn {
animation: fadeIn 0.2s ease-out;
}
.animate-slideUp {
animation: slideUp 0.3s ease-out;
}
`}</style>
</div>
);
}
+35
View File
@@ -0,0 +1,35 @@
"use client";
export default function Footer() {
return (
<footer className="bg-white py-3 text-black border-t border-gray-300 space-y-2">
<div className="text-center leading-5 text-sm md:flex md:justify-between max-w-5xl mx-auto">
<div className="m-0 p-0">
© {new Date().getFullYear()}&nbsp;
<a
href="https://cienciaembarcada.com.br"
className="text-blue-700 font-semibold hover:underline"
target="_blank"
rel="noopener noreferrer"
>
Ciência Embarcada
</a>
. Todos os direitos reservados.
</div>
<div className="m-0 p-0">
Desenvolvido por&nbsp;
<a
href="https://linkedin.com/in/lucasrguerra"
className="text-blue-700 font-semibold hover:underline"
target="_blank"
rel="noopener noreferrer"
>
Lucas Rayan Guerra
</a>
.
</div>
</div>
</footer>
);
}
+121
View File
@@ -0,0 +1,121 @@
"use client";
import { usePathname } from "next/navigation";
import { useState } 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";
export default function Header() {
const [drawerOpen, setDrawerOpen] = useState(false);
const pathname = usePathname();
const menuItems = [
{ text: "Início", href: "/", icon: <HomeIcon /> },
{ text: "Sobre o Projeto", href: "/sobre", icon: <AboutIcon /> },
{ text: "Séries", href: "/series", icon: <ModelsIcon /> },
{ text: "Frameworks", href: "/frameworks", icon: <FrameworksIcon /> },
{ text: "Comparar Séries", href: "/comparacao", icon: <CompareIcon /> },
];
function isActive(href) {
return pathname === href;
}
return (
<header className="bg-white/80 backdrop-blur-md py-4 px-4 md:px-8 text-black shadow-lg border-b border-gray-100 sticky top-0 z-50">
<div className="flex justify-between max-w-5xl mx-auto items-center">
<Link href="/" className="group">
<h1 className="text-2xl md:text-3xl font-bold bg-linear-to-r from-blue-600 via-purple-600 to-pink-600 bg-clip-text text-transparent transition-all duration-300 group-hover:scale-105">
ESPDocs
</h1>
</Link>
<Button
variant="outlined"
onClick={() => setDrawerOpen(true)}
className="border-2 border-gray-300 text-gray-700 hover:border-purple-500 hover:text-purple-600 transition-all duration-300 hover:shadow-lg rounded-xl! px-4"
>
<MenuIcon className="" />
</Button>
</div>
<Drawer
anchor="right"
open={drawerOpen}
onClose={() => setDrawerOpen(false)}
PaperProps={{
className: "bg-linear-to-br from-white via-blue-50 to-purple-50"
}}
>
<div className="p-6 w-72">
<div className="mb-6">
<h2 className="text-2xl font-bold bg-linear-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent">
Menu
</h2>
<div className="h-1 w-16 bg-linear-to-r from-blue-600 to-purple-600 rounded-full mt-2"></div>
</div>
<List>
{menuItems.map((item, index) => (
<ListItem
key={item.text}
disablePadding
className="mb-3"
style={{
animation: `slideIn 0.3s ease-out ${index * 0.1}s both`
}}
>
<div className="w-full">
<Link
className={`flex items-center w-full p-4 text-left rounded-xl transition-all duration-300 ${
isActive(item.href)
? "bg-linear-to-r from-blue-600 to-purple-600 text-white shadow-lg transform scale-105"
: "hover:bg-white hover:shadow-md hover:transform hover:scale-102 text-gray-700"
}`}
onClick={() => { setDrawerOpen(false); }}
href={item.href}
>
<span className={`transition-transform duration-300 ${isActive(item.href) ? "scale-110" : "group-hover:scale-110"}`}>
{item.icon}
</span>
<span className="ml-3 font-medium">{item.text}</span>
</Link>
</div>
</ListItem>
))}
</List>
<div className="mt-8 p-4 bg-white/50 backdrop-blur-sm rounded-xl border border-gray-200">
<p className="text-xs text-gray-600 text-center">
Documentação não oficial
</p>
</div>
</div>
</Drawer>
<style jsx global>{`
@keyframes slideIn {
from {
opacity: 0;
transform: translateX(20px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
`}</style>
</header>
);
}
+80
View File
@@ -0,0 +1,80 @@
'use client';
import { useState } from 'react';
export default function SeriesTabMenu({ tabs, color }) {
const availableTabs = tabs.filter(tab => tab.available);
const [activeTab, setActiveTab] = useState(availableTabs[0]?.id || 'specs');
const activeTabContent = availableTabs.find(tab => tab.id === activeTab)?.content;
return (
<div className="mb-8">
<div className="hidden md:flex bg-white rounded-2xl shadow-lg py-2 px-4 mb-6 border-2 border-gray-100 gap-4">
{availableTabs.map((tab) => (
<button
key={tab.id}
onClick={() => setActiveTab(tab.id)}
className={`flex-1 flex items-center justify-center gap-2 py-4 px-6 rounded-xl font-semibold transition-all duration-300 ${
activeTab === tab.id
? 'text-white shadow-lg transform scale-105'
: 'text-gray-600 hover:bg-gray-50'
}`}
style={
activeTab === tab.id
? { backgroundColor: color }
: {}
}
>
<span className="hidden lg:inline">{tab.label}</span>
</button>
))}
</div>
<div className="md:hidden mb-6">
<div className="bg-white rounded-2xl shadow-lg border-2 border-gray-100 overflow-hidden">
<button
onClick={() => {
const dropdown = document.getElementById('mobile-tab-dropdown');
dropdown.classList.toggle('hidden');
}}
className="w-full flex items-center justify-between py-4 px-6 font-semibold text-white"
style={{ backgroundColor: color }}
>
<div className="flex items-center gap-3">
<span className="text-xl">
{availableTabs.find(tab => tab.id === activeTab)?.icon}
</span>
<span>
{availableTabs.find(tab => tab.id === activeTab)?.label}
</span>
</div>
<span className="text-xl">▼</span>
</button>
<div id="mobile-tab-dropdown" className="hidden">
{availableTabs.map((tab) => (
tab.id !== activeTab && (
<button
key={tab.id}
onClick={() => {
setActiveTab(tab.id);
document.getElementById('mobile-tab-dropdown').classList.add('hidden');
}}
className="w-full flex items-center gap-3 py-4 px-6 text-gray-700 hover:bg-gray-50 transition-colors border-t border-gray-100"
>
<span className="text-xl">{tab.icon}</span>
<span className="font-medium">{tab.label}</span>
</button>
)
))}
</div>
</div>
</div>
<div className="animate-fadeIn">
{activeTabContent}
</div>
</div>
);
}
+25
View File
@@ -0,0 +1,25 @@
import { dirname } from "path";
import { fileURLToPath } from "url";
import { FlatCompat } from "@eslint/eslintrc";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const compat = new FlatCompat({
baseDirectory: __dirname,
});
const eslintConfig = [
...compat.extends("next/core-web-vitals"),
{
ignores: [
"node_modules/**",
".next/**",
"out/**",
"build/**",
"next-env.d.ts",
],
},
];
export default eslintConfig;
+7
View File
@@ -0,0 +1,7 @@
{
"compilerOptions": {
"paths": {
"@/*": ["./*"]
}
}
}
+4
View File
@@ -0,0 +1,4 @@
/** @type {import('next').NextConfig} */
const nextConfig = {};
export default nextConfig;
+6745
View File
File diff suppressed because it is too large. Load diff
+27
View File
@@ -0,0 +1,27 @@
{
"name": "esp32",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev --turbopack",
"build": "next build --turbopack",
"start": "next start",
"lint": "eslint"
},
"dependencies": {
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.1",
"@mui/icons-material": "^7.3.4",
"@mui/material": "^7.3.4",
"next": "15.5.6",
"react": "19.1.0",
"react-dom": "19.1.0"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
"@tailwindcss/postcss": "^4",
"eslint": "^9",
"eslint-config-next": "15.5.6",
"tailwindcss": "^4"
}
}
+5
View File
@@ -0,0 +1,5 @@
const config = {
plugins: ["@tailwindcss/postcss"],
};
export default config;
+494
View File
@@ -0,0 +1,494 @@
[
{
"numero": "GND",
"nome": "GND",
"tipo": "ground",
"funcoes": [
"Referência elétrica do sistema",
"Conexão externa de terra"
],
"categorias": [
"Ground"
],
"cor": "#64748b",
"restricoes": ""
},
{
"numero": "VDD3P3",
"nome": "VDD3P3",
"tipo": "power",
"funcoes": [
"Alimentação do domínio analógico"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V)"
},
{
"numero": "VDDA",
"nome": "VDDA",
"tipo": "power",
"funcoes": [
"Alimentação do domínio analógico"
],
"categorias": [
"Power",
"Analog"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V)"
},
{
"numero": "VDD3P3_RTC",
"nome": "VDD3P3_RTC",
"tipo": "power",
"funcoes": [
"Alimentação para o domínio RTC e parte do domínio digital"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V)"
},
{
"numero": "VDD3P3_CPU",
"nome": "VDD3P3_CPU",
"tipo": "power",
"funcoes": [
"Alimentação para o domínio digital e CPU"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V); não exceder 3.3 V para gravação de eFuse"
},
{
"numero": "VDDSPI",
"nome": "VDDSPI",
"tipo": "power",
"funcoes": [
"Alimentação dos barramentos Flash e PSRAM",
"Pode funcionar como entrada ou saída",
"Backup de alimentação para flash integrado"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Pode ser 3.3 V ou configurável como GPIO; padrão para alimentação de flash"
},
{
"numero": "CHIP_PU",
"nome": "CHIP_PU (EN)",
"tipo": "power",
"funcoes": [
"Habilitar chip (nível alto)",
"Reseta o chip (nível baixo)"
],
"categorias": [
"Power",
"Reset"
],
"cor": "#f97316",
"restricoes": "Deve estar em nível alto para operação normal; não deixar flutuante"
},
{
"numero": 0,
"nome": "GPIO0",
"tipo": "gpio",
"funcoes": [
"GPIO0",
"XTAL_32K_P",
"ADC1_CH0"
],
"categorias": [
"GPIO",
"RTC",
"ADC",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "Pode ser usado para cristal RTC de 32.768 kHz"
},
{
"numero": 1,
"nome": "GPIO1",
"tipo": "gpio",
"funcoes": [
"GPIO1",
"XTAL_32K_N",
"ADC1_CH1"
],
"categorias": [
"GPIO",
"RTC",
"ADC",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "Pode ser usado para cristal RTC de 32.768 kHz"
},
{
"numero": 2,
"nome": "GPIO2",
"tipo": "gpio",
"funcoes": [
"GPIO2",
"ADC1_CH2",
"FSPIQ"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"SPI",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Strapping pin; recomendado pull-up devido a glitches"
},
{
"numero": 3,
"nome": "GPIO3",
"tipo": "gpio",
"funcoes": [
"GPIO3",
"ADC1_CH3"
],
"categorias": [
"GPIO",
"ADC",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 4,
"nome": "GPIO4",
"tipo": "gpio",
"funcoes": [
"GPIO4",
"ADC1_CH4",
"MTMS",
"FSPIHD"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"JTAG",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "JTAG Test Mode Select"
},
{
"numero": 5,
"nome": "GPIO5",
"tipo": "gpio",
"funcoes": [
"GPIO5",
"ADC2_CH0",
"MTDI",
"FSPIWP"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"JTAG",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "JTAG Test Data In"
},
{
"numero": 6,
"nome": "GPIO6",
"tipo": "gpio",
"funcoes": [
"GPIO6",
"MTCK",
"FSPICLK"
],
"categorias": [
"GPIO",
"JTAG",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "JTAG Test Clock"
},
{
"numero": 7,
"nome": "GPIO7",
"tipo": "gpio",
"funcoes": [
"GPIO7",
"MTDO",
"FSPID"
],
"categorias": [
"GPIO",
"JTAG",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "JTAG Test Data Out"
},
{
"numero": 8,
"nome": "GPIO8",
"tipo": "gpio",
"funcoes": [
"GPIO8"
],
"categorias": [
"GPIO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Strapping pin para controle de modo de boot e impressão ROM"
},
{
"numero": 9,
"nome": "GPIO9",
"tipo": "gpio",
"funcoes": [
"GPIO9"
],
"categorias": [
"GPIO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; strapping pin para modo boot (alto=SPI boot)"
},
{
"numero": 10,
"nome": "GPIO10",
"tipo": "gpio",
"funcoes": [
"GPIO10",
"FSPICS0"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 11,
"nome": "GPIO11",
"tipo": "gpio",
"funcoes": [
"GPIO11"
],
"categorias": [
"GPIO"
],
"cor": "#3b82f6",
"restricoes": "Pin VDDSPI pode ser configurado como GPIO se flash for alimentado externamente"
},
{
"numero": 12,
"nome": "GPIO12",
"tipo": "gpio",
"funcoes": [
"GPIO12",
"SPIHD"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 13,
"nome": "GPIO13",
"tipo": "gpio",
"funcoes": [
"GPIO13",
"SPIWP"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 14,
"nome": "GPIO14",
"tipo": "gpio",
"funcoes": [
"GPIO14",
"SPICS0"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 15,
"nome": "GPIO15",
"tipo": "gpio",
"funcoes": [
"GPIO15",
"SPICLK"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 16,
"nome": "GPIO16",
"tipo": "gpio",
"funcoes": [
"GPIO16",
"SPID"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 17,
"nome": "GPIO17",
"tipo": "gpio",
"funcoes": [
"GPIO17",
"SPIQ"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 18,
"nome": "GPIO18",
"tipo": "gpio",
"funcoes": [
"GPIO18",
"USB_D-"
],
"categorias": [
"GPIO",
"USB"
],
"cor": "#3b82f6",
"restricoes": "USB D- para USB OTG e USB Serial/JTAG"
},
{
"numero": 19,
"nome": "GPIO19",
"tipo": "gpio",
"funcoes": [
"GPIO19",
"USB_D+"
],
"categorias": [
"GPIO",
"USB"
],
"cor": "#3b82f6",
"restricoes": "USB D+ para USB OTG e USB Serial/JTAG"
},
{
"numero": 20,
"nome": "GPIO20",
"tipo": "gpio",
"funcoes": [
"GPIO20",
"UART0_RXD"
],
"categorias": [
"GPIO",
"UART"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; UART0 RX para download de firmware"
},
{
"numero": 21,
"nome": "GPIO21",
"tipo": "gpio",
"funcoes": [
"GPIO21",
"UART0_TXD"
],
"categorias": [
"GPIO",
"UART"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; UART0 TX para download de firmware"
},
{
"numero": "XTAL_N",
"nome": "XTAL_N",
"tipo": "analog",
"funcoes": [
"Entrada/saída de clock externo",
"Conexão ao cristal ou oscilador do chip"
],
"categorias": [
"Analog",
"Clock"
],
"cor": "#a855f7",
"restricoes": "Clock diferencial negativo"
},
{
"numero": "XTAL_P",
"nome": "XTAL_P",
"tipo": "analog",
"funcoes": [
"Entrada/saída de clock externo",
"Conexão ao cristal ou oscilador do chip"
],
"categorias": [
"Analog",
"Clock"
],
"cor": "#a855f7",
"restricoes": "Clock diferencial positivo"
},
{
"numero": "LNA",
"nome": "LNA_IN",
"tipo": "analog",
"funcoes": [
"Entrada/saída do amplificador de baixo ruído RF"
],
"categorias": [
"Analog",
"RF"
],
"cor": "#a855f7",
"restricoes": "Sinais de entrada/saída do LNA RF para comunicação 2.4 GHz Wi-Fi/BLE"
}
]
+649
View File
@@ -0,0 +1,649 @@
[
{
"numero": "GND",
"nome": "GND",
"tipo": "ground",
"funcoes": [
"Conexão externa de terra",
"Referência elétrica do sistema"
],
"categorias": [
"Ground"
],
"cor": "#64748b",
"restricoes": ""
},
{
"numero": "VDDA",
"nome": "VDDA",
"tipo": "power",
"funcoes": [
"Alimentação do domínio analógico"
],
"categorias": [
"Power",
"Analog"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V)"
},
{
"numero": "VDDPST1",
"nome": "VDDPST1",
"tipo": "power",
"funcoes": [
"Alimentação do domínio digital de baixa potência",
"Fornece energia para pinos LP IO"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V)"
},
{
"numero": "VDDPST2",
"nome": "VDDPST2",
"tipo": "power",
"funcoes": [
"Alimentação do domínio digital de alta performance",
"Fornece energia para pinos HP IO"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V)"
},
{
"numero": "VDDPST3",
"nome": "VDDPST3",
"tipo": "power",
"funcoes": [
"Alimentação do domínio digital de alta performance",
"Fornece energia para pinos HP IO"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V)"
},
{
"numero": "VDDSPI",
"nome": "VDDSPI",
"tipo": "power",
"funcoes": [
"Alimentação dos barramentos Flash e PSRAM",
"Pode funcionar como entrada ou saída",
"Backup de alimentação para flash integrado"
],
"categorias": [
"Power",
"Flash"
],
"cor": "#ef4444",
"restricoes": "Pode ser 3.3 V ou configurável como GPIO; padrão para alimentação de flash"
},
{
"numero": "CHIP_PU",
"nome": "CHIP_PU (EN)",
"tipo": "power",
"funcoes": [
"Habilitar chip (nível alto)",
"Reseta o chip (nível baixo)"
],
"categorias": [
"Power",
"Reset"
],
"cor": "#f97316",
"restricoes": "Deve estar em nível alto para operação normal; não deixar flutuante"
},
{
"numero": 0,
"nome": "GPIO0",
"tipo": "gpio",
"funcoes": [
"GPIO0",
"XTAL_32K_P",
"ADC1_CH0",
"LPGPIO0"
],
"categorias": [
"GPIO",
"RTC",
"ADC",
"Clock",
"LP_GPIO"
],
"cor": "#3b82f6",
"restricoes": "Pode ser usado para cristal RTC de 32.768 kHz"
},
{
"numero": 1,
"nome": "GPIO1",
"tipo": "gpio",
"funcoes": [
"GPIO1",
"XTAL_32K_N",
"ADC1_CH1",
"LPGPIO1"
],
"categorias": [
"GPIO",
"RTC",
"ADC",
"Clock",
"LP_GPIO"
],
"cor": "#3b82f6",
"restricoes": "Pode ser usado para cristal RTC de 32.768 kHz"
},
{
"numero": 2,
"nome": "GPIO2",
"tipo": "gpio",
"funcoes": [
"GPIO2",
"MTMS",
"ADC1_CH2",
"FSPIQ",
"LPGPIO2",
"LPI2C_SDA"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"SPI",
"JTAG",
"LP_GPIO",
"LP_I2C"
],
"cor": "#3b82f6",
"restricoes": "JTAG Test Mode Select; pode ser usado com LP_I2C"
},
{
"numero": 3,
"nome": "GPIO3",
"tipo": "gpio",
"funcoes": [
"GPIO3",
"MTDI",
"ADC1_CH3",
"LPGPIO3",
"LPI2C_SCL"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"JTAG",
"LP_GPIO",
"LP_I2C"
],
"cor": "#3b82f6",
"restricoes": "JTAG Test Data In; pode ser usado com LP_I2C"
},
{
"numero": 4,
"nome": "GPIO4",
"tipo": "gpio",
"funcoes": [
"GPIO4",
"MTCK",
"ADC1_CH4",
"FSPIHD",
"LPGPIO4",
"LPUART_RXD"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"JTAG",
"SPI",
"LP_GPIO",
"LP_UART"
],
"cor": "#3b82f6",
"restricoes": "JTAG Test Clock"
},
{
"numero": 5,
"nome": "GPIO5",
"tipo": "gpio",
"funcoes": [
"GPIO5",
"MTDO",
"ADC1_CH5",
"FSPIWP",
"LPGPIO5",
"LPUART_TXD"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"JTAG",
"SPI",
"LP_GPIO",
"LP_UART"
],
"cor": "#3b82f6",
"restricoes": "JTAG Test Data Out"
},
{
"numero": 6,
"nome": "GPIO6",
"tipo": "gpio",
"funcoes": [
"GPIO6",
"FSPICLK",
"LPGPIO6"
],
"categorias": [
"GPIO",
"SPI",
"LP_GPIO"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 7,
"nome": "GPIO7",
"tipo": "gpio",
"funcoes": [
"GPIO7",
"FSPID",
"SDIODATA1"
],
"categorias": [
"GPIO",
"SPI",
"SDIO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Strapping pin para controle de fonte de sinal JTAG"
},
{
"numero": 8,
"nome": "GPIO8",
"tipo": "gpio",
"funcoes": [
"GPIO8",
"SDIODATA0",
"PADCOMP0"
],
"categorias": [
"GPIO",
"SDIO",
"Analog",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Strapping pin para controle de modo de boot e impressão ROM; comparador analógico"
},
{
"numero": 9,
"nome": "GPIO9",
"tipo": "gpio",
"funcoes": [
"GPIO9",
"SDIOCLK",
"PADCOMP1"
],
"categorias": [
"GPIO",
"SDIO",
"Analog",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; strapping pin para modo boot (alto=SPI boot); comparador analógico"
},
{
"numero": 10,
"nome": "GPIO10",
"tipo": "gpio",
"funcoes": [
"GPIO10",
"SDIOCMD",
"FSPICS0"
],
"categorias": [
"GPIO",
"SPI",
"SDIO"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 11,
"nome": "GPIO11",
"tipo": "gpio",
"funcoes": [
"GPIO11",
"UART0_TXD"
],
"categorias": [
"GPIO",
"UART"
],
"cor": "#3b82f6",
"restricoes": "UART0 TX para download de firmware"
},
{
"numero": 12,
"nome": "GPIO12",
"tipo": "gpio",
"funcoes": [
"GPIO12",
"UART0_RXD"
],
"categorias": [
"GPIO",
"UART"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; UART0 RX para download de firmware"
},
{
"numero": 13,
"nome": "GPIO13",
"tipo": "gpio",
"funcoes": [
"GPIO13",
"USB_D-",
"SDIODATA3"
],
"categorias": [
"GPIO",
"USB",
"SDIO"
],
"cor": "#3b82f6",
"restricoes": "USB D- para USB OTG e USB Serial/JTAG; drive padrão 40 mA"
},
{
"numero": 14,
"nome": "GPIO14",
"tipo": "gpio",
"funcoes": [
"GPIO14",
"USB_D+",
"SDIODATA2"
],
"categorias": [
"GPIO",
"USB",
"SDIO"
],
"cor": "#3b82f6",
"restricoes": "USB D+ para USB OTG e USB Serial/JTAG; drive padrão 40 mA"
},
{
"numero": 15,
"nome": "GPIO15",
"tipo": "gpio",
"funcoes": [
"GPIO15",
"SPICS1"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com PSRAM; pull-up interno"
},
{
"numero": 16,
"nome": "GPIO16",
"tipo": "gpio",
"funcoes": [
"GPIO16",
"SPICS0"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 17,
"nome": "GPIO17",
"tipo": "gpio",
"funcoes": [
"GPIO17",
"SPIQ"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 18,
"nome": "GPIO18",
"tipo": "gpio",
"funcoes": [
"GPIO18",
"SPIWP"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 19,
"nome": "GPIO19",
"tipo": "gpio",
"funcoes": [
"GPIO19",
"VDDSPI"
],
"categorias": [
"GPIO",
"Power"
],
"cor": "#3b82f6",
"restricoes": "Pin VDDSPI pode ser configurado como GPIO se flash for alimentado externamente"
},
{
"numero": 20,
"nome": "GPIO20",
"tipo": "gpio",
"funcoes": [
"GPIO20",
"SPIHD"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 21,
"nome": "GPIO21",
"tipo": "gpio",
"funcoes": [
"GPIO21",
"SPICLK"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 22,
"nome": "GPIO22",
"tipo": "gpio",
"funcoes": [
"GPIO22",
"SPID"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 23,
"nome": "GPIO23",
"tipo": "gpio",
"funcoes": [
"GPIO23"
],
"categorias": [
"GPIO"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 24,
"nome": "GPIO24",
"tipo": "gpio",
"funcoes": [
"GPIO24"
],
"categorias": [
"GPIO"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 25,
"nome": "GPIO25",
"tipo": "gpio",
"funcoes": [
"GPIO25"
],
"categorias": [
"GPIO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Strapping pin para controle de borda de clock SDIO"
},
{
"numero": 26,
"nome": "GPIO26",
"tipo": "gpio",
"funcoes": [
"GPIO26"
],
"categorias": [
"GPIO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Strapping pin para controle de modo de boot"
},
{
"numero": 27,
"nome": "GPIO27",
"tipo": "gpio",
"funcoes": [
"GPIO27"
],
"categorias": [
"GPIO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; strapping pin para modo boot e impressão ROM"
},
{
"numero": 28,
"nome": "GPIO28",
"tipo": "gpio",
"funcoes": [
"GPIO28"
],
"categorias": [
"GPIO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; strapping pin para modo boot (alto=SPI boot)"
},
{
"numero": "XTAL_N",
"nome": "XTAL_N",
"tipo": "analog",
"funcoes": [
"Entrada/saída de clock externo",
"Conexão ao cristal ou oscilador do chip"
],
"categorias": [
"Analog",
"Clock"
],
"cor": "#a855f7",
"restricoes": "Clock diferencial negativo; suporta cristal de 40 MHz ou 48 MHz"
},
{
"numero": "XTAL_P",
"nome": "XTAL_P",
"tipo": "analog",
"funcoes": [
"Entrada/saída de clock externo",
"Conexão ao cristal ou oscilador do chip"
],
"categorias": [
"Analog",
"Clock"
],
"cor": "#a855f7",
"restricoes": "Clock diferencial positivo; suporta cristal de 40 MHz ou 48 MHz"
},
{
"numero": "ANT",
"nome": "ANT_2G",
"tipo": "analog",
"funcoes": [
"Entrada/saída de RF 2.4 GHz"
],
"categorias": [
"Analog",
"RF"
],
"cor": "#a855f7",
"restricoes": "Antena para comunicação Wi-Fi/BLE em 2.4 GHz"
},
{
"numero": "ANT",
"nome": "ANT_5G",
"tipo": "analog",
"funcoes": [
"Entrada/saída de RF 5 GHz"
],
"categorias": [
"Analog",
"RF"
],
"cor": "#a855f7",
"restricoes": "Antena para comunicação Wi-Fi em 5 GHz"
}
]
+652
View File
@@ -0,0 +1,652 @@
[
{
"numero": "GND",
"nome": "GND",
"tipo": "ground",
"funcoes": [
"Referência elétrica do sistema",
"Conexão externa de terra"
],
"categorias": [
"Ground"
],
"cor": "#64748b",
"restricoes": ""
},
{
"numero": "VDDA",
"nome": "VDDA",
"tipo": "power",
"funcoes": [
"Alimentação do domínio analógico"
],
"categorias": [
"Power",
"Analog"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V)"
},
{
"numero": "VDDPST1",
"nome": "VDDPST1",
"tipo": "power",
"funcoes": [
"Alimentação para o domínio LP digital e parte do domínio analógico"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Alimenta os pinos LP IO; típico 3.3 V"
},
{
"numero": "VDDPST2",
"nome": "VDDPST2",
"tipo": "power",
"funcoes": [
"Alimentação para o domínio HP digital"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Alimenta os pinos HP IO; típico 3.3 V"
},
{
"numero": "VDDSPI",
"nome": "VDDSPI",
"tipo": "power",
"funcoes": [
"Alimentação dos barramentos Flash e PSRAM",
"Pode funcionar como entrada ou saída",
"Backup de alimentação para flash integrado"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Pode ser 3.3 V ou configurável como GPIO27; padrão para alimentação de flash"
},
{
"numero": "CHIP_PU",
"nome": "CHIP_PU (EN)",
"tipo": "power",
"funcoes": [
"Habilitar chip (nível alto)",
"Reseta o chip (nível baixo)"
],
"categorias": [
"Power",
"Reset"
],
"cor": "#f97316",
"restricoes": "Deve estar em nível alto para operação normal; não deixar flutuante"
},
{
"numero": 0,
"nome": "GPIO0",
"tipo": "gpio",
"funcoes": [
"GPIO0",
"XTAL_32K_P",
"ADC1_CH0",
"LPGPIO0",
"LPUART_DTR"
],
"categorias": [
"GPIO",
"RTC",
"ADC",
"Clock",
"LP_IO"
],
"cor": "#3b82f6",
"restricoes": "Pode ser usado para cristal RTC de 32.768 kHz"
},
{
"numero": 1,
"nome": "GPIO1",
"tipo": "gpio",
"funcoes": [
"GPIO1",
"XTAL_32K_N",
"ADC1_CH1",
"LPGPIO1",
"LPUART_DSR"
],
"categorias": [
"GPIO",
"RTC",
"ADC",
"Clock",
"LP_IO"
],
"cor": "#3b82f6",
"restricoes": "Pode ser usado para cristal RTC de 32.768 kHz"
},
{
"numero": 2,
"nome": "GPIO2",
"tipo": "gpio",
"funcoes": [
"GPIO2",
"ADC1_CH2",
"FSPIQ",
"LPGPIO2",
"LPUART_RTS"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"SPI",
"LP_IO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Strapping pin; pode ser usado para SPI2"
},
{
"numero": 3,
"nome": "GPIO3",
"tipo": "gpio",
"funcoes": [
"GPIO3",
"ADC1_CH3",
"LPGPIO3",
"LPUART_CTS"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"LP_IO"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 4,
"nome": "GPIO4",
"tipo": "gpio",
"funcoes": [
"GPIO4",
"ADC1_CH4",
"MTMS",
"FSPIHD",
"LPGPIO4",
"LPUART_RXD"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"JTAG",
"SPI",
"LP_IO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "JTAG Test Mode Select; Strapping pin"
},
{
"numero": 5,
"nome": "GPIO5",
"tipo": "gpio",
"funcoes": [
"GPIO5",
"ADC1_CH5",
"MTDI",
"FSPIWP",
"LPGPIO5",
"LPUART_TXD"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"JTAG",
"SPI",
"LP_IO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "JTAG Test Data In; Strapping pin"
},
{
"numero": 6,
"nome": "GPIO6",
"tipo": "gpio",
"funcoes": [
"GPIO6",
"ADC1_CH6",
"MTCK",
"FSPICLK",
"LPGPIO6",
"LPI2C_SDA"
],
"categorias": [
"GPIO",
"ADC",
"JTAG",
"SPI",
"LP_IO"
],
"cor": "#3b82f6",
"restricoes": "JTAG Test Clock"
},
{
"numero": 7,
"nome": "GPIO7",
"tipo": "gpio",
"funcoes": [
"GPIO7",
"MTDO",
"FSPID",
"LPGPIO7",
"LPI2C_SCL"
],
"categorias": [
"GPIO",
"JTAG",
"SPI",
"LP_IO"
],
"cor": "#3b82f6",
"restricoes": "JTAG Test Data Out"
},
{
"numero": 8,
"nome": "GPIO8",
"tipo": "gpio",
"funcoes": [
"GPIO8"
],
"categorias": [
"GPIO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Strapping pin para controle de modo de boot e impressão ROM"
},
{
"numero": 9,
"nome": "GPIO9",
"tipo": "gpio",
"funcoes": [
"GPIO9"
],
"categorias": [
"GPIO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; strapping pin para modo boot (alto=SPI boot)"
},
{
"numero": 10,
"nome": "GPIO10",
"tipo": "gpio",
"funcoes": [
"GPIO10"
],
"categorias": [
"GPIO"
],
"cor": "#3b82f6",
"restricoes": "Apenas em QFN40"
},
{
"numero": 11,
"nome": "GPIO11",
"tipo": "gpio",
"funcoes": [
"GPIO11"
],
"categorias": [
"GPIO"
],
"cor": "#3b82f6",
"restricoes": "Apenas em QFN40"
},
{
"numero": 12,
"nome": "GPIO12",
"tipo": "gpio",
"funcoes": [
"GPIO12",
"USB_D-"
],
"categorias": [
"GPIO",
"USB"
],
"cor": "#3b82f6",
"restricoes": "USB D- para USB OTG e USB Serial/JTAG; força de corrente padrão 40 mA"
},
{
"numero": 13,
"nome": "GPIO13",
"tipo": "gpio",
"funcoes": [
"GPIO13",
"USB_D+"
],
"categorias": [
"GPIO",
"USB"
],
"cor": "#3b82f6",
"restricoes": "USB D+ para USB OTG e USB Serial/JTAG; força de corrente padrão 40 mA"
},
{
"numero": 14,
"nome": "GPIO14",
"tipo": "gpio",
"funcoes": [
"GPIO14"
],
"categorias": [
"GPIO"
],
"cor": "#3b82f6",
"restricoes": "Apenas em QFN32"
},
{
"numero": 15,
"nome": "GPIO15",
"tipo": "gpio",
"funcoes": [
"GPIO15"
],
"categorias": [
"GPIO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Strapping pin para controle de fonte de sinal JTAG"
},
{
"numero": 16,
"nome": "GPIO16",
"tipo": "gpio",
"funcoes": [
"GPIO16",
"UART0_TXD",
"FSPICS0"
],
"categorias": [
"GPIO",
"UART",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "UART0 TX para download de firmware"
},
{
"numero": 17,
"nome": "GPIO17",
"tipo": "gpio",
"funcoes": [
"GPIO17",
"UART0_RXD",
"FSPICS1"
],
"categorias": [
"GPIO",
"UART",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; UART0 RX para download de firmware"
},
{
"numero": 18,
"nome": "GPIO18",
"tipo": "gpio",
"funcoes": [
"GPIO18",
"SDIOCMD",
"FSPICS2"
],
"categorias": [
"GPIO",
"SDIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Interface SDIO 2.0"
},
{
"numero": 19,
"nome": "GPIO19",
"tipo": "gpio",
"funcoes": [
"GPIO19",
"SDIOCLK",
"FSPICS3"
],
"categorias": [
"GPIO",
"SDIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Interface SDIO 2.0"
},
{
"numero": 20,
"nome": "GPIO20",
"tipo": "gpio",
"funcoes": [
"GPIO20",
"SDIODATA0",
"FSPICS4"
],
"categorias": [
"GPIO",
"SDIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Interface SDIO 2.0"
},
{
"numero": 21,
"nome": "GPIO21",
"tipo": "gpio",
"funcoes": [
"GPIO21",
"SDIODATA1",
"FSPICS5"
],
"categorias": [
"GPIO",
"SDIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Interface SDIO 2.0"
},
{
"numero": 22,
"nome": "GPIO22",
"tipo": "gpio",
"funcoes": [
"GPIO22",
"SDIODATA2"
],
"categorias": [
"GPIO",
"SDIO"
],
"cor": "#3b82f6",
"restricoes": "Interface SDIO 2.0"
},
{
"numero": 23,
"nome": "GPIO23",
"tipo": "gpio",
"funcoes": [
"GPIO23",
"SDIODATA3"
],
"categorias": [
"GPIO",
"SDIO"
],
"cor": "#3b82f6",
"restricoes": "Interface SDIO 2.0"
},
{
"numero": 24,
"nome": "GPIO24",
"tipo": "gpio",
"funcoes": [
"GPIO24",
"SPICS0"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "QFN40 apenas; Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 25,
"nome": "GPIO25",
"tipo": "gpio",
"funcoes": [
"GPIO25",
"SPIQ"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "QFN40 apenas; Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 26,
"nome": "GPIO26",
"tipo": "gpio",
"funcoes": [
"GPIO26",
"SPIWP"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "QFN40 apenas; Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 27,
"nome": "GPIO27",
"tipo": "gpio",
"funcoes": [
"GPIO27",
"VDDSPI"
],
"categorias": [
"GPIO",
"Power"
],
"cor": "#f97316",
"restricoes": "QFN40 apenas; Pin VDDSPI pode ser configurado como GPIO se flash for alimentado externamente"
},
{
"numero": 28,
"nome": "GPIO28",
"tipo": "gpio",
"funcoes": [
"GPIO28",
"SPIHD"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "QFN40 apenas; Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 29,
"nome": "GPIO29",
"tipo": "gpio",
"funcoes": [
"GPIO29",
"SPICLK"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "QFN40 apenas; Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": 30,
"nome": "GPIO30",
"tipo": "gpio",
"funcoes": [
"GPIO30",
"SPID"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "QFN40 apenas; Compartilhado com flash; pull-up interno; não usar como GPIO normal"
},
{
"numero": "XTAL_N",
"nome": "XTAL_N",
"tipo": "analog",
"funcoes": [
"Entrada/saída de clock externo",
"Conexão ao cristal ou oscilador do chip"
],
"categorias": [
"Analog",
"Clock"
],
"cor": "#a855f7",
"restricoes": "Clock diferencial negativo para oscilador de 40 MHz"
},
{
"numero": "XTAL_P",
"nome": "XTAL_P",
"tipo": "analog",
"funcoes": [
"Entrada/saída de clock externo",
"Conexão ao cristal ou oscilador do chip"
],
"categorias": [
"Analog",
"Clock"
],
"cor": "#a855f7",
"restricoes": "Clock diferencial positivo para oscilador de 40 MHz"
},
{
"numero": "ANT",
"nome": "ANT",
"tipo": "analog",
"funcoes": [
"Entrada/saída RF para comunicação 2.4 GHz",
"Interface de antena Wi-Fi/BLE/802.15.4"
],
"categorias": [
"Analog",
"RF"
],
"cor": "#a855f7",
"restricoes": "Sinais RF para comunicação sem fio"
}
]
+454
View File
@@ -0,0 +1,454 @@
[
{
"numero": "GND",
"nome": "GND",
"tipo": "ground",
"funcoes": [
"Referência elétrica do sistema",
"Conexão externa de terra"
],
"categorias": [
"Ground"
],
"cor": "#64748b",
"restricoes": ""
},
{
"numero": "VDD3P3",
"nome": "VDD3P3",
"tipo": "power",
"funcoes": [
"Alimentação do domínio analógico",
"Tensão de alimentação principal"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V)"
},
{
"numero": "VDDAPMU",
"nome": "VDDAPMU",
"tipo": "power",
"funcoes": [
"Alimentação do domínio analógico",
"Alimentação para pinos GPIO12, XTAL32KP, XTAL32KN"
],
"categorias": [
"Power",
"Analog"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V)"
},
{
"numero": "VBAT",
"nome": "VBAT",
"tipo": "power",
"funcoes": [
"Alimentação do domínio analógico ou bateria",
"Alimentação para pinos GPIO12, XTAL32KP, XTAL32KN"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V)"
},
{
"numero": "VDDPST1",
"nome": "VDDPST1",
"tipo": "power",
"funcoes": [
"Alimentação do domínio de IO digital e LP IO"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V)"
},
{
"numero": "VDDPST2",
"nome": "VDDPST2",
"tipo": "power",
"funcoes": [
"Alimentação do domínio de IO digital"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V)"
},
{
"numero": "CHIP_PU",
"nome": "CHIP_PU (EN)",
"tipo": "power",
"funcoes": [
"Habilitar chip (nível alto)",
"Reseta o chip (nível baixo)"
],
"categorias": [
"Power",
"Reset"
],
"cor": "#f97316",
"restricoes": "Deve estar em nível alto para operação normal; não deixar flutuante"
},
{
"numero": 0,
"nome": "GPIO0",
"tipo": "gpio",
"funcoes": [
"GPIO0",
"FSPIQ"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 1,
"nome": "GPIO1",
"tipo": "gpio",
"funcoes": [
"GPIO1",
"ADC1_CH0",
"FSPICS0"
],
"categorias": [
"GPIO",
"ADC",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 2,
"nome": "GPIO2 (MTMS)",
"tipo": "gpio",
"funcoes": [
"GPIO2",
"MTMS",
"ADC1_CH1",
"FSPIWP"
],
"categorias": [
"GPIO",
"JTAG",
"ADC",
"SPI",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Strapping pin; JTAG Test Mode Select"
},
{
"numero": 3,
"nome": "GPIO3 (MTDO)",
"tipo": "gpio",
"funcoes": [
"GPIO3",
"MTDO",
"ADC1_CH2",
"FSPIHD"
],
"categorias": [
"GPIO",
"JTAG",
"ADC",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "JTAG Test Data Out"
},
{
"numero": 4,
"nome": "GPIO4 (MTCK)",
"tipo": "gpio",
"funcoes": [
"GPIO4",
"MTCK",
"ADC1_CH3",
"FSPICLK"
],
"categorias": [
"GPIO",
"JTAG",
"ADC",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "JTAG Test Clock"
},
{
"numero": 5,
"nome": "GPIO5 (MTDI)",
"tipo": "gpio",
"funcoes": [
"GPIO5",
"MTDI",
"ADC1_CH4",
"FSPID"
],
"categorias": [
"GPIO",
"JTAG",
"ADC",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "JTAG Test Data In"
},
{
"numero": 8,
"nome": "GPIO8",
"tipo": "gpio",
"funcoes": [
"GPIO8"
],
"categorias": [
"GPIO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Strapping pin para controle de modo de boot e impressão ROM"
},
{
"numero": 9,
"nome": "GPIO9",
"tipo": "gpio",
"funcoes": [
"GPIO9"
],
"categorias": [
"GPIO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; strapping pin para modo boot (alto=SPI boot)"
},
{
"numero": 10,
"nome": "GPIO10",
"tipo": "gpio",
"funcoes": [
"GPIO10",
"Voltage Comparator ZCD0"
],
"categorias": [
"GPIO",
"Analog"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 11,
"nome": "GPIO11",
"tipo": "gpio",
"funcoes": [
"GPIO11",
"Voltage Comparator ZCD1"
],
"categorias": [
"GPIO",
"Analog"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 12,
"nome": "GPIO12",
"tipo": "gpio",
"funcoes": [
"GPIO12"
],
"categorias": [
"GPIO"
],
"cor": "#3b82f6",
"restricoes": "Alimentado por VDDAPMU/VBAT"
},
{
"numero": 13,
"nome": "GPIO13 (XTAL_32K_P)",
"tipo": "gpio",
"funcoes": [
"GPIO13",
"XTAL_32K_P"
],
"categorias": [
"GPIO",
"RTC",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "Pode ser usado para cristal RTC de 32.768 kHz; alimentado por VDDAPMU/VBAT"
},
{
"numero": 14,
"nome": "GPIO14 (XTAL_32K_N)",
"tipo": "gpio",
"funcoes": [
"GPIO14",
"XTAL_32K_N"
],
"categorias": [
"GPIO",
"RTC",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "Pode ser usado para cristal RTC de 32.768 kHz; alimentado por VDDAPMU/VBAT"
},
{
"numero": 22,
"nome": "GPIO22",
"tipo": "gpio",
"funcoes": [
"GPIO22"
],
"categorias": [
"GPIO"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 23,
"nome": "GPIO23 (U0RXD)",
"tipo": "gpio",
"funcoes": [
"GPIO23",
"UART0_RXD",
"FSPICS1"
],
"categorias": [
"GPIO",
"UART",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; UART0 RX para download de firmware"
},
{
"numero": 24,
"nome": "GPIO24 (U0TXD)",
"tipo": "gpio",
"funcoes": [
"GPIO24",
"UART0_TXD",
"FSPICS2"
],
"categorias": [
"GPIO",
"UART",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; UART0 TX para download de firmware"
},
{
"numero": 25,
"nome": "GPIO25",
"tipo": "gpio",
"funcoes": [
"GPIO25",
"FSPICS3"
],
"categorias": [
"GPIO",
"SPI",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Strapping pin para controle de fonte de sinal JTAG"
},
{
"numero": 26,
"nome": "GPIO26",
"tipo": "gpio",
"funcoes": [
"GPIO26",
"USB_D-",
"FSPICS4"
],
"categorias": [
"GPIO",
"USB",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "USB D- para USB OTG e USB Serial/JTAG; drive strength padrão 40mA"
},
{
"numero": 27,
"nome": "GPIO27",
"tipo": "gpio",
"funcoes": [
"GPIO27",
"USB_D+",
"FSPICS5"
],
"categorias": [
"GPIO",
"USB",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "USB D+ para USB OTG e USB Serial/JTAG; drive strength padrão 40mA"
},
{
"numero": "XTAL_N",
"nome": "XTAL_N",
"tipo": "analog",
"funcoes": [
"Entrada/saída de clock externo",
"Conexão ao cristal ou oscilador do chip"
],
"categorias": [
"Analog",
"Clock"
],
"cor": "#a855f7",
"restricoes": "Clock diferencial negativo de 32 MHz"
},
{
"numero": "XTAL_P",
"nome": "XTAL_P",
"tipo": "analog",
"funcoes": [
"Entrada/saída de clock externo",
"Conexão ao cristal ou oscilador do chip"
],
"categorias": [
"Analog",
"Clock"
],
"cor": "#a855f7",
"restricoes": "Clock diferencial positivo de 32 MHz"
},
{
"numero": "ANT",
"nome": "ANT",
"tipo": "analog",
"funcoes": [
"Entrada/saída RF para comunicação sem fio",
"Amplificador de baixo ruído RF"
],
"categorias": [
"Analog",
"RF"
],
"cor": "#a855f7",
"restricoes": "Sinais de entrada/saída do LNA RF para comunicação 2.4 GHz Bluetooth LE e 802.15.4"
}
]
File diff suppressed because it is too large. Load diff
+883
View File
@@ -0,0 +1,883 @@
[
{
"numero": "GND",
"nome": "GND",
"tipo": "ground",
"funcoes": [
"Referência elétrica do sistema",
"Referência para nível lógico baixo"
],
"categorias": [
"Ground"
],
"cor": "#64748b",
"restricoes": ""
},
{
"numero": "VDDA",
"nome": "VDDA",
"tipo": "power",
"funcoes": [
"Alimentação analógica do chip"
],
"categorias": [
"Power",
"Analog"
],
"cor": "#ef4444",
"restricoes": "Opera entre 2.8 V e 3.6 V"
},
{
"numero": "VDD3P3",
"nome": "VDD3P3",
"tipo": "power",
"funcoes": [
"Alimentação analógica do chip"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 2.8 V e 3.6 V"
},
{
"numero": "VDD3P3_RTC",
"nome": "VDD3P3_RTC",
"tipo": "power",
"funcoes": [
"Alimentação para o domínio RTC analógico"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 2.8 V e 3.6 V"
},
{
"numero": "VDD3P3_RTCIO",
"nome": "VDD3P3_RTCIO",
"tipo": "power",
"funcoes": [
"Alimentação para RTC IO"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V"
},
{
"numero": "VDD3P3_CPU",
"nome": "VDD3P3_CPU",
"tipo": "power",
"funcoes": [
"Alimentação para CPU IO"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 2.8 V e 3.6 V; não exceder 3.3 V para gravação de eFuse"
},
{
"numero": "VDDSPI",
"nome": "VDDSPI",
"tipo": "power",
"funcoes": [
"Alimentação dos barramentos de Flash e PSRAM"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Pode ser 1.8 V ou 3.3 V configurável via GPIO45"
},
{
"numero": "CHIP_PU",
"nome": "CHIP_PU (EN)",
"tipo": "power",
"funcoes": [
"Habilitar chip (nível alto)",
"Reseta o chip (nível baixo)"
],
"categorias": [
"Power"
],
"cor": "#f97316",
"restricoes": "Deve estar em nível alto para operação normal; não deixar flutuante"
},
{
"numero": 0,
"nome": "GPIO0",
"tipo": "gpio",
"funcoes": [
"GPIO0",
"RTC_GPIO0"
],
"categorias": [
"GPIO",
"RTC",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; strapping pin para modo boot (alto=SPI boot, baixo=download boot)"
},
{
"numero": 1,
"nome": "GPIO1",
"tipo": "gpio",
"funcoes": [
"GPIO1",
"ADC1_CH0",
"TOUCH1",
"RTC_GPIO1"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 2,
"nome": "GPIO2",
"tipo": "gpio",
"funcoes": [
"GPIO2",
"ADC1_CH1",
"TOUCH2",
"RTC_GPIO2"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 3,
"nome": "GPIO3",
"tipo": "gpio",
"funcoes": [
"GPIO3",
"ADC1_CH2",
"TOUCH3",
"RTC_GPIO3"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 4,
"nome": "GPIO4",
"tipo": "gpio",
"funcoes": [
"GPIO4",
"ADC1_CH3",
"TOUCH4",
"RTC_GPIO4"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 5,
"nome": "GPIO5",
"tipo": "gpio",
"funcoes": [
"GPIO5",
"ADC1_CH4",
"TOUCH5",
"RTC_GPIO5"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 6,
"nome": "GPIO6",
"tipo": "gpio",
"funcoes": [
"GPIO6",
"ADC1_CH5",
"TOUCH6",
"RTC_GPIO6"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 7,
"nome": "GPIO7",
"tipo": "gpio",
"funcoes": [
"GPIO7",
"ADC1_CH6",
"TOUCH7",
"RTC_GPIO7"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 8,
"nome": "GPIO8",
"tipo": "gpio",
"funcoes": [
"GPIO8",
"ADC1_CH7",
"TOUCH8",
"RTC_GPIO8"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 9,
"nome": "GPIO9",
"tipo": "gpio",
"funcoes": [
"GPIO9",
"ADC1_CH8",
"TOUCH9",
"RTC_GPIO9",
"FSPIHD"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 10,
"nome": "GPIO10",
"tipo": "gpio",
"funcoes": [
"GPIO10",
"ADC1_CH9",
"TOUCH10",
"RTC_GPIO10",
"FSPICS0",
"FSPIIO4"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 11,
"nome": "GPIO11",
"tipo": "gpio",
"funcoes": [
"GPIO11",
"ADC2_CH0",
"TOUCH11",
"RTC_GPIO11",
"FSPID",
"FSPIIO5"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 12,
"nome": "GPIO12",
"tipo": "gpio",
"funcoes": [
"GPIO12",
"ADC2_CH1",
"TOUCH12",
"RTC_GPIO12",
"FSPICLK",
"FSPIIO6"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 13,
"nome": "GPIO13",
"tipo": "gpio",
"funcoes": [
"GPIO13",
"ADC2_CH2",
"TOUCH13",
"RTC_GPIO13",
"FSPIQ",
"FSPIIO7"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 14,
"nome": "GPIO14",
"tipo": "gpio",
"funcoes": [
"GPIO14",
"ADC2_CH3",
"TOUCH14",
"RTC_GPIO14",
"FSPIWP",
"FSPIDQS"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 15,
"nome": "GPIO15",
"tipo": "gpio",
"funcoes": [
"GPIO15",
"ADC2_CH4",
"RTC_GPIO15",
"UART0_RTS",
"XTAL_32K_P"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"UART",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "Pode ser usado para cristal RTC de 32.768 kHz"
},
{
"numero": 16,
"nome": "GPIO16",
"tipo": "gpio",
"funcoes": [
"GPIO16",
"ADC2_CH5",
"RTC_GPIO16",
"UART0_CTS",
"XTAL_32K_N"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"UART",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "Pode ser usado para cristal RTC de 32.768 kHz"
},
{
"numero": 17,
"nome": "GPIO17",
"tipo": "gpio",
"funcoes": [
"GPIO17",
"ADC2_CH6",
"DAC1",
"RTC_GPIO17",
"UART1_TXD"
],
"categorias": [
"GPIO",
"ADC",
"DAC",
"RTC",
"UART"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 18,
"nome": "GPIO18",
"tipo": "gpio",
"funcoes": [
"GPIO18",
"ADC2_CH7",
"DAC2",
"RTC_GPIO18",
"UART1_RXD",
"CLKOUT3"
],
"categorias": [
"GPIO",
"ADC",
"DAC",
"RTC",
"UART",
"Clock"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 19,
"nome": "GPIO19",
"tipo": "gpio",
"funcoes": [
"GPIO19",
"ADC2_CH8",
"RTC_GPIO19",
"UART1_RTS",
"CLKOUT2",
"USB_D-"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"UART",
"Clock",
"USB"
],
"cor": "#3b82f6",
"restricoes": "USB D- para USB OTG"
},
{
"numero": 20,
"nome": "GPIO20",
"tipo": "gpio",
"funcoes": [
"GPIO20",
"ADC2_CH9",
"RTC_GPIO20",
"UART1_CTS",
"CLKOUT1",
"USB_D+"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"UART",
"Clock",
"USB"
],
"cor": "#3b82f6",
"restricoes": "USB D+ para USB OTG"
},
{
"numero": 21,
"nome": "GPIO21",
"tipo": "gpio",
"funcoes": [
"GPIO21",
"RTC_GPIO21"
],
"categorias": [
"GPIO",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 26,
"nome": "GPIO26",
"tipo": "gpio",
"funcoes": [
"GPIO26",
"SPICS1"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Usado para PSRAM embutida em ESP32-S2FN4R2 e ESP32-S2R2"
},
{
"numero": 27,
"nome": "GPIO27",
"tipo": "gpio",
"funcoes": [
"GPIO27",
"SPIHD"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash externa; não usar como GPIO normal"
},
{
"numero": 28,
"nome": "GPIO28",
"tipo": "gpio",
"funcoes": [
"GPIO28",
"SPIWP"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash externa; não usar como GPIO normal"
},
{
"numero": 29,
"nome": "GPIO29",
"tipo": "gpio",
"funcoes": [
"GPIO29",
"SPICS0"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash externa; não usar como GPIO normal"
},
{
"numero": 30,
"nome": "GPIO30",
"tipo": "gpio",
"funcoes": [
"GPIO30",
"SPICLK"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash externa; não usar como GPIO normal"
},
{
"numero": 31,
"nome": "GPIO31",
"tipo": "gpio",
"funcoes": [
"GPIO31",
"SPIQ"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash externa; não usar como GPIO normal"
},
{
"numero": 32,
"nome": "GPIO32",
"tipo": "gpio",
"funcoes": [
"GPIO32",
"SPID"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash externa; não usar como GPIO normal"
},
{
"numero": 33,
"nome": "GPIO33",
"tipo": "gpio",
"funcoes": [
"GPIO33",
"FSPIHD",
"SPIIO4"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Alimentação VDD3P3_CPU ou VDDSPI (configurável)"
},
{
"numero": 34,
"nome": "GPIO34",
"tipo": "gpio",
"funcoes": [
"GPIO34",
"FSPICS0",
"SPIIO5"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Alimentação VDD3P3_CPU ou VDDSPI (configurável)"
},
{
"numero": 35,
"nome": "GPIO35",
"tipo": "gpio",
"funcoes": [
"GPIO35",
"FSPID",
"SPIIO6"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Alimentação VDD3P3_CPU ou VDDSPI (configurável)"
},
{
"numero": 36,
"nome": "GPIO36",
"tipo": "gpio",
"funcoes": [
"GPIO36",
"FSPICLK",
"SPIIO7"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Alimentação VDD3P3_CPU ou VDDSPI (configurável)"
},
{
"numero": 37,
"nome": "GPIO37",
"tipo": "gpio",
"funcoes": [
"GPIO37",
"FSPIQ",
"SPIDQS"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Alimentação VDD3P3_CPU ou VDDSPI (configurável)"
},
{
"numero": 38,
"nome": "GPIO38",
"tipo": "gpio",
"funcoes": [
"GPIO38",
"FSPIWP"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 39,
"nome": "GPIO39",
"tipo": "gpio",
"funcoes": [
"GPIO39",
"MTCK",
"CLKOUT3"
],
"categorias": [
"GPIO",
"JTAG",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "JTAG para depuração"
},
{
"numero": 40,
"nome": "GPIO40",
"tipo": "gpio",
"funcoes": [
"GPIO40",
"MTDO",
"CLKOUT2"
],
"categorias": [
"GPIO",
"JTAG",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "JTAG para depuração"
},
{
"numero": 41,
"nome": "GPIO41",
"tipo": "gpio",
"funcoes": [
"GPIO41",
"MTDI",
"CLKOUT1"
],
"categorias": [
"GPIO",
"JTAG",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "JTAG para depuração"
},
{
"numero": 42,
"nome": "GPIO42",
"tipo": "gpio",
"funcoes": [
"GPIO42",
"MTMS"
],
"categorias": [
"GPIO",
"JTAG"
],
"cor": "#3b82f6",
"restricoes": "JTAG para depuração"
},
{
"numero": 43,
"nome": "GPIO43",
"tipo": "gpio",
"funcoes": [
"GPIO43",
"UART0_TXD",
"CLKOUT1"
],
"categorias": [
"GPIO",
"UART",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; UART0 TX para download de firmware"
},
{
"numero": 44,
"nome": "GPIO44",
"tipo": "gpio",
"funcoes": [
"GPIO44",
"UART0_RXD",
"CLKOUT2"
],
"categorias": [
"GPIO",
"UART",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; UART0 RX para download de firmware"
},
{
"numero": 45,
"nome": "GPIO45",
"tipo": "gpio",
"funcoes": [
"GPIO45"
],
"categorias": [
"GPIO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Pull-down interno; strapping pin para seleção de tensão VDDSPI (baixo=3.3V, alto=1.8V)"
},
{
"numero": 46,
"nome": "GPIO46",
"tipo": "gpio",
"funcoes": [
"GPIO46"
],
"categorias": [
"GPIO",
"Strapping"
],
"cor": "#22c55e",
"restricoes": "Somente entrada (input-only); pull-down fixo; strapping para habilitar/desabilitar mensagens ROM"
}
]
+945
View File
@@ -0,0 +1,945 @@
[
{
"numero": "GND",
"nome": "GND",
"tipo": "ground",
"funcoes": [
"Referência elétrica do sistema",
"Conexão externa de terra"
],
"categorias": [
"Ground"
],
"cor": "#64748b",
"restricoes": ""
},
{
"numero": "VDD3P3",
"nome": "VDD3P3",
"tipo": "power",
"funcoes": [
"Alimentação do domínio analógico"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V)"
},
{
"numero": "VDDA",
"nome": "VDDA",
"tipo": "power",
"funcoes": [
"Alimentação do domínio analógico"
],
"categorias": [
"Power",
"Analog"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V)"
},
{
"numero": "VDD3P3_RTC",
"nome": "VDD3P3_RTC",
"tipo": "power",
"funcoes": [
"Alimentação para o domínio RTC e parte do domínio digital"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V)"
},
{
"numero": "VDD3P3_CPU",
"nome": "VDD3P3_CPU",
"tipo": "power",
"funcoes": [
"Alimentação para o domínio digital e CPU"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V (típico 3.3 V); não exceder 3.3 V para gravação de eFuse"
},
{
"numero": "VDDSPI",
"nome": "VDDSPI",
"tipo": "power",
"funcoes": [
"Alimentação dos barramentos Flash e PSRAM",
"Pode funcionar como entrada ou saída"
],
"categorias": [
"Power"
],
"cor": "#ef4444",
"restricoes": "Pode ser 1.8 V ou 3.3 V configurável via GPIO45"
},
{
"numero": "CHIP_PU",
"nome": "CHIP_PU (EN)",
"tipo": "power",
"funcoes": [
"Habilitar chip (nível alto)",
"Reseta o chip (nível baixo)"
],
"categorias": [
"Power",
"Reset"
],
"cor": "#f97316",
"restricoes": "Deve estar em nível alto para operação normal; não deixar flutuante"
},
{
"numero": 0,
"nome": "GPIO0",
"tipo": "gpio",
"funcoes": [
"GPIO0",
"RTC_GPIO0"
],
"categorias": [
"GPIO",
"RTC",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; strapping pin para modo boot (alto=SPI boot, baixo=download boot)"
},
{
"numero": 1,
"nome": "GPIO1",
"tipo": "gpio",
"funcoes": [
"GPIO1",
"ADC1_CH0",
"TOUCH1",
"RTC_GPIO1"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 2,
"nome": "GPIO2",
"tipo": "gpio",
"funcoes": [
"GPIO2",
"ADC1_CH1",
"TOUCH2",
"RTC_GPIO2"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 3,
"nome": "GPIO3",
"tipo": "gpio",
"funcoes": [
"GPIO3",
"ADC1_CH2",
"TOUCH3",
"RTC_GPIO3"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Strapping pin para controle de fonte de sinal JTAG; sem pull-up/down interno"
},
{
"numero": 4,
"nome": "GPIO4",
"tipo": "gpio",
"funcoes": [
"GPIO4",
"ADC1_CH3",
"TOUCH4",
"RTC_GPIO4"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 5,
"nome": "GPIO5",
"tipo": "gpio",
"funcoes": [
"GPIO5",
"ADC1_CH4",
"TOUCH5",
"RTC_GPIO5"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 6,
"nome": "GPIO6",
"tipo": "gpio",
"funcoes": [
"GPIO6",
"ADC1_CH5",
"TOUCH6",
"RTC_GPIO6"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 7,
"nome": "GPIO7",
"tipo": "gpio",
"funcoes": [
"GPIO7",
"ADC1_CH6",
"TOUCH7",
"RTC_GPIO7"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 8,
"nome": "GPIO8",
"tipo": "gpio",
"funcoes": [
"GPIO8",
"ADC1_CH7",
"TOUCH8",
"RTC_GPIO8"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 9,
"nome": "GPIO9",
"tipo": "gpio",
"funcoes": [
"GPIO9",
"ADC1_CH8",
"TOUCH9",
"RTC_GPIO9",
"FSPIHD"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 10,
"nome": "GPIO10",
"tipo": "gpio",
"funcoes": [
"GPIO10",
"ADC1_CH9",
"TOUCH10",
"RTC_GPIO10",
"FSPICS0",
"FSPIIO4"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 11,
"nome": "GPIO11",
"tipo": "gpio",
"funcoes": [
"GPIO11",
"ADC2_CH0",
"TOUCH11",
"RTC_GPIO11",
"FSPID",
"FSPIIO5"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 12,
"nome": "GPIO12",
"tipo": "gpio",
"funcoes": [
"GPIO12",
"ADC2_CH1",
"TOUCH12",
"RTC_GPIO12",
"FSPICLK",
"FSPIIO6"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 13,
"nome": "GPIO13",
"tipo": "gpio",
"funcoes": [
"GPIO13",
"ADC2_CH2",
"TOUCH13",
"RTC_GPIO13",
"FSPIQ",
"FSPIIO7"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 14,
"nome": "GPIO14",
"tipo": "gpio",
"funcoes": [
"GPIO14",
"ADC2_CH3",
"TOUCH14",
"RTC_GPIO14",
"FSPIWP",
"FSPIDQS"
],
"categorias": [
"GPIO",
"ADC",
"Touch",
"RTC",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 15,
"nome": "GPIO15",
"tipo": "gpio",
"funcoes": [
"GPIO15",
"ADC2_CH4",
"RTC_GPIO15",
"XTAL_32K_P",
"UART0_RTS"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"UART",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "Pode ser usado para cristal RTC de 32.768 kHz"
},
{
"numero": 16,
"nome": "GPIO16",
"tipo": "gpio",
"funcoes": [
"GPIO16",
"ADC2_CH5",
"RTC_GPIO16",
"XTAL_32K_N",
"UART0_CTS"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"UART",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "Pode ser usado para cristal RTC de 32.768 kHz"
},
{
"numero": 17,
"nome": "GPIO17",
"tipo": "gpio",
"funcoes": [
"GPIO17",
"ADC2_CH6",
"RTC_GPIO17",
"UART1_TXD"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"UART"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 18,
"nome": "GPIO18",
"tipo": "gpio",
"funcoes": [
"GPIO18",
"ADC2_CH7",
"RTC_GPIO18",
"UART1_RXD",
"CLKOUT3"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"UART",
"Clock"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 19,
"nome": "GPIO19",
"tipo": "gpio",
"funcoes": [
"GPIO19",
"ADC2_CH8",
"RTC_GPIO19",
"UART1_RTS",
"CLKOUT2",
"USB_D-"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"UART",
"Clock",
"USB"
],
"cor": "#3b82f6",
"restricoes": "USB D- para USB OTG e USB Serial/JTAG"
},
{
"numero": 20,
"nome": "GPIO20",
"tipo": "gpio",
"funcoes": [
"GPIO20",
"ADC2_CH9",
"RTC_GPIO20",
"UART1_CTS",
"CLKOUT1",
"USB_D+"
],
"categorias": [
"GPIO",
"ADC",
"RTC",
"UART",
"Clock",
"USB"
],
"cor": "#3b82f6",
"restricoes": "USB D+ para USB OTG e USB Serial/JTAG"
},
{
"numero": 21,
"nome": "GPIO21",
"tipo": "gpio",
"funcoes": [
"GPIO21",
"RTC_GPIO21"
],
"categorias": [
"GPIO",
"RTC"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 26,
"nome": "GPIO26",
"tipo": "gpio",
"funcoes": [
"GPIO26",
"SPICS1"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Usado para PSRAM embutida em algumas variantes; pull-up interno"
},
{
"numero": 27,
"nome": "GPIO27",
"tipo": "gpio",
"funcoes": [
"GPIO27",
"SPIHD"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash/PSRAM; não usar como GPIO normal; pull-up interno"
},
{
"numero": 28,
"nome": "GPIO28",
"tipo": "gpio",
"funcoes": [
"GPIO28",
"SPIWP"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash/PSRAM; não usar como GPIO normal; pull-up interno"
},
{
"numero": 29,
"nome": "GPIO29",
"tipo": "gpio",
"funcoes": [
"GPIO29",
"SPICS0"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash/PSRAM; não usar como GPIO normal; pull-up interno"
},
{
"numero": 30,
"nome": "GPIO30",
"tipo": "gpio",
"funcoes": [
"GPIO30",
"SPICLK"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash/PSRAM; não usar como GPIO normal; pull-up interno"
},
{
"numero": 31,
"nome": "GPIO31",
"tipo": "gpio",
"funcoes": [
"GPIO31",
"SPIQ"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash/PSRAM; não usar como GPIO normal; pull-up interno"
},
{
"numero": 32,
"nome": "GPIO32",
"tipo": "gpio",
"funcoes": [
"GPIO32",
"SPID"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#f97316",
"restricoes": "Compartilhado com flash/PSRAM; não usar como GPIO normal; pull-up interno"
},
{
"numero": 33,
"nome": "GPIO33",
"tipo": "gpio",
"funcoes": [
"GPIO33",
"FSPIHD",
"SPIIO4"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Alimentação VDD3P3_CPU ou VDDSPI (configurável); usado para modo SPI de 8 linhas"
},
{
"numero": 34,
"nome": "GPIO34",
"tipo": "gpio",
"funcoes": [
"GPIO34",
"FSPICS0",
"SPIIO5"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Alimentação VDD3P3_CPU ou VDDSPI (configurável); usado para modo SPI de 8 linhas"
},
{
"numero": 35,
"nome": "GPIO35",
"tipo": "gpio",
"funcoes": [
"GPIO35",
"FSPID",
"SPIIO6"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Alimentação VDD3P3_CPU ou VDDSPI (configurável); usado para modo SPI de 8 linhas"
},
{
"numero": 36,
"nome": "GPIO36",
"tipo": "gpio",
"funcoes": [
"GPIO36",
"FSPICLK",
"SPIIO7"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Alimentação VDD3P3_CPU ou VDDSPI (configurável); usado para modo SPI de 8 linhas"
},
{
"numero": 37,
"nome": "GPIO37",
"tipo": "gpio",
"funcoes": [
"GPIO37",
"FSPIQ",
"SPIDQS"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": "Alimentação VDD3P3_CPU ou VDDSPI (configurável); usado para modo SPI de 8 linhas"
},
{
"numero": 38,
"nome": "GPIO38",
"tipo": "gpio",
"funcoes": [
"GPIO38",
"FSPIWP"
],
"categorias": [
"GPIO",
"SPI"
],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 39,
"nome": "GPIO39",
"tipo": "gpio",
"funcoes": [
"GPIO39",
"MTCK",
"CLKOUT3"
],
"categorias": [
"GPIO",
"JTAG",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "JTAG para depuração"
},
{
"numero": 40,
"nome": "GPIO40",
"tipo": "gpio",
"funcoes": [
"GPIO40",
"MTDO",
"CLKOUT2"
],
"categorias": [
"GPIO",
"JTAG",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "JTAG para depuração"
},
{
"numero": 41,
"nome": "GPIO41",
"tipo": "gpio",
"funcoes": [
"GPIO41",
"MTDI",
"CLKOUT1"
],
"categorias": [
"GPIO",
"JTAG",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "JTAG para depuração"
},
{
"numero": 42,
"nome": "GPIO42",
"tipo": "gpio",
"funcoes": [
"GPIO42",
"MTMS"
],
"categorias": [
"GPIO",
"JTAG"
],
"cor": "#3b82f6",
"restricoes": "JTAG para depuração"
},
{
"numero": 43,
"nome": "GPIO43",
"tipo": "gpio",
"funcoes": [
"GPIO43",
"UART0_TXD",
"CLKOUT1"
],
"categorias": [
"GPIO",
"UART",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; UART0 TX para download de firmware"
},
{
"numero": 44,
"nome": "GPIO44",
"tipo": "gpio",
"funcoes": [
"GPIO44",
"UART0_RXD",
"CLKOUT2"
],
"categorias": [
"GPIO",
"UART",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "Pull-up interno; UART0 RX para download de firmware"
},
{
"numero": 45,
"nome": "GPIO45",
"tipo": "gpio",
"funcoes": [
"GPIO45"
],
"categorias": [
"GPIO",
"Strapping"
],
"cor": "#3b82f6",
"restricoes": "Pull-down interno; strapping pin para seleção de tensão VDDSPI (baixo=3.3V, alto=1.8V)"
},
{
"numero": 46,
"nome": "GPIO46",
"tipo": "gpio",
"funcoes": [
"GPIO46"
],
"categorias": [
"GPIO",
"Strapping"
],
"cor": "#22c55e",
"restricoes": "Somente entrada (input-only); pull-down interno; strapping para boot mode e controle de mensagens ROM"
},
{
"numero": 47,
"nome": "GPIO47",
"tipo": "gpio",
"funcoes": [
"GPIO47",
"SPICLK_P_DIFF"
],
"categorias": [
"GPIO",
"SPI",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "Clock diferencial positivo para barramento SPI"
},
{
"numero": 48,
"nome": "GPIO48",
"tipo": "gpio",
"funcoes": [
"GPIO48",
"SPICLK_N_DIFF"
],
"categorias": [
"GPIO",
"SPI",
"Clock"
],
"cor": "#3b82f6",
"restricoes": "Clock diferencial negativo para barramento SPI"
},
{
"numero": "XTAL_N",
"nome": "XTAL_N",
"tipo": "analog",
"funcoes": [
"Entrada/saída de clock externo",
"Conexão ao cristal ou oscilador do chip"
],
"categorias": [
"Analog",
"Clock"
],
"cor": "#a855f7",
"restricoes": "Clock diferencial negativo"
},
{
"numero": "XTAL_P",
"nome": "XTAL_P",
"tipo": "analog",
"funcoes": [
"Entrada/saída de clock externo",
"Conexão ao cristal ou oscilador do chip"
],
"categorias": [
"Analog",
"Clock"
],
"cor": "#a855f7",
"restricoes": "Clock diferencial positivo"
},
{
"numero": "LNA",
"nome": "LNA_IN",
"tipo": "analog",
"funcoes": [
"Entrada/saída do amplificador de baixo ruído RF"
],
"categorias": [
"Analog",
"RF"
],
"cor": "#a855f7",
"restricoes": "Sinais de entrada/saída do LNA RF"
}
]
+362
View File
@@ -0,0 +1,362 @@
[
{
"numero": "GND",
"nome": "GND",
"tipo": "ground",
"funcoes": ["Referência elétrica do sistema", "Referência para nível lógico baixo"],
"categorias": ["Ground"],
"cor": "#64748b",
"restricoes": ""
},
{
"numero": "CPU",
"nome": "VDD3P3_CPU",
"tipo": "power",
"funcoes": ["Alimentação digital principal"],
"categorias": ["Power"],
"cor": "#ef4444",
"restricoes": "Opera entre 1.8 V e 3.6 V"
},
{
"numero": "RTC",
"nome": "VDD3P3_RTC",
"tipo": "power",
"funcoes": ["Alimentação para o domínio RTC", "Alimentação de referência para o LDO interno"],
"categorias": ["Power"],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V em chips com flash; entre 2.3 V e 3.6 V sem flash"
},
{
"numero": "SDIO",
"nome": "VDD_SDIO",
"tipo": "power",
"funcoes": ["Alimentação dos barramentos de Flash e PSRAM"],
"categorias": ["Power"],
"cor": "#ef4444",
"restricoes": "Tensão definida pela GPIO12 na inicialização"
},
{
"numero": "VDDA",
"nome": "VDDA",
"tipo": "power",
"funcoes": ["Alimentação analógica do chip", "Alimentação de referência para o ADC"],
"categorias": ["Power", "Analog"],
"cor": "#ef4444",
"restricoes": "Opera entre 3.0 V e 3.6 V com flash; entre 2.3 V e 3.6 V sem flash"
},
{
"numero": "CHIP_PU",
"nome": "CHIP_PU (EN)",
"tipo": "power",
"funcoes": ["Habilitar chip (nível alto)", "Reseta a placa (nível baixo)"],
"categorias": ["Power"],
"cor": "#f97316",
"restricoes": "Deve estar em nível alto para operação normal; usar resistor pull-up para evitar reset acidental"
},
{
"numero": 0,
"nome": "GPIO0",
"tipo": "gpio",
"funcoes": ["GPIO0", "ADC2_CH1", "RTC_GPIO11", "TOUCH1", "HSPIWP", "I2C_SDA_RTC", "CLK_OUT1", "PWM"],
"categorias": ["GPIO", "ADC", "RTC", "Touch", "SPI", "I2C", "Clock", "PWM", "Strapping"],
"cor": "#3b82f6",
"restricoes": "Resistor pull-up interno; uso como strapping durante boot; modo download firmware em nível baixo"
},
{
"numero": 1,
"nome": "GPIO1",
"tipo": "gpio",
"funcoes": ["GPIO1", "UART0_TXD", "CLK_OUT3", "PWM"],
"categorias": ["GPIO", "UART", "Clock", "PWM"],
"cor": "#3b82f6",
"restricoes": "Resistor pull-up interno; usado para download de firmware"
},
{
"numero": 2,
"nome": "GPIO2",
"tipo": "gpio",
"funcoes": ["GPIO2", "ADC2_CH2", "RTC_GPIO12", "TOUCH2", "I2C_SCL_RTC", "HSPIWP", "PWM"],
"categorias": ["GPIO", "ADC", "RTC", "Touch", "I2C", "PWM", "Strapping"],
"cor": "#3b82f6",
"restricoes": "Resistor pull-down interno; habilita download firmware junto com GPIO0 em nível baixo"
},
{
"numero": 3,
"nome": "GPIO3",
"tipo": "gpio",
"funcoes": ["GPIO3", "UART0_RXD", "CLK_OUT2", "PWM"],
"categorias": ["GPIO", "UART", "Clock", "PWM"],
"cor": "#3b82f6",
"restricoes": "Resistor pull-up interno; usado para download de firmware"
},
{
"numero": 4,
"nome": "GPIO4",
"tipo": "gpio",
"funcoes": ["GPIO4", "ADC2_CH0", "RTC_GPIO10", "TOUCH0", "HSPIHD", "I2C_SCL_RTC", "PWM"],
"categorias": ["GPIO", "ADC", "RTC", "Touch", "SPI", "I2C", "PWM"],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 5,
"nome": "GPIO5",
"tipo": "gpio",
"funcoes": ["GPIO5", "VSPICS0", "PWM"],
"categorias": ["GPIO", "SPI", "PWM", "Strapping"],
"cor": "#3b82f6",
"restricoes": "Resistor pull-up interno; leitura em bordas para strapping"
},
{
"numero": 6,
"nome": "GPIO6",
"tipo": "gpio",
"funcoes": ["GPIO6", "SPICLK", "UART1_CTS", "PWM"],
"categorias": ["GPIO", "SPI", "UART", "PWM"],
"cor": "#f97316",
"restricoes": "Compartilhado com memória flash externa; não usar como GPIO normal"
},
{
"numero": 7,
"nome": "GPIO7",
"tipo": "gpio",
"funcoes": ["GPIO7", "SPIQ", "UART2_RTS", "PWM"],
"categorias": ["GPIO", "SPI", "UART", "PWM"],
"cor": "#f97316",
"restricoes": "Compartilhado com memória flash externa; não usar como GPIO normal"
},
{
"numero": 8,
"nome": "GPIO8",
"tipo": "gpio",
"funcoes": ["GPIO8", "SPID", "UART2_CTS", "PWM"],
"categorias": ["GPIO", "SPI", "UART", "PWM"],
"cor": "#f97316",
"restricoes": "Compartilhado com memória flash externa; não usar como GPIO normal"
},
{
"numero": 9,
"nome": "GPIO9",
"tipo": "gpio",
"funcoes": ["GPIO9", "SPIHD", "UART1_RXD", "PWM"],
"categorias": ["GPIO", "SPI", "UART", "PWM"],
"cor": "#f97316",
"restricoes": "Compartilhado com memória flash externa; não usar como GPIO normal"
},
{
"numero": 10,
"nome": "GPIO10",
"tipo": "gpio",
"funcoes": ["GPIO10", "SPIWP", "UART1_TXD", "PWM"],
"categorias": ["GPIO", "SPI", "UART", "PWM"],
"cor": "#f97316",
"restricoes": "Compartilhado com memória flash externa; não usar como GPIO normal"
},
{
"numero": 11,
"nome": "GPIO11",
"tipo": "gpio",
"funcoes": ["GPIO11", "SPICS0", "UART1_RTS", "PWM"],
"categorias": ["GPIO", "SPI", "UART", "PWM"],
"cor": "#f97316",
"restricoes": "Compartilhado com memória flash externa; não usar como GPIO normal"
},
{
"numero": 12,
"nome": "GPIO12",
"tipo": "gpio",
"funcoes": ["GPIO12", "ADC2_CH5", "RTC_GPIO15", "TOUCH5", "HSPIQ", "JTAG_MTDI", "PWM"],
"categorias": ["GPIO", "ADC", "RTC", "Touch", "SPI", "JTAG", "Strapping", "PWM"],
"cor": "#3b82f6",
"restricoes": "Resistor pull-down interno; seleção nível tensão flash externa; VDD_SDIO definida na inicialização"
},
{
"numero": 13,
"nome": "GPIO13",
"tipo": "gpio",
"funcoes": ["GPIO13", "ADC2_CH4", "RTC_GPIO14", "TOUCH4", "HSPID", "JTAG_MTCK", "PWM"],
"categorias": ["GPIO", "ADC", "RTC", "Touch", "SPI", "JTAG", "PWM"],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 14,
"nome": "GPIO14",
"tipo": "gpio",
"funcoes": ["GPIO14", "ADC2_CH6", "RTC_GPIO16", "TOUCH6", "HSPICLK", "JTAG_MTMS", "PWM"],
"categorias": ["GPIO", "ADC", "RTC", "Touch", "SPI", "JTAG", "PWM"],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 15,
"nome": "GPIO15",
"tipo": "gpio",
"funcoes": ["GPIO15", "ADC2_CH3", "RTC_GPIO13", "TOUCH3", "HSPICS0", "I2C_SDA_RTC", "JTAG_MTDO", "PWM"],
"categorias": ["GPIO", "ADC", "RTC", "Touch", "SPI", "I2C", "JTAG", "Strapping", "PWM"],
"cor": "#3b82f6",
"restricoes": "Resistor pull-up interno; controla logs na UART 0; configurações strapping"
},
{
"numero": 16,
"nome": "GPIO16",
"tipo": "gpio",
"funcoes": ["GPIO16", "UART2_RXD", "PWM"],
"categorias": ["GPIO", "UART", "PWM"],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 17,
"nome": "GPIO17",
"tipo": "gpio",
"funcoes": ["GPIO17", "UART2_TXD", "PWM"],
"categorias": ["GPIO", "UART", "PWM"],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 18,
"nome": "GPIO18",
"tipo": "gpio",
"funcoes": ["GPIO18", "VSPICLK", "PWM"],
"categorias": ["GPIO", "SPI", "PWM"],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 19,
"nome": "GPIO19",
"tipo": "gpio",
"funcoes": ["GPIO19", "UART0_CTS", "VSPIQ", "PWM"],
"categorias": ["GPIO", "UART", "SPI", "PWM"],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 21,
"nome": "GPIO21",
"tipo": "gpio",
"funcoes": ["GPIO21", "VSPIHD", "PWM"],
"categorias": ["GPIO", "SPI", "PWM"],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 22,
"nome": "GPIO22",
"tipo": "gpio",
"funcoes": ["GPIO22", "UART0_RTS", "VSPIWP", "PWM"],
"categorias": ["GPIO", "UART", "SPI", "PWM"],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 23,
"nome": "GPIO23",
"tipo": "gpio",
"funcoes": ["GPIO23", "VSPID", "PWM"],
"categorias": ["GPIO", "SPI", "PWM"],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 25,
"nome": "GPIO25",
"tipo": "gpio",
"funcoes": ["GPIO25", "ADC2_CH8", "RTC_GPIO6", "DAC1", "PWM"],
"categorias": ["GPIO", "ADC", "RTC", "DAC", "PWM"],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 26,
"nome": "GPIO26",
"tipo": "gpio",
"funcoes": ["GPIO26", "ADC2_CH9", "RTC_GPIO7", "DAC2", "PWM"],
"categorias": ["GPIO", "ADC", "RTC", "DAC", "PWM"],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 27,
"nome": "GPIO27",
"tipo": "gpio",
"funcoes": ["GPIO27", "ADC2_CH7", "RTC_GPIO17", "TOUCH7", "PWM"],
"categorias": ["GPIO", "ADC", "RTC", "Touch", "PWM"],
"cor": "#3b82f6",
"restricoes": ""
},
{
"numero": 32,
"nome": "GPIO32",
"tipo": "gpio",
"funcoes": ["GPIO32", "ADC1_CH4", "RTC_GPIO9", "TOUCH9", "XTAL_32K_P", "PWM"],
"categorias": ["GPIO", "ADC", "RTC", "Touch", "Clock", "PWM"],
"cor": "#3b82f6",
"restricoes": "Cristal oscilador externo opcional para RTC; frequência 32.768 kHz"
},
{
"numero": 33,
"nome": "GPIO33",
"tipo": "gpio",
"funcoes": ["GPIO33", "ADC1_CH5", "RTC_GPIO8", "TOUCH8", "XTAL_32K_N", "PWM"],
"categorias": ["GPIO", "ADC", "RTC", "Touch", "Clock", "PWM"],
"cor": "#3b82f6",
"restricoes": "Cristal oscilador externo opcional para RTC; frequência 32.768 kHz"
},
{
"numero": 34,
"nome": "GPIO34",
"tipo": "gpio",
"funcoes": ["GPIO34", "ADC1_CH6", "RTC_GPIO4"],
"categorias": ["GPIO", "ADC", "RTC"],
"cor": "#22c55e",
"restricoes": "Somente entrada; não suporta saída"
},
{
"numero": 35,
"nome": "GPIO35",
"tipo": "gpio",
"funcoes": ["GPIO35", "ADC1_CH7", "RTC_GPIO5"],
"categorias": ["GPIO", "ADC", "RTC"],
"cor": "#22c55e",
"restricoes": "Somente entrada; não suporta saída"
},
{
"numero": 36,
"nome": "GPIO36",
"tipo": "gpio",
"funcoes": ["GPIO36", "ADC1_CH0", "RTC_GPIO0"],
"categorias": ["GPIO", "ADC", "RTC"],
"cor": "#22c55e",
"restricoes": "Somente entrada; não suporta saída"
},
{
"numero": 37,
"nome": "GPIO37",
"tipo": "gpio",
"funcoes": ["GPIO37", "ADC1_CH1", "RTC_GPIO1"],
"categorias": ["GPIO", "ADC", "RTC"],
"cor": "#22c55e",
"restricoes": "Somente entrada; não suporta saída"
},
{
"numero": 38,
"nome": "GPIO38",
"tipo": "gpio",
"funcoes": ["GPIO38", "ADC1_CH2", "RTC_GPIO2"],
"categorias": ["GPIO", "ADC", "RTC"],
"cor": "#22c55e",
"restricoes": "Somente entrada; não suporta saída"
},
{
"numero": 39,
"nome": "GPIO39",
"tipo": "gpio",
"funcoes": ["GPIO39", "ADC1_CH3", "RTC_GPIO3"],
"categorias": ["GPIO", "ADC", "RTC"],
"cor": "#22c55e",
"restricoes": "Somente entrada (input-only)"
}
]
+241
View File
@@ -0,0 +1,241 @@
{
"ESP-IDF": {
"nome": "ESP-IDF",
"icone": "⚙️",
"nome_completo": "Espressif IoT Development Framework",
"descricao": "Framework oficial de desenvolvimento da Espressif para ESP32, baseado em FreeRTOS",
"linguagem": "C/C++",
"tipo": "Framework Base",
"funcao_principal": "Desenvolvimento de aplicações IoT de propósito geral com acesso completo ao hardware",
"caracteristicas": [
"Sistema operacional em tempo real (FreeRTOS)",
"Pilha completa de Wi-Fi e Bluetooth",
"Suporte a todos os periféricos do ESP32",
"Ferramentas de build e debug integradas",
"Gerenciamento de energia avançado",
"Suporte OTA (Over-The-Air updates)",
"Biblioteca de componentes extensível"
],
"casos_uso": [
"Dispositivos IoT conectados",
"Automação residencial e industrial",
"Wearables e dispositivos vestíveis",
"Gateways e hubs de comunicação",
"Sistemas embarcados em tempo real"
],
"exemplo_codigo": "#include \"freertos/FreeRTOS.h\"\n#include \"freertos/task.h\"\n#include \"esp_wifi.h\"\n#include \"esp_log.h\"\n\nstatic const char *TAG = \"app_main\";\n\nvoid app_main(void)\n{\n ESP_LOGI(TAG, \"Iniciando aplicação ESP32\");\n \n // Inicializar Wi-Fi\n esp_netif_init();\n esp_event_loop_create_default();\n \n // Configurar Wi-Fi em modo station\n wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();\n esp_wifi_init(&cfg);\n \n ESP_LOGI(TAG, \"Wi-Fi inicializado com sucesso\");\n}",
"documentacao": "https://docs.espressif.com/projects/esp-idf/",
"repositorio": "https://github.com/espressif/esp-idf",
"cor": "#E74C3C"
},
"ESP-ADF": {
"nome": "ESP-ADF",
"icone": "🎵",
"nome_completo": "ESP Audio Development Framework",
"descricao": "Framework especializado para aplicações de áudio no ESP32",
"linguagem": "C/C++",
"tipo": "Framework Especializado",
"funcao_principal": "Desenvolvimento de aplicações de áudio com suporte a codecs, streaming e processamento",
"caracteristicas": [
"Suporte a múltiplos codecs de áudio (MP3, AAC, FLAC, WAV, etc.)",
"Pipeline de áudio configurável",
"Streaming de áudio via HTTP, HTTPS, HLS",
"Integração com serviços de nuvem (AWS, Google, Baidu)",
"Reconhecimento de voz e wake word",
"Equalização e efeitos de áudio",
"Suporte a Bluetooth A2DP e HFP"
],
"casos_uso": [
"Alto-falantes inteligentes",
"Assistentes de voz",
"Rádios de internet",
"Players de música",
"Interfones e intercomunicadores",
"Sistemas de PA (Public Address)"
],
"exemplo_codigo": "#include \"audio_pipeline.h\"\n#include \"audio_element.h\"\n#include \"mp3_decoder.h\"\n#include \"i2s_stream.h\"\n\nvoid app_main(void)\n{\n // Criar pipeline de áudio\n audio_pipeline_handle_t pipeline = audio_pipeline_init(&pipeline_cfg);\n \n // Criar elementos: HTTP stream -> MP3 decoder -> I2S output\n audio_element_handle_t http_stream = http_stream_init(&http_cfg);\n audio_element_handle_t mp3_decoder = mp3_decoder_init(&mp3_cfg);\n audio_element_handle_t i2s_stream = i2s_stream_init(&i2s_cfg);\n \n // Registrar elementos no pipeline\n audio_pipeline_register(pipeline, http_stream, \"http\");\n audio_pipeline_register(pipeline, mp3_decoder, \"mp3\");\n audio_pipeline_register(pipeline, i2s_stream, \"i2s\");\n \n // Conectar elementos\n audio_pipeline_link(pipeline, (const char *[]){\"http\", \"mp3\", \"i2s\"}, 3);\n \n // Iniciar reprodução\n audio_pipeline_run(pipeline);\n}",
"documentacao": "https://docs.espressif.com/projects/esp-adf/",
"repositorio": "https://github.com/espressif/esp-adf",
"cor": "#3498DB"
},
"ESP-DSP": {
"nome": "ESP-DSP",
"icone": "📊",
"nome_completo": "ESP Digital Signal Processing Library",
"descricao": "Biblioteca otimizada para processamento digital de sinais no ESP32",
"linguagem": "C/C++",
"tipo": "Biblioteca Especializada",
"funcao_principal": "Processamento de sinais digitais com algoritmos otimizados para arquitetura ESP32",
"caracteristicas": [
"Operações matemáticas otimizadas (FFT, convolução, correlação)",
"Filtros digitais (FIR, IIR, Kalman)",
"Transformadas (FFT, DCT, DWT)",
"Operações de matriz e vetores",
"Suporte a ponto fixo e ponto flutuante",
"Otimizações específicas para Xtensa e RISC-V"
],
"casos_uso": [
"Análise de sinais de áudio",
"Processamento de sinais de sensores",
"Filtros adaptativos",
"Análise espectral",
"Compressão de dados",
"Reconhecimento de padrões"
],
"exemplo_codigo": "#include \"esp_dsp.h\"\n\n#define N_SAMPLES 1024\nfloat input[N_SAMPLES];\nfloat output[N_SAMPLES];\n\nvoid app_main(void)\n{\n // Inicializar biblioteca DSP\n dsps_fft2r_init_fc32(NULL, N_SAMPLES);\n \n // Gerar sinal de entrada (exemplo: onda senoidal)\n for (int i = 0; i < N_SAMPLES; i++) {\n input[i] = sinf(2 * M_PI * 50 * i / N_SAMPLES);\n }\n \n // Aplicar FFT\n dsps_fft2r_fc32(input, N_SAMPLES);\n \n // Calcular magnitude do espectro\n for (int i = 0; i < N_SAMPLES / 2; i++) {\n output[i] = sqrtf(input[i*2] * input[i*2] + \n input[i*2+1] * input[i*2+1]);\n }\n}",
"documentacao": "https://docs.espressif.com/projects/esp-dsp/",
"repositorio": "https://github.com/espressif/esp-dsp",
"cor": "#9B59B6"
},
"ESP-WHO": {
"nome": "ESP-WHO",
"icone": "📷",
"nome_completo": "ESP Image Processing Framework",
"descricao": "Framework para processamento de imagens e visão computacional no ESP32",
"linguagem": "C/C++",
"tipo": "Framework Especializado",
"funcao_principal": "Detecção facial, reconhecimento facial e processamento de imagens",
"caracteristicas": [
"Detecção de faces em tempo real",
"Reconhecimento facial",
"Detecção de pontos faciais (landmarks)",
"Rastreamento de objetos",
"Otimizado para ESP32-S3 com aceleradores de IA",
"Suporte a câmeras via interface DVP",
"Modelos de rede neural otimizados"
],
"casos_uso": [
"Sistemas de reconhecimento facial",
"Controle de acesso inteligente",
"Câmeras de segurança com IA",
"Detecção de presença",
"Análise de expressões faciais",
"Contagem de pessoas"
],
"exemplo_codigo": "#include \"esp_camera.h\"\n#include \"fd_forward.h\"\n#include \"fr_forward.h\"\n\nvoid app_main(void)\n{\n // Inicializar câmera\n camera_config_t config = {\n .pin_pwdn = -1,\n .pin_reset = -1,\n .pin_xclk = 21,\n .pin_sscb_sda = 26,\n .pin_sscb_scl = 27,\n // ... outras configurações\n };\n esp_camera_init(&config);\n \n // Capturar frame\n camera_fb_t *fb = esp_camera_fb_get();\n \n // Detectar faces\n dl_matrix3du_t *image_matrix = dl_matrix3du_alloc(1, fb->width, fb->height, 3);\n box_array_t *detected = face_detect(image_matrix, &mtmn_config);\n \n if (detected) {\n printf(\"Detectadas %d faces\\n\", detected->len);\n // Processar faces detectadas\n }\n \n // Liberar recursos\n esp_camera_fb_return(fb);\n}",
"documentacao": "https://github.com/espressif/esp-who",
"repositorio": "https://github.com/espressif/esp-who",
"cor": "#E67E22"
},
"ESP-NN": {
"nome": "ESP-NN",
"icone": "🧠",
"nome_completo": "ESP Neural Network Library",
"descricao": "Biblioteca de redes neurais otimizada para ESP32",
"linguagem": "C/C++",
"tipo": "Biblioteca Especializada",
"funcao_principal": "Inferência de redes neurais com otimizações específicas para ESP32",
"caracteristicas": [
"Operações de rede neural otimizadas",
"Suporte a convolução, pooling, fully connected",
"Quantização de 8 e 16 bits",
"Otimizações SIMD para Xtensa e RISC-V",
"Compatível com TensorFlow Lite",
"Baixo consumo de memória",
"Aceleração via instruções vetoriais"
],
"casos_uso": [
"Classificação de imagens",
"Detecção de objetos",
"Reconhecimento de voz",
"Predição de séries temporais",
"Detecção de anomalias",
"IA na borda (Edge AI)"
],
"exemplo_codigo": "#include \"esp_nn.h\"\n\n#define INPUT_SIZE 224*224*3\n#define OUTPUT_SIZE 1000\n\nint8_t input_data[INPUT_SIZE];\nint8_t output_data[OUTPUT_SIZE];\n\nvoid app_main(void)\n{\n // Preparar dados de entrada (imagem pré-processada)\n // ...\n \n // Executar camada de convolução\n esp_nn_conv2d_s8(\n input_data, // entrada\n output_data, // saída\n weights, // pesos\n bias, // bias\n input_height, // altura entrada\n input_width, // largura entrada\n input_channels, // canais entrada\n output_channels, // canais saída\n kernel_size, // tamanho kernel\n stride, // stride\n padding // padding\n );\n \n // Processar saída\n int predicted_class = get_max_index(output_data, OUTPUT_SIZE);\n printf(\"Classe predita: %d\\n\", predicted_class);\n}",
"documentacao": "https://github.com/espressif/esp-nn",
"repositorio": "https://github.com/espressif/esp-nn",
"cor": "#1ABC9C"
},
"ESP-Matter": {
"nome": "ESP-Matter",
"icone": "🏠",
"nome_completo": "ESP Matter SDK",
"descricao": "SDK para desenvolvimento de dispositivos compatíveis com o padrão Matter",
"linguagem": "C/C++",
"tipo": "Framework Especializado",
"funcao_principal": "Criar dispositivos smart home interoperáveis usando o padrão Matter",
"caracteristicas": [
"Compatibilidade com padrão Matter (ex-Project CHIP)",
"Interoperabilidade entre ecossistemas (Apple, Google, Amazon)",
"Suporte a Thread e Wi-Fi",
"Comissionamento simplificado",
"Segurança robusta (PKI, criptografia)",
"Modelos de dispositivos pré-definidos",
"Integração com ESP-IDF"
],
"casos_uso": [
"Lâmpadas inteligentes",
"Tomadas e interruptores smart",
"Sensores de temperatura e umidade",
"Fechaduras inteligentes",
"Termostatos",
"Dispositivos de controle de cortinas"
],
"exemplo_codigo": "#include \"esp_matter.h\"\n#include \"esp_matter_console.h\"\n\nusing namespace esp_matter;\nusing namespace chip::app::Clusters;\n\nvoid app_main(void)\n{\n // Criar nó Matter\n node_t *node = node::create(&node_config, NULL, NULL);\n \n // Criar endpoint de lâmpada\n endpoint_t *endpoint = on_off_light::create(\n node, \n &endpoint_config, \n ENDPOINT_FLAG_NONE\n );\n \n // Adicionar cluster On/Off\n cluster_t *cluster = cluster::get(endpoint, OnOff::Id);\n \n // Iniciar Matter\n esp_matter::start(NULL);\n \n // Aguardar comissionamento\n printf(\"Dispositivo Matter pronto para comissionamento\\n\");\n}",
"documentacao": "https://docs.espressif.com/projects/esp-matter/",
"repositorio": "https://github.com/espressif/esp-matter",
"cor": "#F39C12"
},
"Arduino": {
"nome": "Arduino",
"icone": "🛠️",
"nome_completo": "Arduino Core for ESP32",
"descricao": "Implementação do framework Arduino para ESP32, facilitando o desenvolvimento",
"linguagem": "C++",
"tipo": "Framework Alternativo",
"funcao_principal": "Desenvolvimento rápido e simplificado usando a API familiar do Arduino",
"caracteristicas": [
"API simples e intuitiva",
"Grande comunidade e bibliotecas",
"IDE Arduino integrada",
"Suporte a Wi-Fi e Bluetooth",
"Compatibilidade com bibliotecas Arduino",
"Ideal para prototipagem rápida",
"Curva de aprendizado suave"
],
"casos_uso": [
"Prototipagem rápida",
"Projetos educacionais",
"Makers e hobistas",
"IoT simples",
"Sensores e atuadores básicos",
"Projetos DIY"
],
"exemplo_codigo": "#include <WiFi.h>\n\nconst char* ssid = \"Sua_Rede\";\nconst char* password = \"Sua_Senha\";\n\nvoid setup() {\n Serial.begin(115200);\n \n // Conectar ao Wi-Fi\n WiFi.begin(ssid, password);\n \n while (WiFi.status() != WL_CONNECTED) {\n delay(500);\n Serial.print(\".\");\n }\n \n Serial.println(\"\");\n Serial.println(\"WiFi conectado\");\n Serial.print(\"Endereço IP: \");\n Serial.println(WiFi.localIP());\n}\n\nvoid loop() {\n // Seu código aqui\n delay(1000);\n}",
"documentacao": "https://docs.espressif.com/projects/arduino-esp32/",
"repositorio": "https://github.com/espressif/arduino-esp32",
"cor": "#00979D"
},
"MicroPython": {
"nome": "MicroPython",
"icone": "🐍",
"nome_completo": "MicroPython for ESP32",
"descricao": "Implementação do Python 3 otimizada para microcontroladores ESP32",
"linguagem": "Python",
"tipo": "Framework Alternativo",
"funcao_principal": "Desenvolvimento em Python para prototipagem rápida e scripting",
"caracteristicas": [
"Sintaxe Python 3",
"REPL interativo",
"Desenvolvimento iterativo",
"Bibliotecas padrão Python",
"Suporte a Wi-Fi e Bluetooth",
"Sistema de arquivos integrado",
"Ideal para educação e prototipagem"
],
"casos_uso": [
"Prototipagem rápida",
"Educação e ensino",
"Scripts de automação",
"IoT experimental",
"Projetos de ciência de dados embarcados",
"Testes e validação"
],
"exemplo_codigo": "import network\nimport time\n\n# Conectar ao Wi-Fi\nwlan = network.WLAN(network.STA_IF)\nwlan.active(True)\nwlan.connect('Sua_Rede', 'Sua_Senha')\n\n# Aguardar conexão\nwhile not wlan.isconnected():\n time.sleep(0.5)\n print('.', end='')\n\nprint('\\nWi-Fi conectado')\nprint('IP:', wlan.ifconfig()[0])\n\n# Exemplo: Ler sensor e enviar dados\nwhile True:\n # Ler sensor\n temperatura = 25.5 # exemplo\n \n print(f'Temperatura: {temperatura}°C')\n time.sleep(1)",
"documentacao": "https://docs.micropython.org/en/latest/esp32/",
"repositorio": "https://github.com/micropython/micropython",
"cor": "#2B2B2B"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 KiB

+266
View File
@@ -0,0 +1,266 @@
{
"ESP32": {
"nome_completo": "ESP32 (Clássico)",
"icone": "🔷",
"descricao": "O modelo original com processador dual-core e ampla gama de periféricos",
"arquitetura": "Xtensa® LX6 dual-core de 32 bits",
"nucleos": "1 (Single-core) ou 2 (Dual-core)",
"frequencia": "Até 240 MHz",
"coprocessador_ulp": "Sim",
"wifi": "IEEE 802.11 b/g/n (2.4 GHz, até 150 Mbps)",
"bluetooth": "Bluetooth v4.2 BR/EDR (Clássico) e BLE (Low Energy)",
"memoria_sram": "520 KB",
"memoria_sram_rtc": "16 KB (dividida em RTC FAST e RTC SLOW)",
"memoria_rom": "448 KB (para boot e funções core)",
"flash_externa": "Até 16 MB via QSPI",
"psram_externa": "Até 8 MB via QSPI (em módulos específicos como WROVER)",
"gpio": "34 (alguns pinos têm restrições)",
"adc": "2x SAR ADC de 12 bits, até 18 canais",
"dac": "2x DAC de 8 bits",
"touch": "10 canais capacitivos",
"uart": "3",
"spi": "4 (SPI, HSPI, VSPI - 2 podem ser usados para Flash/PSRAM)",
"i2c": "2",
"i2s": "2",
"pwm": "LED PWM (até 16 canais), Motor PWM",
"ethernet_mac": "1 (requer PHY externo)",
"can": "1 (CAN 2.0, TWAI®)",
"sdio": "1 (SD/SDIO/MMC Host), 1 (SDIO/SPI Slave)",
"sensor_hall": "1 (interno)",
"sensor_temperatura": "1 (interno, precisão limitada)",
"temperatura_operacao": "-40°C a 125°C",
"temperatura_armazenamento": "-40°C a 150°C",
"datasheet": "https://documentation.espressif.com/esp32_datasheet_en.pdf",
"cor": "#007bff"
},
"ESP32-S2": {
"nome_completo": "ESP32-S2",
"icone": "🔒",
"descricao": "Foco em segurança e baixo consumo, com USB nativo e ADC de 13 bits",
"arquitetura": "Xtensa® LX7 single-core de 32 bits",
"nucleos": "1 (Single-core)",
"frequencia": "Até 240 MHz",
"coprocessador_ulp": "Sim (RISC-V)",
"wifi": "IEEE 802.11 b/g/n (2.4 GHz, até 150 Mbps)",
"bluetooth": "Não",
"memoria_sram": "320 KB",
"memoria_sram_rtc": "16 KB",
"memoria_rom": "128 KB",
"flash_externa": "Até 1 GB via QSPI",
"psram_externa": "Até 1 GB via QSPI/Octal SPI",
"gpio": "43",
"adc": "2x SAR ADC de 13 bits, até 20 canais",
"dac": "2x DAC de 8 bits",
"touch": "14 canais capacitivos",
"uart": "2",
"spi": "4 (SPI0/1 para Flash, SPI2/3 para uso geral)",
"i2c": "2",
"i2s": "1",
"pwm": "LED PWM (até 8 canais)",
"usb": "1 (USB OTG 1.1)",
"lcd": "Interface LCD de 8/16 bits",
"camera": "Interface DVP de 8/16 bits",
"sensor_temperatura": "1 (interno)",
"temperatura_operacao": "-40°C a 85°C",
"temperatura_armazenamento": "-40°C a 150°C",
"datasheet": "https://documentation.espressif.com/esp32-s2_datasheet_en.pdf",
"cor": "#28a745"
},
"ESP32-S3": {
"nome_completo": "ESP32-S3",
"icone": "🤖",
"descricao": "Processador dual-core com aceleradores para IA e processamento de sinal",
"arquitetura": "Xtensa® LX7 dual-core de 32 bits",
"nucleos": "2 (Dual-core)",
"frequencia": "Até 240 MHz",
"coprocessador_ulp": "Sim (RISC-V)",
"aceleradores_ia": "Sim (Vector Instructions para IA)",
"wifi": "IEEE 802.11 b/g/n (2.4 GHz, até 150 Mbps)",
"bluetooth": "Bluetooth 5.0 LE",
"memoria_sram": "512 KB",
"memoria_sram_rtc": "16 KB",
"memoria_rom": "384 KB",
"flash_externa": "Até 1 GB via QSPI/Octal SPI",
"psram_externa": "Até 1 GB via QSPI/Octal SPI",
"gpio": "45",
"adc": "2x SAR ADC de 12 bits, até 20 canais",
"dac": "Não",
"touch": "14 canais capacitivos",
"uart": "3",
"spi": "4 (SPI0/1 para Flash, SPI2/3 para uso geral)",
"i2c": "2",
"i2s": "2",
"pwm": "LED PWM (até 8 canais), Motor PWM (6 canais)",
"usb": "1 (USB OTG 1.1)",
"lcd": "Interface LCD RGB de 8/16 bits",
"camera": "Interface DVP de 8/16 bits",
"sdio": "1 (SD/SDIO/MMC Host)",
"sensor_temperatura": "1 (interno)",
"temperatura_operacao": "-40°C a 85°C",
"temperatura_armazenamento": "-40°C a 150°C",
"datasheet": "https://documentation.espressif.com/esp32-s3_datasheet_en.pdf",
"cor": "#fd7e14"
},
"ESP32-C3": {
"nome_completo": "ESP32-C3",
"icone": "💎",
"descricao": "Processador RISC-V de baixo custo, substituto do ESP8266",
"arquitetura": "RISC-V single-core de 32 bits",
"nucleos": "1 (Single-core)",
"frequencia": "Até 160 MHz",
"wifi": "IEEE 802.11 b/g/n (2.4 GHz, até 150 Mbps)",
"bluetooth": "Bluetooth 5.0 LE",
"memoria_sram": "400 KB",
"memoria_sram_rtc": "8 KB",
"memoria_rom": "384 KB",
"flash_externa": "Até 16 MB via QSPI",
"psram_externa": "Não",
"gpio": "22",
"adc": "2x SAR ADC de 12 bits, até 6 canais",
"dac": "Não",
"touch": "Não",
"uart": "2",
"spi": "3 (SPI0/1 para Flash, SPI2 para uso geral)",
"i2c": "1",
"i2s": "1",
"pwm": "LED PWM (até 6 canais)",
"usb": "1 (USB Serial/JTAG)",
"sensor_temperatura": "1 (interno)",
"temperatura_operacao": "-40°C a 105°C",
"temperatura_armazenamento": "-40°C a 150°C",
"datasheet": "https://documentation.espressif.com/esp32-c3_datasheet_en.pdf",
"cor": "#20c997"
},
"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)",
"frequencia": "Até 240 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",
"memoria_sram_rtc": "16 KB",
"memoria_rom": "320 KB",
"flash_externa": "Até 16 MB via QSPI",
"psram_externa": "Não",
"gpio": "28",
"adc": "1x SAR ADC de 12 bits, até 7 canais",
"dac": "Não",
"touch": "Não",
"uart": "3",
"spi": "3",
"i2c": "2",
"i2s": "1",
"pwm": "LED PWM (até 6 canais), Motor PWM",
"usb": "1 (USB Serial/JTAG)",
"sensor_temperatura": "1 (interno)",
"temperatura_operacao": "-40°C a 85°C",
"temperatura_armazenamento": "-40°C a 150°C",
"datasheet": "https://documentation.espressif.com/esp32-c5_datasheet_en.pdf",
"cor": "#6f42c1"
},
"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)",
"frequencia": "Até 160 MHz",
"wifi": "Wi-Fi 6 (802.11ax) 2.4 GHz",
"bluetooth": "Bluetooth 5.3 LE",
"zigbee_thread": "IEEE 802.15.4 (Zigbee, Thread)",
"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",
"adc": "1x SAR ADC de 12 bits, até 7 canais",
"dac": "Não",
"touch": "Não",
"uart": "3",
"spi": "3",
"i2c": "2",
"i2s": "1",
"pwm": "LED PWM (até 6 canais), Motor PWM",
"usb": "1 (USB Serial/JTAG)",
"sdio": "1 (SD/SDIO/MMC Host)",
"sensor_temperatura": "1 (interno)",
"temperatura_operacao": "-40°C a 105°C",
"temperatura_armazenamento": "-40°C a 150°C",
"datasheet": "https://documentation.espressif.com/esp32-c6_datasheet_en.pdf",
"cor": "#17a2b8"
},
"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 dual-core de 32 bits",
"nucleos": "2 (Dual-core)",
"frequencia": "Até 400 MHz",
"aceleradores_ia": "Sim (Vector Instructions, aceleradores de IA)",
"wifi": "Não (sem conectividade wireless integrada)",
"bluetooth": "Não",
"ethernet": "Sim (Ethernet MAC integrado)",
"memoria_sram": "768 KB",
"memoria_rom": "768 KB",
"flash_externa": "Até 128 MB via QSPI/Octal SPI",
"psram_externa": "Até 32 MB via QSPI/Octal SPI",
"gpio": "54",
"adc": "1x SAR ADC de 12 bits, até 8 canais",
"dac": "Não",
"touch": "Não",
"uart": "5",
"spi": "3",
"i2c": "2",
"i2s": "3",
"pwm": "LED PWM (até 8 canais), Motor PWM (6 canais)",
"usb": "1 (USB OTG 2.0)",
"mipi_csi": "Interface MIPI CSI para câmera",
"mipi_dsi": "Interface MIPI DSI para display",
"lcd": "Interface LCD de 8/16/24 bits",
"camera": "Interface DVP de 8/16 bits",
"sdio": "2 (SD/SDIO/MMC Host)",
"sensor_temperatura": "1 (interno)",
"temperatura_operacao": "-40°C a 85°C",
"temperatura_armazenamento": "-40°C a 150°C",
"datasheet": "https://documentation.espressif.com/esp32-p4_datasheet_en.pdf",
"cor": "#ffc107"
},
"ESP32-H2": {
"nome_completo": "ESP32-H2",
"icone": "🔋",
"descricao": "Focado em ultra-baixo consumo com Bluetooth, 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)",
"matter": "Sim",
"memoria_sram": "320 KB",
"memoria_sram_rtc": "16 KB",
"memoria_rom": "128 KB",
"flash_externa": "Até 16 MB via QSPI",
"psram_externa": "Não",
"gpio": "27",
"adc": "1x SAR ADC de 12 bits, até 5 canais",
"dac": "Não",
"touch": "Não",
"uart": "2",
"spi": "3",
"i2c": "2",
"i2s": "1",
"pwm": "LED PWM (até 6 canais)",
"usb": "1 (USB Serial/JTAG)",
"sensor_temperatura": "1 (interno)",
"temperatura_operacao": "-40°C a 85°C",
"temperatura_armazenamento": "-40°C a 150°C",
"datasheet": "https://documentation.espressif.com/esp32-h2_datasheet_en.pdf",
"cor": "#6c757d"
}
}