feat: add ESP-RainMaker and ESP-Matter frameworks and update existing framework metadata in frameworks.json
This commit is contained in:
1 parent
07dac4f6de
commit
d71dc8df3c
19 files changed
+2456
-280
No files matched your search
@@ -0,0 +1,74 @@
|
|||||||
|
import { paginaMeta, jsonLd } from "@/lib/seo";
|
||||||
|
|
||||||
|
export const metadata = paginaMeta({
|
||||||
|
titulo: "ESP Component Registry & IDF Component Manager · ESPDocs",
|
||||||
|
descricao: "Catálogo oficial e interativo do ESP Component Registry: drivers de displays, LVGL, reconhecimento de voz ESP-SR, RainMaker, BSPs e gerador de idf_component.yml.",
|
||||||
|
caminho: "/componentes",
|
||||||
|
keywords: [
|
||||||
|
"ESP Component Registry",
|
||||||
|
"IDF Component Manager",
|
||||||
|
"idf_component.yml",
|
||||||
|
"idf.py add-dependency",
|
||||||
|
"componentes ESP32",
|
||||||
|
"espressif esp_lvgl_port",
|
||||||
|
"espressif esp_rainmaker",
|
||||||
|
"espressif esp-sr",
|
||||||
|
"bibliotecas ESP-IDF",
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
const faqs = [
|
||||||
|
{
|
||||||
|
pergunta: "O que é o ESP Component Registry e o IDF Component Manager?",
|
||||||
|
resposta: "O ESP Component Registry (components.espressif.com) é o repositório oficial de pacotes modulares da Espressif. O IDF Component Manager é a ferramenta integrada ao ESP-IDF (a partir do v4.4 e padrão no v5.x+) que baixa, compila e resolve versões de dependências automaticamente a partir do manifesto idf_component.yml.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Como adicionar um componente ao meu projeto ESP-IDF?",
|
||||||
|
resposta: "Você pode executar o comando 'idf.py add-dependency \"namespace/componente^versao\"' no terminal do projeto (por exemplo: idf.py add-dependency \"espressif/esp_lvgl_port^2.4.0\") ou editar diretamente o arquivo main/idf_component.yml.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Qual a diferença entre usar o Component Registry e git submodules?",
|
||||||
|
resposta: "O Component Registry elimina a complexidade de gerenciar submódulos Git pesados e versões manuais. Ele oferece versionamento semântico (^ e ~), resolução automática de dependências transitivas e compilação modular sob demanda.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pergunta: "Posso criar e publicar meus próprios componentes?",
|
||||||
|
resposta: "Sim, qualquer desenvolvedor ou empresa pode publicar componentes públicos ou privados no ESP Component Registry utilizando a ferramenta oficial Compote CLI (pip install idf-component-manager).",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export default function ComponentesLayout({ children }) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<script
|
||||||
|
type="application/ld+json"
|
||||||
|
dangerouslySetInnerHTML={{
|
||||||
|
__html: JSON.stringify(
|
||||||
|
jsonLd.trilha([
|
||||||
|
{ nome: "Início", caminho: "/" },
|
||||||
|
{ nome: "ESP Component Registry", caminho: "/componentes" },
|
||||||
|
])
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<script
|
||||||
|
type="application/ld+json"
|
||||||
|
dangerouslySetInnerHTML={{
|
||||||
|
__html: JSON.stringify(jsonLd.perguntas(faqs)),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<script
|
||||||
|
type="application/ld+json"
|
||||||
|
dangerouslySetInnerHTML={{
|
||||||
|
__html: JSON.stringify(
|
||||||
|
jsonLd.aplicacaoWeb({
|
||||||
|
nome: "Hub do ESP Component Registry & Construtor de Manifesto",
|
||||||
|
descricao: "Catálogo curado e gerador de manifesto idf_component.yml para componentes modulares do ESP-IDF.",
|
||||||
|
caminho: "/componentes",
|
||||||
|
})
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
{children}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,644 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { useState, useMemo } from "react";
|
||||||
|
import Header from "@/components/Header";
|
||||||
|
import Footer from "@/components/Footer";
|
||||||
|
import Link from "next/link";
|
||||||
|
import {
|
||||||
|
CATEGORIAS_COMPONENTES,
|
||||||
|
COMPONENTES_REGISTRY,
|
||||||
|
GUIA_COMPONENT_MANAGER
|
||||||
|
} from "@/lib/componentRegistryData";
|
||||||
|
import {
|
||||||
|
Layers,
|
||||||
|
Search,
|
||||||
|
Copy,
|
||||||
|
Check,
|
||||||
|
ExternalLink,
|
||||||
|
Sparkles,
|
||||||
|
Terminal,
|
||||||
|
Code2,
|
||||||
|
Plus,
|
||||||
|
Trash2,
|
||||||
|
Download,
|
||||||
|
Cpu,
|
||||||
|
Box,
|
||||||
|
CheckCircle2,
|
||||||
|
ChevronRight,
|
||||||
|
HelpCircle,
|
||||||
|
ArrowRight,
|
||||||
|
BookOpen,
|
||||||
|
ShieldCheck,
|
||||||
|
Zap,
|
||||||
|
Monitor,
|
||||||
|
Cloud,
|
||||||
|
Brain,
|
||||||
|
Home,
|
||||||
|
CircuitBoard,
|
||||||
|
Wrench
|
||||||
|
} from "lucide-react";
|
||||||
|
|
||||||
|
export default function ComponentRegistryPage() {
|
||||||
|
const [busca, setBusca] = useState("");
|
||||||
|
const [categoriaAtiva, setCategoriaAtiva] = useState("todos");
|
||||||
|
const [chipFiltro, setChipFiltro] = useState("todos");
|
||||||
|
const [copiadoId, setCopiadoId] = useState(null);
|
||||||
|
const [manifestoCopiado, setManifestoCopiado] = useState(false);
|
||||||
|
|
||||||
|
// Componentes selecionados no construtor de idf_component.yml
|
||||||
|
const [componentesSelecionados, setComponentesSelecionados] = useState([
|
||||||
|
"espressif-esp_lvgl_port",
|
||||||
|
"espressif-led_indicator"
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Lista de chips únicos para filtro
|
||||||
|
const chipsDisponiveis = ["todos", "ESP32", "ESP32-S3", "ESP32-C6", "ESP32-P4", "ESP32-H2", "ESP32-C3"];
|
||||||
|
|
||||||
|
// Filtragem dos componentes
|
||||||
|
const componentesFiltrados = useMemo(() => {
|
||||||
|
return COMPONENTES_REGISTRY.filter((comp) => {
|
||||||
|
const matchCategoria = categoriaAtiva === "todos" || comp.categoria === categoriaAtiva;
|
||||||
|
const matchChip = chipFiltro === "todos" || (comp.chips && comp.chips.includes(chipFiltro));
|
||||||
|
const matchBusca =
|
||||||
|
busca.trim() === "" ||
|
||||||
|
comp.name.toLowerCase().includes(busca.toLowerCase()) ||
|
||||||
|
comp.namespace.toLowerCase().includes(busca.toLowerCase()) ||
|
||||||
|
comp.titulo.toLowerCase().includes(busca.toLowerCase()) ||
|
||||||
|
comp.descricao.toLowerCase().includes(busca.toLowerCase()) ||
|
||||||
|
comp.tags.some((t) => t.toLowerCase().includes(busca.toLowerCase()));
|
||||||
|
|
||||||
|
return matchCategoria && matchChip && matchBusca;
|
||||||
|
});
|
||||||
|
}, [busca, categoriaAtiva, chipFiltro]);
|
||||||
|
|
||||||
|
// Manipuladores de cópia
|
||||||
|
const copiarComando = (id, comando) => {
|
||||||
|
navigator.clipboard.writeText(comando);
|
||||||
|
setCopiadoId(id);
|
||||||
|
setTimeout(() => setCopiadoId(null), 2000);
|
||||||
|
};
|
||||||
|
|
||||||
|
const toggleSelecaoManifesto = (id) => {
|
||||||
|
setComponentesSelecionados((prev) =>
|
||||||
|
prev.includes(id) ? prev.filter((item) => item !== id) : [...prev, id]
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Geração dinâmica do manifesto YAML
|
||||||
|
const manifestoYaml = useMemo(() => {
|
||||||
|
const selecionados = COMPONENTES_REGISTRY.filter((c) =>
|
||||||
|
componentesSelecionados.includes(c.id)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (selecionados.length === 0) {
|
||||||
|
return `# Nenhum componente selecionado.\n# Clique em "+ Adicionar ao Manifesto" nos cards abaixo.`;
|
||||||
|
}
|
||||||
|
|
||||||
|
let yaml = `# main/idf_component.yml\n# Gerado via ESPDocs Component Hub (https://espdocs.cienciaembarcada.com.br/componentes)\n\ndependencies:\n`;
|
||||||
|
selecionados.forEach((c) => {
|
||||||
|
yaml += ` ${c.namespace}/${c.name}: "${c.versao}"\n`;
|
||||||
|
});
|
||||||
|
return yaml;
|
||||||
|
}, [componentesSelecionados]);
|
||||||
|
|
||||||
|
const copiarManifesto = () => {
|
||||||
|
navigator.clipboard.writeText(manifestoYaml);
|
||||||
|
setManifestoCopiado(true);
|
||||||
|
setTimeout(() => setManifestoCopiado(false), 2000);
|
||||||
|
};
|
||||||
|
|
||||||
|
const baixarManifesto = () => {
|
||||||
|
const blob = new Blob([manifestoYaml], { type: "text/yaml;charset=utf-8" });
|
||||||
|
const url = URL.createObjectURL(blob);
|
||||||
|
const link = document.createElement("a");
|
||||||
|
link.href = url;
|
||||||
|
link.download = "idf_component.yml";
|
||||||
|
document.body.appendChild(link);
|
||||||
|
link.click();
|
||||||
|
document.body.removeChild(link);
|
||||||
|
URL.revokeObjectURL(url);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Mapeamento de ícones de categoria
|
||||||
|
const renderIconeCategoria = (id) => {
|
||||||
|
switch (id) {
|
||||||
|
case "ui_display":
|
||||||
|
return <Monitor className="w-4 h-4" />;
|
||||||
|
case "cloud_conectividade":
|
||||||
|
return <Cloud className="w-4 h-4" />;
|
||||||
|
case "audio_voz_ia":
|
||||||
|
return <Brain className="w-4 h-4" />;
|
||||||
|
case "smart_home_mesh":
|
||||||
|
return <Home className="w-4 h-4" />;
|
||||||
|
case "drivers_perifericos":
|
||||||
|
return <Cpu className="w-4 h-4" />;
|
||||||
|
case "bsp_placas":
|
||||||
|
return <CircuitBoard className="w-4 h-4" />;
|
||||||
|
case "sistema_utilitarios":
|
||||||
|
return <Wrench className="w-4 h-4" />;
|
||||||
|
default:
|
||||||
|
return <Layers className="w-4 h-4" />;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="bg-gradient-to-br from-slate-100 via-slate-50 to-purple-100/40 dark:from-slate-950 dark:via-slate-950 dark:to-slate-900 min-h-screen text-slate-900 dark:text-slate-100 transition-colors duration-300">
|
||||||
|
<Header />
|
||||||
|
|
||||||
|
<main id="conteudo" className="px-4 md:px-6 pt-12 md:pt-16 pb-24 max-w-7xl mx-auto space-y-12">
|
||||||
|
{/* Top Hero Section */}
|
||||||
|
<section className="text-center select-none relative">
|
||||||
|
<div className="inline-flex items-center gap-2 bg-white/80 dark:bg-slate-900/60 backdrop-blur-md px-4 py-2 rounded-full mb-6 border border-slate-300 dark:border-slate-800/80 shadow-xs">
|
||||||
|
<Box className="w-4 h-4 text-purple-500" />
|
||||||
|
<span className="text-xs font-bold text-slate-700 dark:text-slate-300 uppercase tracking-wider">
|
||||||
|
ESP-IDF Component Manager
|
||||||
|
</span>
|
||||||
|
<span className="bg-purple-100 dark:bg-purple-950/80 text-purple-700 dark:text-purple-300 text-[10px] font-extrabold px-2 py-0.5 rounded-full">
|
||||||
|
Oficial
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h1 className="text-4xl md:text-6xl font-display font-extrabold bg-gradient-to-r from-blue-600 via-purple-600 to-pink-600 dark:from-blue-400 dark:via-purple-400 dark:to-pink-400 bg-clip-text text-transparent mb-6 pb-2 pt-1 leading-tight md:leading-[1.18] tracking-tight">
|
||||||
|
ESP Component Registry
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<p className="text-sm md:text-base text-slate-600 dark:text-slate-350 max-w-3xl mx-auto leading-relaxed font-semibold">
|
||||||
|
O catálogo oficial de pacotes reutilizáveis da Espressif para o ESP-IDF.
|
||||||
|
Adicione drivers de displays, reconhecimento de voz, pilhas industriais e bibliotecas
|
||||||
|
com comandos de um clique e geração de manifesto declarativo.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div className="flex flex-wrap items-center justify-center gap-3 mt-6">
|
||||||
|
<a
|
||||||
|
href="https://components.espressif.com"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="inline-flex items-center gap-2 bg-gradient-to-r from-purple-600 to-indigo-600 hover:from-purple-500 hover:to-indigo-500 text-white text-xs font-bold px-4 py-2.5 rounded-xl shadow-md transition-all active:scale-95"
|
||||||
|
>
|
||||||
|
<span>Acessar Registry Oficial</span>
|
||||||
|
<ExternalLink className="w-3.5 h-3.5" />
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
href="#manifesto-builder"
|
||||||
|
className="inline-flex items-center gap-2 bg-white dark:bg-slate-900 border border-slate-300 dark:border-slate-800 text-slate-700 dark:text-slate-300 hover:bg-slate-100 dark:hover:bg-slate-800 text-xs font-bold px-4 py-2.5 rounded-xl shadow-xs transition-all active:scale-95"
|
||||||
|
>
|
||||||
|
<Code2 className="w-3.5 h-3.5 text-purple-500" />
|
||||||
|
<span>Gerador de idf_component.yml</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{/* Interactive Search & Filter Bar */}
|
||||||
|
<section className="bg-white dark:bg-slate-900/60 backdrop-blur-xl rounded-3xl p-6 border border-slate-300 dark:border-slate-800/80 shadow-xl space-y-5">
|
||||||
|
<div className="flex flex-col md:flex-row gap-4 items-center justify-between">
|
||||||
|
{/* Search Input */}
|
||||||
|
<div className="relative w-full md:flex-1">
|
||||||
|
<Search className="w-4 h-4 absolute left-3.5 top-1/2 -translate-y-1/2 text-slate-400" />
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
value={busca}
|
||||||
|
onChange={(e) => setBusca(e.target.value)}
|
||||||
|
placeholder="Buscar componentes por nome, namespace, funcionalidade ou tags (ex: lvgl, rainmaker, ws2812)..."
|
||||||
|
className="w-full pl-10 pr-4 py-2.5 bg-slate-50 dark:bg-slate-950/70 border border-slate-250 dark:border-slate-800 rounded-2xl text-xs md:text-sm font-semibold text-slate-800 dark:text-slate-100 placeholder:text-slate-400 focus:outline-hidden focus:ring-2 focus:ring-purple-500 transition-all"
|
||||||
|
/>
|
||||||
|
{busca && (
|
||||||
|
<button
|
||||||
|
onClick={() => setBusca("")}
|
||||||
|
className="absolute right-3 top-1/2 -translate-y-1/2 text-xs font-bold text-slate-400 hover:text-slate-600 dark:hover:text-slate-200"
|
||||||
|
>
|
||||||
|
Limpar
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Chip Filter */}
|
||||||
|
<div className="flex items-center gap-1.5 w-full md:w-auto overflow-x-auto pb-1 md:pb-0">
|
||||||
|
<span className="text-[11px] font-bold text-slate-500 uppercase tracking-wider shrink-0 mr-1">
|
||||||
|
SoC:
|
||||||
|
</span>
|
||||||
|
{chipsDisponiveis.map((chip) => (
|
||||||
|
<button
|
||||||
|
key={chip}
|
||||||
|
onClick={() => setChipFiltro(chip)}
|
||||||
|
className={`px-3 py-1.5 rounded-xl text-xs font-bold shrink-0 transition-all cursor-pointer ${
|
||||||
|
chipFiltro === chip
|
||||||
|
? "bg-purple-600 text-white shadow-xs"
|
||||||
|
: "bg-slate-100 dark:bg-slate-800/80 text-slate-650 dark:text-slate-350 hover:bg-slate-200 dark:hover:bg-slate-700"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{chip === "todos" ? "Todos SoCs" : chip}
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Category Tabs */}
|
||||||
|
<div className="flex items-center gap-2 overflow-x-auto pb-2 border-t border-slate-200 dark:border-slate-800/60 pt-4">
|
||||||
|
{CATEGORIAS_COMPONENTES.map((cat) => {
|
||||||
|
const ativa = categoriaAtiva === cat.id;
|
||||||
|
const contagem =
|
||||||
|
cat.id === "todos"
|
||||||
|
? COMPONENTES_REGISTRY.length
|
||||||
|
: COMPONENTES_REGISTRY.filter((c) => c.categoria === cat.id).length;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
key={cat.id}
|
||||||
|
onClick={() => setCategoriaAtiva(cat.id)}
|
||||||
|
className={`inline-flex items-center gap-2 px-3.5 py-2 rounded-xl text-xs font-bold shrink-0 transition-all cursor-pointer ${
|
||||||
|
ativa
|
||||||
|
? "bg-purple-50 dark:bg-purple-950/60 text-purple-600 dark:text-purple-400 border border-purple-200 dark:border-purple-800/60 shadow-xs"
|
||||||
|
: "text-slate-600 dark:text-slate-400 hover:bg-slate-100 dark:hover:bg-slate-800/60"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{renderIconeCategoria(cat.id)}
|
||||||
|
<span>{cat.nome}</span>
|
||||||
|
<span
|
||||||
|
className={`text-[10px] px-1.5 py-0.2 rounded-full ${
|
||||||
|
ativa
|
||||||
|
? "bg-purple-200 dark:bg-purple-900 text-purple-800 dark:text-purple-200"
|
||||||
|
: "bg-slate-200 dark:bg-slate-800 text-slate-600 dark:text-slate-400"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{contagem}
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{/* Components Grid */}
|
||||||
|
<section className="space-y-4">
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<h2 className="text-lg font-display font-extrabold text-slate-850 dark:text-slate-100 flex items-center gap-2">
|
||||||
|
<Sparkles className="w-5 h-5 text-purple-500" />
|
||||||
|
<span>Componentes Disponíveis ({componentesFiltrados.length})</span>
|
||||||
|
</h2>
|
||||||
|
<span className="text-xs text-slate-500 font-semibold">
|
||||||
|
Clique em um comando para copiar para o terminal
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{componentesFiltrados.length === 0 ? (
|
||||||
|
<div className="text-center py-16 bg-white dark:bg-slate-900/40 rounded-3xl border border-slate-300 dark:border-slate-800 p-8">
|
||||||
|
<Box className="w-12 h-12 text-slate-400 mx-auto mb-3 opacity-60" />
|
||||||
|
<p className="text-base font-bold text-slate-750 dark:text-slate-200">
|
||||||
|
Nenhum componente encontrado para esses filtros.
|
||||||
|
</p>
|
||||||
|
<p className="text-xs text-slate-500 mt-1">
|
||||||
|
Tente buscar por termos mais genéricos ou resetar a categoria.
|
||||||
|
</p>
|
||||||
|
<button
|
||||||
|
onClick={() => {
|
||||||
|
setBusca("");
|
||||||
|
setCategoriaAtiva("todos");
|
||||||
|
setChipFiltro("todos");
|
||||||
|
}}
|
||||||
|
className="mt-4 px-4 py-2 bg-purple-600 text-white rounded-xl text-xs font-bold"
|
||||||
|
>
|
||||||
|
Limpar Todos os Filtros
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||||
|
{componentesFiltrados.map((comp) => {
|
||||||
|
const selecionado = componentesSelecionados.includes(comp.id);
|
||||||
|
const cliCmd = `idf.py add-dependency "${comp.namespace}/${comp.name}${comp.versao}"`;
|
||||||
|
const foiCopiado = copiadoId === comp.id;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
key={comp.id}
|
||||||
|
className={`bg-white dark:bg-slate-900/45 backdrop-blur-xl border rounded-3xl shadow-lg hover:shadow-2xl transition-all duration-300 flex flex-col justify-between overflow-hidden relative group ${
|
||||||
|
selecionado
|
||||||
|
? "border-purple-500/80 ring-2 ring-purple-500/20"
|
||||||
|
: "border-slate-300 dark:border-slate-800/80 hover:-translate-y-1"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{/* Top Header Card */}
|
||||||
|
<div className="p-6 pb-4 border-b border-slate-150 dark:border-slate-850/40">
|
||||||
|
<div className="flex items-start justify-between gap-3 mb-2">
|
||||||
|
<div>
|
||||||
|
<div className="flex items-center gap-1.5 mb-1">
|
||||||
|
<span className="text-[10px] font-extrabold text-slate-400 uppercase tracking-wider">
|
||||||
|
{comp.namespace}/
|
||||||
|
</span>
|
||||||
|
{comp.oficial && (
|
||||||
|
<span className="inline-flex items-center gap-1 bg-emerald-100 dark:bg-emerald-950/60 text-emerald-700 dark:text-emerald-300 text-[9px] font-extrabold px-2 py-0.2 rounded-full border border-emerald-300 dark:border-emerald-800/60">
|
||||||
|
<ShieldCheck className="w-3 h-3" />
|
||||||
|
Oficial
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<h3 className="text-xl font-display font-extrabold text-slate-850 dark:text-slate-100 group-hover:text-purple-600 dark:group-hover:text-purple-400 transition-colors">
|
||||||
|
{comp.name}
|
||||||
|
</h3>
|
||||||
|
<p className="text-xs font-semibold text-purple-600 dark:text-purple-400">
|
||||||
|
{comp.titulo}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<span className="px-2.5 py-1 rounded-lg text-[10px] font-mono font-bold bg-slate-100 dark:bg-slate-800 text-slate-700 dark:text-slate-300 border border-slate-200 dark:border-slate-700 shrink-0">
|
||||||
|
{comp.versao}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p className="text-xs text-slate-500 dark:text-slate-350 leading-relaxed mt-2.5 line-clamp-3">
|
||||||
|
{comp.descricao}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{/* Tags */}
|
||||||
|
<div className="flex flex-wrap gap-1.5 mt-3.5">
|
||||||
|
{comp.tags.map((tag) => (
|
||||||
|
<span
|
||||||
|
key={tag}
|
||||||
|
className="text-[9px] font-bold bg-slate-100 dark:bg-slate-950/60 text-slate-600 dark:text-slate-400 px-2 py-0.5 rounded-md border border-slate-250 dark:border-slate-800"
|
||||||
|
>
|
||||||
|
{tag}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Interactive CLI Action Box */}
|
||||||
|
<div className="p-6 py-4 bg-slate-50/50 dark:bg-slate-950/40 space-y-3">
|
||||||
|
<div>
|
||||||
|
<div className="flex items-center justify-between text-[10px] font-bold text-slate-400 uppercase tracking-wider mb-1">
|
||||||
|
<span className="flex items-center gap-1">
|
||||||
|
<Terminal className="w-3 h-3 text-purple-500" />
|
||||||
|
Comando CLI
|
||||||
|
</span>
|
||||||
|
{foiCopiado && (
|
||||||
|
<span className="text-emerald-500 font-bold flex items-center gap-0.5">
|
||||||
|
<Check className="w-3 h-3" /> Copiado!
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
onClick={() => copiarComando(comp.id, cliCmd)}
|
||||||
|
className="w-full text-left bg-slate-900 text-slate-100 p-2.5 rounded-xl font-mono text-[11px] hover:bg-slate-800 border border-slate-800 flex items-center justify-between group/cmd transition-colors cursor-pointer"
|
||||||
|
title="Clique para copiar comando"
|
||||||
|
>
|
||||||
|
<span className="truncate pr-2">{cliCmd}</span>
|
||||||
|
<Copy className="w-3.5 h-3.5 text-slate-400 group-hover/cmd:text-white shrink-0" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Compatible Chips */}
|
||||||
|
<div>
|
||||||
|
<span className="text-[10px] font-bold text-slate-400 uppercase tracking-wider block mb-1">
|
||||||
|
SoCs Compatíveis:
|
||||||
|
</span>
|
||||||
|
<div className="flex flex-wrap gap-1">
|
||||||
|
{comp.chips.map((chip) => (
|
||||||
|
<span
|
||||||
|
key={chip}
|
||||||
|
className="text-[9px] font-semibold text-slate-650 dark:text-slate-350 bg-slate-200/60 dark:bg-slate-800 px-1.5 py-0.2 rounded"
|
||||||
|
>
|
||||||
|
{chip}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Bottom Actions */}
|
||||||
|
<div className="p-4 px-6 border-t border-slate-150 dark:border-slate-850/40 flex items-center justify-between text-xs font-bold">
|
||||||
|
<button
|
||||||
|
onClick={() => toggleSelecaoManifesto(comp.id)}
|
||||||
|
className={`inline-flex items-center gap-1.5 px-3 py-1.5 rounded-xl transition-all cursor-pointer ${
|
||||||
|
selecionado
|
||||||
|
? "bg-purple-600 text-white shadow-xs"
|
||||||
|
: "bg-purple-50 dark:bg-purple-950/40 text-purple-600 dark:text-purple-400 border border-purple-200 dark:border-purple-800/40 hover:bg-purple-100"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{selecionado ? (
|
||||||
|
<>
|
||||||
|
<CheckCircle2 className="w-3.5 h-3.5" />
|
||||||
|
<span>No Manifesto</span>
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<Plus className="w-3.5 h-3.5" />
|
||||||
|
<span>Adicionar ao Manifesto</span>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<a
|
||||||
|
href={comp.urlRegistry}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="text-slate-400 hover:text-purple-600 dark:hover:text-purple-400 transition-colors p-1"
|
||||||
|
title="Ver página oficial no ESP Component Registry"
|
||||||
|
>
|
||||||
|
<ExternalLink className="w-4 h-4" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{/* Interactive Manifest Builder Section */}
|
||||||
|
<section
|
||||||
|
id="manifesto-builder"
|
||||||
|
className="bg-white dark:bg-slate-900/60 backdrop-blur-xl rounded-3xl p-6 md:p-8 border border-purple-300 dark:border-purple-800/60 shadow-2xl space-y-6"
|
||||||
|
>
|
||||||
|
<div className="flex flex-col md:flex-row items-start md:items-center justify-between gap-4 pb-4 border-b border-slate-250 dark:border-slate-800">
|
||||||
|
<div>
|
||||||
|
<div className="inline-flex items-center gap-2 px-3 py-1 bg-purple-100 dark:bg-purple-950/60 text-purple-700 dark:text-purple-300 text-xs font-bold rounded-full mb-2">
|
||||||
|
<Code2 className="w-3.5 h-3.5" />
|
||||||
|
<span>Gerador de Manifesto Declarativo</span>
|
||||||
|
</div>
|
||||||
|
<h2 className="text-2xl font-display font-extrabold text-slate-850 dark:text-slate-100">
|
||||||
|
Construtor de `idf_component.yml`
|
||||||
|
</h2>
|
||||||
|
<p className="text-xs text-slate-500 dark:text-slate-400 mt-1 font-semibold">
|
||||||
|
Adicione este arquivo na pasta <code>main/</code> do seu projeto ESP-IDF para
|
||||||
|
instalar todas as bibliotecas automaticamente na compilação.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex items-center gap-2.5 w-full md:w-auto">
|
||||||
|
<button
|
||||||
|
onClick={copiarManifesto}
|
||||||
|
className="flex-1 md:flex-none inline-flex items-center justify-center gap-1.5 bg-gradient-to-r from-purple-600 to-indigo-600 text-white px-4 py-2.5 rounded-xl text-xs font-bold hover:opacity-90 shadow-md transition-all active:scale-95 cursor-pointer"
|
||||||
|
>
|
||||||
|
{manifestoCopiado ? (
|
||||||
|
<>
|
||||||
|
<Check className="w-4 h-4" />
|
||||||
|
<span>Manifesto Copiado!</span>
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<Copy className="w-4 h-4" />
|
||||||
|
<span>Copiar YAML</span>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button
|
||||||
|
onClick={baixarManifesto}
|
||||||
|
className="inline-flex items-center justify-center gap-1.5 bg-slate-100 dark:bg-slate-800 hover:bg-slate-200 dark:hover:bg-slate-700 text-slate-700 dark:text-slate-200 px-4 py-2.5 rounded-xl text-xs font-bold transition-all active:scale-95 cursor-pointer"
|
||||||
|
title="Baixar arquivo idf_component.yml pronto"
|
||||||
|
>
|
||||||
|
<Download className="w-4 h-4" />
|
||||||
|
<span className="hidden sm:inline">Baixar .yml</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
{componentesSelecionados.length > 0 && (
|
||||||
|
<button
|
||||||
|
onClick={() => setComponentesSelecionados([])}
|
||||||
|
className="p-2.5 text-slate-400 hover:text-rose-500 rounded-xl hover:bg-rose-50 dark:hover:bg-rose-950/30 transition-colors"
|
||||||
|
title="Limpar seleção"
|
||||||
|
>
|
||||||
|
<Trash2 className="w-4 h-4" />
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* YAML Output Terminal */}
|
||||||
|
<div className="relative">
|
||||||
|
<div className="bg-slate-950 text-slate-200 rounded-2xl p-4 md:p-6 font-mono text-xs md:text-sm overflow-x-auto border border-slate-800 shadow-inner">
|
||||||
|
<pre>{manifestoYaml}</pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Selected components badges */}
|
||||||
|
<div className="flex flex-wrap items-center gap-2 pt-2">
|
||||||
|
<span className="text-xs font-bold text-slate-500 uppercase tracking-wider mr-2">
|
||||||
|
Componentes Inclusos ({componentesSelecionados.length}):
|
||||||
|
</span>
|
||||||
|
{componentesSelecionados.map((id) => {
|
||||||
|
const c = COMPONENTES_REGISTRY.find((item) => item.id === id);
|
||||||
|
if (!c) return null;
|
||||||
|
return (
|
||||||
|
<span
|
||||||
|
key={id}
|
||||||
|
className="inline-flex items-center gap-1.5 bg-purple-50 dark:bg-purple-950/60 text-purple-700 dark:text-purple-300 border border-purple-300 dark:border-purple-800 px-3 py-1 rounded-xl text-xs font-bold"
|
||||||
|
>
|
||||||
|
<span>{c.name}</span>
|
||||||
|
<button
|
||||||
|
onClick={() => toggleSelecaoManifesto(id)}
|
||||||
|
className="hover:text-rose-500 ml-1 cursor-pointer"
|
||||||
|
title="Remover"
|
||||||
|
>
|
||||||
|
×
|
||||||
|
</button>
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{/* Educational Guide: O que é o Component Manager */}
|
||||||
|
<section className="bg-white dark:bg-slate-900/40 backdrop-blur-xl rounded-3xl p-6 md:p-8 border border-slate-300 dark:border-slate-800 shadow-xl space-y-8 select-none">
|
||||||
|
<div>
|
||||||
|
<div className="flex items-center gap-3 mb-2">
|
||||||
|
<div className="p-2.5 rounded-xl bg-purple-50 dark:bg-purple-950/50 text-purple-600 dark:text-purple-400">
|
||||||
|
<BookOpen className="w-5 h-5" />
|
||||||
|
</div>
|
||||||
|
<h2 className="text-2xl font-display font-extrabold text-slate-850 dark:text-slate-100">
|
||||||
|
{GUIA_COMPONENT_MANAGER.titulo}
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
<p className="text-xs md:text-sm text-slate-600 dark:text-slate-350 leading-relaxed font-semibold max-w-4xl">
|
||||||
|
{GUIA_COMPONENT_MANAGER.resumo}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Vantagens Grid */}
|
||||||
|
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-4">
|
||||||
|
{GUIA_COMPONENT_MANAGER.vantagens.map((v, i) => (
|
||||||
|
<div
|
||||||
|
key={i}
|
||||||
|
className="bg-slate-50/70 dark:bg-slate-950/40 p-5 rounded-2xl border border-slate-200 dark:border-slate-800/80 space-y-2"
|
||||||
|
>
|
||||||
|
<div className="w-8 h-8 rounded-xl bg-purple-100 dark:bg-purple-900/40 text-purple-600 dark:text-purple-400 flex items-center justify-center text-xs font-extrabold">
|
||||||
|
0{i + 1}
|
||||||
|
</div>
|
||||||
|
<h3 className="text-sm font-bold text-slate-850 dark:text-slate-100">{v.titulo}</h3>
|
||||||
|
<p className="text-xs text-slate-500 dark:text-slate-400 leading-relaxed">
|
||||||
|
{v.descricao}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Comandos Essenciais da CLI */}
|
||||||
|
<div className="space-y-3">
|
||||||
|
<h3 className="text-base font-display font-extrabold text-slate-850 dark:text-slate-100 flex items-center gap-2">
|
||||||
|
<Terminal className="w-4 h-4 text-purple-500" />
|
||||||
|
<span>Comandos Essenciais no Terminal</span>
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<div className="space-y-3">
|
||||||
|
{GUIA_COMPONENT_MANAGER.comandosCli.map((cmd, i) => (
|
||||||
|
<div
|
||||||
|
key={i}
|
||||||
|
className="bg-slate-900 text-slate-100 p-4 rounded-2xl border border-slate-800 flex flex-col md:flex-row md:items-center justify-between gap-3 font-mono text-xs"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<span className="text-purple-400 font-bold">$ {cmd.exemplo}</span>
|
||||||
|
<p className="text-[11px] text-slate-400 font-sans mt-1">
|
||||||
|
{cmd.explicacao}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
onClick={() => copiarComando(`cmd-${i}`, cmd.exemplo)}
|
||||||
|
className="self-start md:self-auto inline-flex items-center gap-1 bg-slate-800 hover:bg-slate-700 px-3 py-1.5 rounded-lg text-[11px] font-bold text-slate-200 transition-colors shrink-0"
|
||||||
|
>
|
||||||
|
{copiadoId === `cmd-${i}` ? (
|
||||||
|
<>
|
||||||
|
<Check className="w-3.5 h-3.5 text-emerald-400" />
|
||||||
|
<span>Copiado</span>
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<Copy className="w-3.5 h-3.5" />
|
||||||
|
<span>Copiar</span>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Versioning Semantics Callout */}
|
||||||
|
<div className="bg-purple-50 dark:bg-purple-950/30 rounded-2xl p-5 border border-purple-200 dark:border-purple-800/40 text-xs space-y-2">
|
||||||
|
<h4 className="font-bold text-purple-900 dark:text-purple-300 flex items-center gap-1.5">
|
||||||
|
<HelpCircle className="w-4 h-4 text-purple-600 dark:text-purple-400" />
|
||||||
|
<span>Regras de Versionamento Semântico no ESP-IDF</span>
|
||||||
|
</h4>
|
||||||
|
<ul className="list-disc list-inside space-y-1 text-slate-750 dark:text-slate-350">
|
||||||
|
<li>
|
||||||
|
<code>^1.2.0</code>: Permite atualizações menores e correções (ex: 1.2.1, 1.3.0),
|
||||||
|
mas bloqueia grandes mudanças de API (2.0.0). <strong>(Recomendado)</strong>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<code>~1.2.0</code>: Permite apenas correções de bugs (ex: 1.2.1, 1.2.5), travando
|
||||||
|
na mesma versão menor.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<code>1.2.0</code>: Trava na versão exata indicada, sem receber atualizações.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<code>*</code>: Aceita qualquer versão disponível (não recomendado para produção).
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<Footer />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -526,7 +526,11 @@ export default function DiagnosticoPage() {
|
|||||||
const estaAberto = cardAberto === erro.id;
|
const estaAberto = cardAberto === erro.id;
|
||||||
const lang = linguagemCodigo[erro.id] || "arduino";
|
const lang = linguagemCodigo[erro.id] || "arduino";
|
||||||
const codigoAtual =
|
const codigoAtual =
|
||||||
lang === "arduino" ? erro.codigoArduino : erro.codigoEspIdf;
|
lang === "arduino"
|
||||||
|
? erro.codigoArduino
|
||||||
|
: lang === "espidf"
|
||||||
|
? erro.codigoEspIdf
|
||||||
|
: erro.codigoMicroPython || "# Exemplo não aplicável";
|
||||||
|
|
||||||
const catInfo = categoriasDiagnostico.find(
|
const catInfo = categoriasDiagnostico.find(
|
||||||
(c) => c.id === erro.categoria
|
(c) => c.id === erro.categoria
|
||||||
@@ -703,6 +707,17 @@ export default function DiagnosticoPage() {
|
|||||||
>
|
>
|
||||||
ESP-IDF (C)
|
ESP-IDF (C)
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() => setLang(erro.id, "micropython")}
|
||||||
|
className={`text-xs px-3 py-1 rounded-lg font-bold transition-all cursor-pointer ${
|
||||||
|
lang === "micropython"
|
||||||
|
? "bg-white dark:bg-slate-900 text-amber-600 dark:text-amber-400 shadow-xs"
|
||||||
|
: "text-slate-600 dark:text-slate-400 hover:text-slate-900"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
MicroPython
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
|
|||||||
@@ -17,7 +17,11 @@ import {
|
|||||||
FileText,
|
FileText,
|
||||||
Sliders,
|
Sliders,
|
||||||
Award,
|
Award,
|
||||||
Target
|
Target,
|
||||||
|
Box,
|
||||||
|
Sparkles,
|
||||||
|
ExternalLink,
|
||||||
|
ArrowRight
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
|
|
||||||
export default async function FrameworkDetail({ params }) {
|
export default async function FrameworkDetail({ params }) {
|
||||||
@@ -30,6 +34,7 @@ export default async function FrameworkDetail({ params }) {
|
|||||||
|
|
||||||
const features = framework.caracteristicas || [];
|
const features = framework.caracteristicas || [];
|
||||||
const useCases = framework.casos_uso || [];
|
const useCases = framework.casos_uso || [];
|
||||||
|
const isEspIdf = key === "ESP-IDF";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="bg-gradient-to-br from-slate-100 via-slate-50 to-purple-100/40 dark:from-slate-950 dark:via-slate-950 dark:to-slate-900 min-h-screen text-slate-900 dark:text-slate-100 transition-colors duration-300">
|
<div className="bg-gradient-to-br from-slate-100 via-slate-50 to-purple-100/40 dark:from-slate-950 dark:via-slate-950 dark:to-slate-900 min-h-screen text-slate-900 dark:text-slate-100 transition-colors duration-300">
|
||||||
@@ -51,7 +56,7 @@ export default async function FrameworkDetail({ params }) {
|
|||||||
|
|
||||||
<Header />
|
<Header />
|
||||||
|
|
||||||
<main className="px-6 pt-16 pb-24 max-w-7xl mx-auto">
|
<main className="px-4 md:px-6 pt-12 md:pt-16 pb-24 max-w-7xl mx-auto">
|
||||||
{/* Back navigation link */}
|
{/* Back navigation link */}
|
||||||
<div className="mb-8">
|
<div className="mb-8">
|
||||||
<Link
|
<Link
|
||||||
@@ -112,7 +117,7 @@ export default async function FrameworkDetail({ params }) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p className="text-sm text-slate-500 dark:text-slate-200 mt-6 leading-relaxed max-w-4xl font-semibold">
|
<p className="text-sm text-slate-600 dark:text-slate-200 mt-6 leading-relaxed max-w-4xl font-semibold">
|
||||||
{framework.descricao}
|
{framework.descricao}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -129,7 +134,7 @@ export default async function FrameworkDetail({ params }) {
|
|||||||
<span>LINGUAGEM DE DESENVOLVIMENTO</span>
|
<span>LINGUAGEM DE DESENVOLVIMENTO</span>
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-2xl font-extrabold text-slate-800 dark:text-slate-100">{framework.linguagem}</p>
|
<p className="text-2xl font-extrabold text-slate-800 dark:text-slate-100">{framework.linguagem}</p>
|
||||||
<p className="text-xs text-slate-400 mt-1">Sintaxe principal do ecossistema</p>
|
<p className="text-xs text-slate-400 mt-1">Sintaxe e ecossistema</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
@@ -233,9 +238,39 @@ export default async function FrameworkDetail({ params }) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Coding examples container (renders only if framework has examples defined) */}
|
{/* Special Section: ESP Component Registry Callout for ESP-IDF */}
|
||||||
{framework.exemplos && (
|
{isEspIdf && (
|
||||||
<div className="mt-12">
|
<div className="bg-gradient-to-r from-purple-900/90 to-indigo-900/90 rounded-3xl p-6 md:p-8 text-white shadow-2xl border border-purple-500/40 mb-12 relative overflow-hidden">
|
||||||
|
<div className="flex flex-col lg:flex-row items-start lg:items-center justify-between gap-6 relative z-10">
|
||||||
|
<div className="space-y-2 max-w-2xl">
|
||||||
|
<div className="inline-flex items-center gap-1.5 px-3 py-1 rounded-full bg-purple-500/20 border border-purple-400/30 text-purple-300 text-xs font-bold">
|
||||||
|
<Box className="w-3.5 h-3.5" />
|
||||||
|
<span>Arquitetura Moderna ESP-IDF</span>
|
||||||
|
</div>
|
||||||
|
<h3 className="text-2xl font-display font-extrabold text-white">
|
||||||
|
Gerenciamento Modular com ESP Component Registry
|
||||||
|
</h3>
|
||||||
|
<p className="text-xs md:text-sm text-slate-200 leading-relaxed font-medium">
|
||||||
|
Nos projetos ESP-IDF v4.4+ e v5.x+, as bibliotecas não precisam mais ser adicionadas como submódulos Git.
|
||||||
|
Utilize o <code>idf_component.yml</code> e o comando <code>idf.py add-dependency</code> para baixar automaticamente drivers de displays (LVGL), pilhas industriais (Modbus), RainMaker e mais.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Link
|
||||||
|
href="/componentes"
|
||||||
|
className="inline-flex items-center gap-2 bg-white text-purple-900 hover:bg-slate-100 font-extrabold text-xs uppercase tracking-wider px-6 py-3.5 rounded-xl shadow-lg transition-all active:scale-95 shrink-0"
|
||||||
|
>
|
||||||
|
<Sparkles className="w-4 h-4 text-purple-600" />
|
||||||
|
<span>Explorar Componentes ESP-IDF</span>
|
||||||
|
<ArrowRight className="w-4 h-4 text-purple-600" />
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* Coding examples container */}
|
||||||
|
{framework.exemplo && (
|
||||||
|
<div className="mt-8">
|
||||||
<CodeExample framework={framework} />
|
<CodeExample framework={framework} />
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -283,8 +318,8 @@ export async function generateMetadata({ params }) {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
...paginaMeta({
|
...paginaMeta({
|
||||||
titulo: `${framework.nome} para ESP32`,
|
titulo: `${framework.nome} para ESP32 · Guia Técnico`,
|
||||||
descricao: `${framework.nome_completo}: ${framework.descricao} Guia em português com exemplo de código e quando usar.`,
|
descricao: `${framework.nome_completo}: ${framework.descricao} Guia com exemplos práticos de código e casos de uso.`,
|
||||||
caminho: `/frameworks/${encodeURIComponent(key)}`,
|
caminho: `/frameworks/${encodeURIComponent(key)}`,
|
||||||
tipo: "article",
|
tipo: "article",
|
||||||
keywords: [
|
keywords: [
|
||||||
|
|||||||
+139
-54
@@ -17,15 +17,31 @@ import {
|
|||||||
Music,
|
Music,
|
||||||
Camera,
|
Camera,
|
||||||
Brain,
|
Brain,
|
||||||
Home
|
Home,
|
||||||
|
Box,
|
||||||
|
Cloud,
|
||||||
|
Radio,
|
||||||
|
ShieldCheck,
|
||||||
|
Mic
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
|
|
||||||
|
|
||||||
export const metadata = paginaMeta({
|
export const metadata = paginaMeta({
|
||||||
titulo: "Frameworks para ESP32",
|
titulo: "Frameworks & SDKs para ESP32: Guia Completo e Comparativo",
|
||||||
descricao: "ESP-IDF, Arduino, MicroPython, ESP-ADF, ESP-DSP, ESP-WHO, ESP-NN e ESP-Matter: para que serve cada framework do ESP32, com exemplo de código e quando usar.",
|
descricao: "Guia completo de desenvolvimento: ESP-IDF, ESP-RainMaker, ESP-Matter, Rust, ESP-ADF, ESP-SR, ESP-WHO, Arduino e MicroPython com exemplos de código.",
|
||||||
caminho: "/frameworks",
|
caminho: "/frameworks",
|
||||||
keywords: ["ESP-IDF", "Arduino ESP32", "MicroPython ESP32", "frameworks ESP32", "programar ESP32"],
|
keywords: [
|
||||||
|
"ESP-IDF",
|
||||||
|
"ESP-RainMaker",
|
||||||
|
"ESP-Matter",
|
||||||
|
"Rust ESP32",
|
||||||
|
"ESP-SR",
|
||||||
|
"ESP-ADF",
|
||||||
|
"ESP-IoT-Solution",
|
||||||
|
"Arduino ESP32",
|
||||||
|
"MicroPython ESP32",
|
||||||
|
"frameworks ESP32",
|
||||||
|
"programar ESP32"
|
||||||
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
export default function Frameworks() {
|
export default function Frameworks() {
|
||||||
@@ -35,34 +51,70 @@ export default function Frameworks() {
|
|||||||
<div className="bg-gradient-to-br from-slate-100 via-slate-50 to-purple-100/40 dark:from-slate-950 dark:via-slate-950 dark:to-slate-900 min-h-screen text-slate-900 dark:text-slate-100 transition-colors duration-300">
|
<div className="bg-gradient-to-br from-slate-100 via-slate-50 to-purple-100/40 dark:from-slate-950 dark:via-slate-950 dark:to-slate-900 min-h-screen text-slate-900 dark:text-slate-100 transition-colors duration-300">
|
||||||
<Header />
|
<Header />
|
||||||
|
|
||||||
<main id="conteudo" className="px-6 pt-16 pb-24 max-w-7xl mx-auto">
|
<main id="conteudo" className="px-4 md:px-6 pt-12 md:pt-16 pb-24 max-w-7xl mx-auto space-y-12">
|
||||||
{/* Top Hero Section */}
|
{/* Top Hero Section */}
|
||||||
<section className="text-center mb-16 select-none">
|
<section className="text-center select-none">
|
||||||
<div className="inline-flex items-center gap-2 bg-white dark:bg-slate-900/50 backdrop-blur-md px-4 py-2 rounded-full mb-6 border border-slate-300 dark:border-slate-800/60 shadow-xs">
|
<div className="inline-flex items-center gap-2 bg-white/80 dark:bg-slate-900/60 backdrop-blur-md px-4 py-2 rounded-full mb-6 border border-slate-300 dark:border-slate-800/80 shadow-xs">
|
||||||
<Layers className="w-4 h-4 text-purple-500" />
|
<Layers className="w-4 h-4 text-purple-500" />
|
||||||
<span className="text-xs font-bold text-slate-700 dark:text-slate-350 uppercase tracking-wider">Ferramentas de Desenvolvimento</span>
|
<span className="text-xs font-bold text-slate-700 dark:text-slate-350 uppercase tracking-wider">
|
||||||
|
Ecossistema de Desenvolvimento
|
||||||
|
</span>
|
||||||
|
<span className="bg-purple-100 dark:bg-purple-950/80 text-purple-700 dark:text-purple-300 text-[10px] font-extrabold px-2 py-0.5 rounded-full">
|
||||||
|
14 SDKs
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h1 className="text-4xl md:text-6xl font-display font-extrabold bg-gradient-to-r from-blue-600 via-purple-600 to-pink-600 dark:from-blue-400 dark:via-purple-400 dark:to-pink-400 bg-clip-text text-transparent mb-6 leading-none tracking-tight">
|
<h1 className="text-4xl md:text-6xl font-display font-extrabold bg-gradient-to-r from-blue-600 via-purple-600 to-pink-600 dark:from-blue-400 dark:via-purple-400 dark:to-pink-400 bg-clip-text text-transparent mb-6 pb-2 pt-1 leading-tight md:leading-[1.18] tracking-tight">
|
||||||
Frameworks ESP32
|
Frameworks & SDKs ESP32
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<p className="text-sm md:text-base text-slate-500 dark:text-slate-400 max-w-2xl mx-auto leading-relaxed font-semibold">
|
<p className="text-sm md:text-base text-slate-600 dark:text-slate-400 max-w-3xl mx-auto leading-relaxed font-semibold">
|
||||||
Descubra o ecossistema de software do ESP32. De desenvolvimento geral C/C++ a
|
Descubra o ecossistema completo de software do ESP32. Do desenvolvimento nativo C/C++
|
||||||
soluções dedicadas a áudio de alto desempenho, visão computacional na borda e IoT inteligente.
|
com FreeRTOS ao ecossistema moderno em Rust, passando por nuvem IoT, reconhecimento de voz local,
|
||||||
|
áudio de alta fidelidade e o padrão universal Matter.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
{/* Highlight Callout: ESP Component Registry */}
|
||||||
|
<section className="bg-gradient-to-r from-purple-900/90 via-indigo-900/90 to-slate-900/90 text-white rounded-3xl p-6 md:p-8 shadow-2xl border border-purple-500/30 relative overflow-hidden flex flex-col lg:flex-row items-start lg:items-center justify-between gap-6">
|
||||||
|
<div className="absolute -right-12 -top-12 w-64 h-64 bg-purple-500/10 rounded-full blur-3xl pointer-events-none" />
|
||||||
|
|
||||||
|
<div className="space-y-2 max-w-3xl relative z-10">
|
||||||
|
<div className="inline-flex items-center gap-2 px-3 py-1 bg-purple-500/20 text-purple-300 text-xs font-bold rounded-full border border-purple-400/30">
|
||||||
|
<Box className="w-3.5 h-3.5 text-purple-300" />
|
||||||
|
<span>Arquitetura Modular</span>
|
||||||
|
</div>
|
||||||
|
<h2 className="text-2xl md:text-3xl font-display font-extrabold text-white">
|
||||||
|
ESP Component Registry & IDF Component Manager
|
||||||
|
</h2>
|
||||||
|
<p className="text-xs md:text-sm text-slate-300 leading-relaxed font-medium">
|
||||||
|
Desenvolva de forma modular: instale drivers de displays (LVGL), pilhas industriais (Modbus),
|
||||||
|
recursos de nuvem (RainMaker) e pacotes de suporte a placas (BSPs) com uma única linha no seu manifesto <code>idf_component.yml</code>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="relative z-10 shrink-0 w-full lg:w-auto">
|
||||||
|
<Link
|
||||||
|
href="/componentes"
|
||||||
|
className="inline-flex items-center justify-center gap-2 w-full lg:w-auto bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-400 hover:to-pink-400 text-white font-bold text-xs uppercase tracking-wider px-6 py-3.5 rounded-2xl shadow-lg transition-all active:scale-95"
|
||||||
|
>
|
||||||
|
<Sparkles className="w-4 h-4" />
|
||||||
|
<span>Explorar Component Registry</span>
|
||||||
|
<ArrowRight className="w-4 h-4" />
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
{/* Cards Grid */}
|
{/* Cards Grid */}
|
||||||
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
|
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||||
{frameworks.map(([key, framework]) => (
|
{frameworks.map(([key, framework]) => (
|
||||||
<Link
|
<Link
|
||||||
key={key}
|
key={key}
|
||||||
href={`/frameworks/${key}`}
|
href={`/frameworks/${encodeURIComponent(key)}`}
|
||||||
className="group flex"
|
className="group flex"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
className="bg-white dark:bg-slate-900/40 backdrop-blur-xl border border-slate-300 dark:border-slate-800/80 rounded-3xl shadow-lg hover:shadow-2xl transition-all duration-500 hover:-translate-y-1.5 flex flex-col justify-between overflow-hidden w-full"
|
className="bg-white dark:bg-slate-900/40 backdrop-blur-xl border border-slate-300 dark:border-slate-800/80 rounded-3xl shadow-lg hover:shadow-2xl transition-all duration-300 hover:-translate-y-1.5 flex flex-col justify-between overflow-hidden w-full"
|
||||||
style={{ borderTop: `4px solid ${framework.cor}` }}
|
style={{ borderTop: `4px solid ${framework.cor}` }}
|
||||||
>
|
>
|
||||||
|
|
||||||
@@ -80,6 +132,9 @@ export default function Frameworks() {
|
|||||||
>
|
>
|
||||||
{framework.linguagem}
|
{framework.linguagem}
|
||||||
</span>
|
</span>
|
||||||
|
<span className="text-[9px] font-bold text-slate-400 dark:text-slate-500">
|
||||||
|
{framework.tipo}
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -104,7 +159,7 @@ export default function Frameworks() {
|
|||||||
<Target className="w-3.5 h-3.5 text-blue-500" />
|
<Target className="w-3.5 h-3.5 text-blue-500" />
|
||||||
<span>Objetivo Principal</span>
|
<span>Objetivo Principal</span>
|
||||||
</h4>
|
</h4>
|
||||||
<p className="text-xs text-slate-650 dark:text-slate-200 font-medium leading-relaxed">
|
<p className="text-xs text-slate-650 dark:text-slate-200 font-medium leading-relaxed line-clamp-2">
|
||||||
{framework.funcao_principal}
|
{framework.funcao_principal}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -153,9 +208,9 @@ export default function Frameworks() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Bottom Informative Cards Section */}
|
{/* Bottom Informative Cards Section */}
|
||||||
<div className="mt-16 grid md:grid-cols-2 gap-8 select-none">
|
<div className="grid md:grid-cols-3 gap-6 select-none">
|
||||||
{/* Card 1: Beginner Guide */}
|
{/* Card 1: Beginner Guide */}
|
||||||
<div className="bg-white dark:bg-slate-900/40 backdrop-blur-xl rounded-3xl shadow-xl p-8 border border-slate-300 dark:border-slate-800/80 flex flex-col justify-between relative overflow-hidden">
|
<div className="bg-white dark:bg-slate-900/40 backdrop-blur-xl rounded-3xl shadow-xl p-6 md:p-8 border border-slate-300 dark:border-slate-800/80 flex flex-col justify-between relative overflow-hidden">
|
||||||
<div>
|
<div>
|
||||||
<div className="flex items-center gap-3.5 mb-5">
|
<div className="flex items-center gap-3.5 mb-5">
|
||||||
<div className="w-12 h-12 bg-blue-500/10 border border-blue-500/20 rounded-2xl flex items-center justify-center text-blue-500">
|
<div className="w-12 h-12 bg-blue-500/10 border border-blue-500/20 rounded-2xl flex items-center justify-center text-blue-500">
|
||||||
@@ -170,32 +225,67 @@ export default function Frameworks() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p className="text-xs text-slate-500 dark:text-slate-400 leading-relaxed mb-6 font-semibold">
|
<p className="text-xs text-slate-500 dark:text-slate-400 leading-relaxed mb-6 font-semibold">
|
||||||
Se você está iniciando a sua jornada de hardware, recomendamos adotar o ecossistema
|
Se você está iniciando a sua jornada, o
|
||||||
<strong className="text-slate-750 dark:text-slate-300">Arduino</strong> ou
|
<strong className="text-slate-750 dark:text-slate-300">Arduino Core</strong> ou
|
||||||
<strong className="text-slate-750 dark:text-slate-300">MicroPython</strong>
|
<strong className="text-slate-750 dark:text-slate-300">MicroPython</strong>
|
||||||
para testar sensores e APIs. Para projetos profissionais industriais de alta performance e eficiência energética, o framework nativo
|
são ideais para testar sensores e APIs. Para produtos comerciais, adote o
|
||||||
<strong className="text-slate-750 dark:text-slate-300">ESP-IDF</strong> é o padrão exigido no mercado.
|
<strong className="text-slate-750 dark:text-slate-300">ESP-IDF</strong> ou
|
||||||
|
<strong className="text-slate-750 dark:text-slate-300">Rust on ESP32</strong>.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex flex-wrap gap-2.5 pt-4 border-t border-slate-200 dark:border-slate-850/40 mt-auto">
|
<div className="flex flex-wrap gap-2 pt-4 border-t border-slate-200 dark:border-slate-850/40 mt-auto">
|
||||||
<Link href="/frameworks/Arduino" className="inline-flex items-center gap-1.5 px-4 py-2.5 bg-blue-500/10 text-blue-600 dark:text-blue-400 border border-blue-500/20 rounded-xl text-xs font-bold hover:bg-blue-500/20 transition-all">
|
<Link href="/frameworks/Arduino" className="inline-flex items-center gap-1 px-3 py-2 bg-blue-500/10 text-blue-600 dark:text-blue-400 border border-blue-500/20 rounded-xl text-xs font-bold hover:bg-blue-500/20 transition-all">
|
||||||
<span>Arduino</span>
|
<span>Arduino</span>
|
||||||
<ArrowRight className="w-3.5 h-3.5" />
|
|
||||||
</Link>
|
</Link>
|
||||||
<Link href="/frameworks/MicroPython" className="inline-flex items-center gap-1.5 px-4 py-2.5 bg-purple-500/10 text-purple-600 dark:text-purple-400 border border-purple-500/20 rounded-xl text-xs font-bold hover:bg-purple-500/20 transition-all">
|
<Link href="/frameworks/MicroPython" className="inline-flex items-center gap-1 px-3 py-2 bg-purple-500/10 text-purple-600 dark:text-purple-400 border border-purple-500/20 rounded-xl text-xs font-bold hover:bg-purple-500/20 transition-all">
|
||||||
<span>MicroPython</span>
|
<span>MicroPython</span>
|
||||||
<ArrowRight className="w-3.5 h-3.5" />
|
|
||||||
</Link>
|
</Link>
|
||||||
<Link href="/frameworks/ESP-IDF" className="inline-flex items-center gap-1.5 px-4 py-2.5 bg-red-500/10 text-red-600 dark:text-red-450 border border-red-500/20 rounded-xl text-xs font-bold hover:bg-red-500/20 transition-all">
|
<Link href="/frameworks/Rust-ESP" className="inline-flex items-center gap-1 px-3 py-2 bg-amber-500/10 text-amber-600 dark:text-amber-400 border border-amber-500/20 rounded-xl text-xs font-bold hover:bg-amber-500/20 transition-all">
|
||||||
<span>ESP-IDF</span>
|
<span>Rust</span>
|
||||||
<ArrowRight className="w-3.5 h-3.5" />
|
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Card 2: Specialized Solutions */}
|
{/* Card 2: Cloud & Smart Home */}
|
||||||
<div className="bg-white dark:bg-slate-900/40 backdrop-blur-xl rounded-3xl shadow-xl p-8 border border-slate-300 dark:border-slate-800/80 flex flex-col justify-between relative overflow-hidden">
|
<div className="bg-white dark:bg-slate-900/40 backdrop-blur-xl rounded-3xl shadow-xl p-6 md:p-8 border border-slate-300 dark:border-slate-800/80 flex flex-col justify-between relative overflow-hidden">
|
||||||
|
<div>
|
||||||
|
<div className="flex items-center gap-3.5 mb-5">
|
||||||
|
<div className="w-12 h-12 bg-indigo-500/10 border border-indigo-500/20 rounded-2xl flex items-center justify-center text-indigo-500">
|
||||||
|
<Cloud className="w-6 h-6" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h3 className="text-xl font-display font-extrabold text-slate-850 dark:text-slate-100">
|
||||||
|
Cloud & Smart Home
|
||||||
|
</h3>
|
||||||
|
<p className="text-[10px] font-bold text-indigo-500 uppercase tracking-wider leading-none">Conectividade Avançada</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p className="text-xs text-slate-500 dark:text-slate-400 leading-relaxed mb-6 font-semibold">
|
||||||
|
Crie dispositivos interoperáveis com
|
||||||
|
<strong className="text-slate-750 dark:text-slate-300">ESP-Matter</strong>, implemente produtos de nuvem rápida com
|
||||||
|
<strong className="text-slate-750 dark:text-slate-300">ESP-RainMaker</strong> ou redes locais com
|
||||||
|
<strong className="text-slate-750 dark:text-slate-300">ESP-NOW</strong> e
|
||||||
|
<strong className="text-slate-750 dark:text-slate-300">Zigbee 3.0</strong>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex flex-wrap gap-2 pt-4 border-t border-slate-200 dark:border-slate-850/40 mt-auto">
|
||||||
|
<Link href="/frameworks/ESP-RainMaker" className="inline-flex items-center gap-1 px-3 py-2 bg-blue-500/10 text-blue-600 dark:text-blue-400 border border-blue-500/20 rounded-xl text-xs font-bold hover:bg-blue-500/20 transition-all">
|
||||||
|
<span>RainMaker</span>
|
||||||
|
</Link>
|
||||||
|
<Link href="/frameworks/ESP-Matter" className="inline-flex items-center gap-1 px-3 py-2 bg-amber-500/10 text-amber-600 dark:text-amber-400 border border-amber-500/20 rounded-xl text-xs font-bold hover:bg-amber-500/20 transition-all">
|
||||||
|
<span>Matter</span>
|
||||||
|
</Link>
|
||||||
|
<Link href="/frameworks/ESP-Zigbee-SDK" className="inline-flex items-center gap-1 px-3 py-2 bg-pink-500/10 text-pink-600 dark:text-pink-400 border border-pink-500/20 rounded-xl text-xs font-bold hover:bg-pink-500/20 transition-all">
|
||||||
|
<span>Zigbee</span>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Card 3: Specialized Edge AI */}
|
||||||
|
<div className="bg-white dark:bg-slate-900/40 backdrop-blur-xl rounded-3xl shadow-xl p-6 md:p-8 border border-slate-300 dark:border-slate-800/80 flex flex-col justify-between relative overflow-hidden">
|
||||||
<div>
|
<div>
|
||||||
<div className="flex items-center gap-3.5 mb-5">
|
<div className="flex items-center gap-3.5 mb-5">
|
||||||
<div className="w-12 h-12 bg-purple-500/10 border border-purple-500/20 rounded-2xl flex items-center justify-center text-purple-500">
|
<div className="w-12 h-12 bg-purple-500/10 border border-purple-500/20 rounded-2xl flex items-center justify-center text-purple-500">
|
||||||
@@ -203,38 +293,33 @@ export default function Frameworks() {
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h3 className="text-xl font-display font-extrabold text-slate-850 dark:text-slate-100">
|
<h3 className="text-xl font-display font-extrabold text-slate-850 dark:text-slate-100">
|
||||||
Soluções Especializadas
|
Áudio, Voz & IA
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-[10px] font-bold text-purple-500 uppercase tracking-wider leading-none">Domínios Avançados</p>
|
<p className="text-[10px] font-bold text-purple-500 uppercase tracking-wider leading-none">Domínios Especializados</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p className="text-xs text-slate-500 dark:text-slate-400 leading-relaxed mb-6 font-semibold">
|
<p className="text-xs text-slate-500 dark:text-slate-400 leading-relaxed mb-6 font-semibold">
|
||||||
Projetos complexos de IoT demandam bibliotecas altamente otimizadas na arquitetura.
|
Processe áudio com o
|
||||||
A Espressif fornece extensões prontas como o
|
<strong className="text-slate-750 dark:text-slate-300">ESP-ADF</strong>, reconheça fala offline com o
|
||||||
<strong className="text-slate-750 dark:text-slate-300">ESP-ADF</strong> para processamento de áudio digital,
|
<strong className="text-slate-750 dark:text-slate-300">ESP-SR</strong>, processe vídeo com o
|
||||||
<strong className="text-slate-750 dark:text-slate-300">ESP-WHO</strong> para processamento de imagem por câmera,
|
<strong className="text-slate-750 dark:text-slate-300">ESP-WHO</strong> e acelere TinyML com o
|
||||||
<strong className="text-slate-750 dark:text-slate-300">ESP-NN</strong> para redes neurais locais e
|
<strong className="text-slate-750 dark:text-slate-300">ESP-NN</strong>.
|
||||||
<strong className="text-slate-750 dark:text-slate-300">ESP-Matter</strong> para automação residencial.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex flex-wrap gap-2.5 pt-4 border-t border-slate-200 dark:border-slate-850/40 mt-auto">
|
<div className="flex flex-wrap gap-2 pt-4 border-t border-slate-200 dark:border-slate-850/40 mt-auto">
|
||||||
<Link href="/frameworks/ESP-ADF" className="inline-flex items-center gap-1.5 px-3.5 py-2 bg-slate-150/45 dark:bg-slate-850 text-slate-700 dark:text-slate-300 border border-slate-300 dark:border-slate-850/60 rounded-xl text-xs font-bold hover:bg-slate-200 dark:hover:bg-slate-800 transition-all">
|
<Link href="/frameworks/ESP-ADF" className="inline-flex items-center gap-1 px-3 py-2 bg-blue-500/10 text-blue-600 dark:text-blue-400 border border-blue-500/20 rounded-xl text-xs font-bold hover:bg-blue-500/20 transition-all">
|
||||||
<Music className="w-3.5 h-3.5 text-blue-500" />
|
<Music className="w-3.5 h-3.5" />
|
||||||
<span>Áudio</span>
|
<span>Áudio</span>
|
||||||
</Link>
|
</Link>
|
||||||
<Link href="/frameworks/ESP-WHO" className="inline-flex items-center gap-1.5 px-3.5 py-2 bg-slate-150/45 dark:bg-slate-850 text-slate-700 dark:text-slate-300 border border-slate-300 dark:border-slate-850/60 rounded-xl text-xs font-bold hover:bg-slate-200 dark:hover:bg-slate-800 transition-all">
|
<Link href="/frameworks/ESP-SR" className="inline-flex items-center gap-1 px-3 py-2 bg-indigo-500/10 text-indigo-600 dark:text-indigo-400 border border-indigo-500/20 rounded-xl text-xs font-bold hover:bg-indigo-500/20 transition-all">
|
||||||
<Camera className="w-3.5 h-3.5 text-orange-500" />
|
<Mic className="w-3.5 h-3.5" />
|
||||||
<span>Visão</span>
|
<span>Voz</span>
|
||||||
</Link>
|
</Link>
|
||||||
<Link href="/frameworks/ESP-NN" className="inline-flex items-center gap-1.5 px-3.5 py-2 bg-slate-150/45 dark:bg-slate-850 text-slate-700 dark:text-slate-300 border border-slate-300 dark:border-slate-850/60 rounded-xl text-xs font-bold hover:bg-slate-200 dark:hover:bg-slate-800 transition-all">
|
<Link href="/frameworks/ESP-NN" className="inline-flex items-center gap-1 px-3 py-2 bg-teal-500/10 text-teal-600 dark:text-teal-400 border border-teal-500/20 rounded-xl text-xs font-bold hover:bg-teal-500/20 transition-all">
|
||||||
<Brain className="w-3.5 h-3.5 text-teal-500" />
|
<Brain className="w-3.5 h-3.5" />
|
||||||
<span>Inteligência Artificial</span>
|
<span>IA</span>
|
||||||
</Link>
|
|
||||||
<Link href="/frameworks/ESP-Matter" className="inline-flex items-center gap-1.5 px-3.5 py-2 bg-slate-150/45 dark:bg-slate-850 text-slate-700 dark:text-slate-300 border border-slate-300 dark:border-slate-850/60 rounded-xl text-xs font-bold hover:bg-slate-200 dark:hover:bg-slate-800 transition-all">
|
|
||||||
<Home className="w-3.5 h-3.5 text-yellow-500" />
|
|
||||||
<span>Matter</span>
|
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+16
-5
@@ -21,16 +21,17 @@ import {
|
|||||||
Radio,
|
Radio,
|
||||||
ShieldCheck,
|
ShieldCheck,
|
||||||
Code,
|
Code,
|
||||||
HelpCircle
|
HelpCircle,
|
||||||
|
Box
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
// Estatísticas da Plataforma
|
// Estatísticas da Plataforma
|
||||||
const stats = [
|
const stats = [
|
||||||
{ value: "12", label: "Séries Documentadas", desc: "Do ESP32 clássico ao P4 e C61" },
|
{ value: "12", label: "Séries Documentadas", desc: "Do ESP32 clássico ao P4 e C61" },
|
||||||
{ value: "8", label: "Frameworks & SDKs", desc: "ESP-IDF, Arduino, MicroPython, etc." },
|
{ value: "14", label: "Frameworks & SDKs", desc: "ESP-IDF, RainMaker, Rust, Matter, etc." },
|
||||||
|
{ value: "20+", label: "Componentes Curados", desc: "ESP Component Registry & idf_component.yml" },
|
||||||
{ value: "30+", label: "Guias de Diagnóstico", desc: "Soluções para bootloops, brownouts e WDT" },
|
{ value: "30+", label: "Guias de Diagnóstico", desc: "Soluções para bootloops, brownouts e WDT" },
|
||||||
{ value: "60+", label: "Termos Técnicos", desc: "Glossário completo de arquitetura e IoT" },
|
|
||||||
];
|
];
|
||||||
|
|
||||||
// Ferramentas da Plataforma (100% Clicáveis)
|
// Ferramentas da Plataforma (100% Clicáveis)
|
||||||
@@ -45,6 +46,16 @@ export default function Home() {
|
|||||||
iconBg: "text-purple-600 bg-purple-50 dark:bg-purple-950/40 dark:text-purple-400",
|
iconBg: "text-purple-600 bg-purple-50 dark:bg-purple-950/40 dark:text-purple-400",
|
||||||
ctaText: "Iniciar Quiz de Seleção",
|
ctaText: "Iniciar Quiz de Seleção",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "ESP Component Registry",
|
||||||
|
badge: "Oficial & Modular",
|
||||||
|
badgeColor: "bg-purple-100 text-purple-700 dark:bg-purple-950/60 dark:text-purple-300",
|
||||||
|
description: "Explore o catálogo oficial de pacotes modulares da Espressif (LVGL, RainMaker, ESP-SR, BSPs) e gere manifestos idf_component.yml.",
|
||||||
|
href: "/componentes",
|
||||||
|
icon: <Box className="w-6 h-6" />,
|
||||||
|
iconBg: "text-purple-600 bg-purple-50 dark:bg-purple-950/40 dark:text-purple-400",
|
||||||
|
ctaText: "Explorar Componentes",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: "Diagnóstico de Falhas",
|
title: "Diagnóstico de Falhas",
|
||||||
badge: "30+ Soluções",
|
badge: "30+ Soluções",
|
||||||
@@ -87,9 +98,9 @@ export default function Home() {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Frameworks & SDKs",
|
title: "Frameworks & SDKs",
|
||||||
badge: "C++, Python & Rust",
|
badge: "14 Frameworks",
|
||||||
badgeColor: "bg-teal-100 text-teal-700 dark:bg-teal-950/60 dark:text-teal-300",
|
badgeColor: "bg-teal-100 text-teal-700 dark:bg-teal-950/60 dark:text-teal-300",
|
||||||
description: "Documentação de frameworks oficiais e comunitários: ESP-IDF, Arduino Core, MicroPython, ESP-Matter, ESP-WHO e mais.",
|
description: "Documentação completa de frameworks oficiais: ESP-IDF, RainMaker, Rust, Matter, ESP-SR, Arduino, MicroPython e mais.",
|
||||||
href: "/frameworks",
|
href: "/frameworks",
|
||||||
icon: <Terminal className="w-6 h-6" />,
|
icon: <Terminal className="w-6 h-6" />,
|
||||||
iconBg: "text-teal-600 bg-teal-50 dark:bg-teal-950/40 dark:text-teal-400",
|
iconBg: "text-teal-600 bg-teal-50 dark:bg-teal-950/40 dark:text-teal-400",
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ export default function sitemap() {
|
|||||||
{ caminho: "/diagnostico", prioridade: 0.9, frequencia: "weekly", lastModified: dataRevisao },
|
{ caminho: "/diagnostico", prioridade: 0.9, frequencia: "weekly", lastModified: dataRevisao },
|
||||||
{ caminho: "/seletor", prioridade: 0.8, frequencia: "monthly", lastModified: dataRevisao },
|
{ caminho: "/seletor", prioridade: 0.8, frequencia: "monthly", lastModified: dataRevisao },
|
||||||
{ caminho: "/frameworks", prioridade: 0.8, frequencia: "monthly", lastModified: dataRevisao },
|
{ caminho: "/frameworks", prioridade: 0.8, frequencia: "monthly", lastModified: dataRevisao },
|
||||||
|
{ caminho: "/componentes", prioridade: 0.8, frequencia: "weekly", lastModified: dataRevisao },
|
||||||
{ caminho: "/glossario", prioridade: 0.7, frequencia: "monthly", lastModified: dataRevisao },
|
{ caminho: "/glossario", prioridade: 0.7, frequencia: "monthly", lastModified: dataRevisao },
|
||||||
{ caminho: "/catalogo", prioridade: 0.6, frequencia: "weekly", lastModified: dataRevisao },
|
{ caminho: "/catalogo", prioridade: 0.6, frequencia: "weekly", lastModified: dataRevisao },
|
||||||
{ caminho: "/sobre", prioridade: 0.4, frequencia: "yearly", lastModified: dataRevisao },
|
{ caminho: "/sobre", prioridade: 0.4, frequencia: "yearly", lastModified: dataRevisao },
|
||||||
|
|||||||
@@ -47,6 +47,14 @@ export default function Footer() {
|
|||||||
Recursos
|
Recursos
|
||||||
</h4>
|
</h4>
|
||||||
<ul className="space-y-3 text-sm">
|
<ul className="space-y-3 text-sm">
|
||||||
|
<li>
|
||||||
|
<Link
|
||||||
|
href="/componentes"
|
||||||
|
className="hover:text-purple-600 dark:hover:text-purple-400 transition-colors flex items-center gap-1.5 font-medium"
|
||||||
|
>
|
||||||
|
<span>ESP Component Registry</span>
|
||||||
|
</Link>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<Link
|
<Link
|
||||||
href="/diagnostico"
|
href="/diagnostico"
|
||||||
|
|||||||
+33
-4
@@ -24,7 +24,8 @@ import {
|
|||||||
ArrowRight,
|
ArrowRight,
|
||||||
ExternalLink,
|
ExternalLink,
|
||||||
Compass,
|
Compass,
|
||||||
Layers
|
Layers,
|
||||||
|
Box
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
|
|
||||||
export default function Header() {
|
export default function Header() {
|
||||||
@@ -291,7 +292,7 @@ export default function Header() {
|
|||||||
setToolsDropdown(false);
|
setToolsDropdown(false);
|
||||||
}}
|
}}
|
||||||
className={`flex items-center gap-1.5 px-3 py-2 rounded-xl font-semibold text-sm transition-all duration-200 cursor-pointer ${
|
className={`flex items-center gap-1.5 px-3 py-2 rounded-xl font-semibold text-sm transition-all duration-200 cursor-pointer ${
|
||||||
isActive("/frameworks") || isActive("/glossario") || isActive("/sobre")
|
isActive("/frameworks") || isActive("/componentes") || isActive("/glossario") || isActive("/sobre")
|
||||||
? "bg-purple-50 dark:bg-purple-950/40 text-purple-600 dark:text-purple-400"
|
? "bg-purple-50 dark:bg-purple-950/40 text-purple-600 dark:text-purple-400"
|
||||||
: "text-slate-650 dark:text-slate-350 hover:bg-slate-100/70 dark:hover:bg-slate-800/60 hover:text-slate-850 dark:hover:text-slate-100"
|
: "text-slate-650 dark:text-slate-350 hover:bg-slate-100/70 dark:hover:bg-slate-800/60 hover:text-slate-850 dark:hover:text-slate-100"
|
||||||
}`}
|
}`}
|
||||||
@@ -303,7 +304,7 @@ export default function Header() {
|
|||||||
</button>
|
</button>
|
||||||
|
|
||||||
{docsDropdown && (
|
{docsDropdown && (
|
||||||
<div className="absolute left-0 mt-2 w-72 bg-white dark:bg-slate-900 rounded-2xl shadow-2xl border border-slate-200 dark:border-slate-800 p-3 z-50 animate-fadeIn">
|
<div className="absolute left-0 mt-2 w-80 bg-white dark:bg-slate-900 rounded-2xl shadow-2xl border border-slate-200 dark:border-slate-800 p-3 z-50 animate-fadeIn">
|
||||||
<div className="space-y-1">
|
<div className="space-y-1">
|
||||||
<Link
|
<Link
|
||||||
href="/frameworks"
|
href="/frameworks"
|
||||||
@@ -316,7 +317,22 @@ export default function Header() {
|
|||||||
<div className="font-bold text-sm text-slate-850 dark:text-slate-100 group-hover:text-purple-600 dark:group-hover:text-purple-400">
|
<div className="font-bold text-sm text-slate-850 dark:text-slate-100 group-hover:text-purple-600 dark:group-hover:text-purple-400">
|
||||||
Frameworks & SDKs
|
Frameworks & SDKs
|
||||||
</div>
|
</div>
|
||||||
<div className="text-xs text-slate-500 dark:text-slate-400 mt-0.5">ESP-IDF, Arduino, MicroPython e mais</div>
|
<div className="text-xs text-slate-500 dark:text-slate-400 mt-0.5">ESP-IDF, Arduino, Rust, RainMaker e mais</div>
|
||||||
|
</div>
|
||||||
|
</Link>
|
||||||
|
|
||||||
|
<Link
|
||||||
|
href="/componentes"
|
||||||
|
className="flex items-start gap-3 p-2.5 rounded-xl hover:bg-slate-100 dark:hover:bg-slate-800/70 transition-colors group"
|
||||||
|
>
|
||||||
|
<div className="p-2 rounded-lg bg-purple-50 dark:bg-purple-950/40 text-purple-600 dark:text-purple-400 shrink-0">
|
||||||
|
<Box className="w-4 h-4" />
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div className="font-bold text-sm text-slate-850 dark:text-slate-100 group-hover:text-purple-600 dark:group-hover:text-purple-400">
|
||||||
|
Component Registry
|
||||||
|
</div>
|
||||||
|
<div className="text-xs text-slate-500 dark:text-slate-400 mt-0.5">Catálogo de drivers e gerador idf_component.yml</div>
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
@@ -584,6 +600,19 @@ export default function Header() {
|
|||||||
<span>Frameworks & SDKs</span>
|
<span>Frameworks & SDKs</span>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
|
<Link
|
||||||
|
href="/componentes"
|
||||||
|
onClick={() => setDrawerOpen(false)}
|
||||||
|
className={`flex items-center gap-2.5 p-2.5 rounded-xl font-medium text-sm transition-colors ${
|
||||||
|
isActive("/componentes")
|
||||||
|
? "bg-purple-50 dark:bg-purple-950/40 text-purple-600 dark:text-purple-400 font-bold"
|
||||||
|
: "text-slate-700 dark:text-slate-300 hover:bg-slate-100 dark:hover:bg-slate-800/60"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<Box className="w-4 h-4 text-purple-600 dark:text-purple-400" />
|
||||||
|
<span>Component Registry</span>
|
||||||
|
</Link>
|
||||||
|
|
||||||
<Link
|
<Link
|
||||||
href="/glossario"
|
href="/glossario"
|
||||||
onClick={() => setDrawerOpen(false)}
|
onClick={() => setDrawerOpen(false)}
|
||||||
|
|||||||
@@ -0,0 +1,470 @@
|
|||||||
|
/**
|
||||||
|
* Base de Dados Oficial Curada: ESP Component Registry & IDF Component Manager
|
||||||
|
*
|
||||||
|
* O ESP Component Registry (https://components.espressif.com) é o ecossistema
|
||||||
|
* central de distribuição de bibliotecas modulares para o ESP-IDF v4.4+ / v5.x+.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const CATEGORIAS_COMPONENTES = [
|
||||||
|
{
|
||||||
|
id: "todos",
|
||||||
|
nome: "Todos os Componentes",
|
||||||
|
icone: "Layers",
|
||||||
|
descricao: "Explore todo o catálogo curado de bibliotecas e drivers"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "ui_display",
|
||||||
|
nome: "UI, Displays & Gráficos",
|
||||||
|
icone: "Monitor",
|
||||||
|
descricao: "Bibliotecas gráficas (LVGL), drivers de display LCD/OLED e decodificadores de imagem"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "cloud_conectividade",
|
||||||
|
nome: "Cloud & Conectividade",
|
||||||
|
icone: "Cloud",
|
||||||
|
descricao: "ESP RainMaker, AWS IoT, MQTT, HTTP, WebSockets e coprocessamento ESP-Hosted"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "audio_voz_ia",
|
||||||
|
nome: "Áudio, Voz & IA",
|
||||||
|
icone: "Brain",
|
||||||
|
descricao: "Reconhecimento de fala ESP-SR, processamento DSP, codecs de áudio e aceleração TinyML"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "smart_home_mesh",
|
||||||
|
nome: "Smart Home & Mesh",
|
||||||
|
icone: "Home",
|
||||||
|
descricao: "Matter SDK, pilhas Zigbee 3.0 (ZBOSS), Thread e redes ESP-NOW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "drivers_perifericos",
|
||||||
|
nome: "Drivers & Sensores",
|
||||||
|
icone: "Cpu",
|
||||||
|
descricao: "Botões, encoders, LEDs RGB endereçáveis, Ethernet PHYs, USB Host e sensores I2C/SPI"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "bsp_placas",
|
||||||
|
nome: "BSPs (Board Support Packages)",
|
||||||
|
icone: "CircuitBoard",
|
||||||
|
descricao: "Pacotes de suporte direto para placas oficiais como ESP32-S3-BOX, Korvo, Eye e LilyGO"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "sistema_utilitarios",
|
||||||
|
nome: "Sistema & Utilitários",
|
||||||
|
icone: "Wrench",
|
||||||
|
descricao: "Sistemas de arquivos LittleFS/FATFS, gerenciadores de tarefas, logs e testes unitários"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
export const COMPONENTES_REGISTRY = [
|
||||||
|
// UI, Displays & Gráficos
|
||||||
|
{
|
||||||
|
id: "espressif-esp_lvgl_port",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "esp_lvgl_port",
|
||||||
|
versao: "^2.4.0",
|
||||||
|
categoria: "ui_display",
|
||||||
|
oficial: true,
|
||||||
|
popular: true,
|
||||||
|
titulo: "ESP LVGL Port",
|
||||||
|
descricao: "Port oficial e thread-safe do LVGL (Light and Versatile Graphics Library) para ESP-IDF com aceleração por hardware e suporte multi-display.",
|
||||||
|
tags: ["LVGL", "GUI", "Display", "Touch", "IHM"],
|
||||||
|
chips: ["ESP32", "ESP32-S2", "ESP32-S3", "ESP32-P4", "ESP32-C3", "ESP32-C6"],
|
||||||
|
dependenciasSugeridas: ["lvgl/lvgl^9.0.0"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/esp_lvgl_port",
|
||||||
|
urlRepo: "https://github.com/espressif/esp-bsp/tree/master/components/esp_lvgl_port",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/esp_lvgl_port: "^2.4.0"
|
||||||
|
lvgl/lvgl: "^9.1.0"`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "espressif-esp32_display_panel",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "esp32_display_panel",
|
||||||
|
versao: "^0.2.0",
|
||||||
|
categoria: "ui_display",
|
||||||
|
oficial: true,
|
||||||
|
popular: true,
|
||||||
|
titulo: "ESP32 Display Panel Driver",
|
||||||
|
descricao: "Driver unificado de controladores LCD (RGB, SPI, QSPI, MIPI-DSI) e touch capacitivo desenhado especialmente para ESP32-S3 e ESP32-P4.",
|
||||||
|
tags: ["LCD", "MIPI-DSI", "QSPI", "Touch", "ST7789", "ILI9341"],
|
||||||
|
chips: ["ESP32-S3", "ESP32-P4", "ESP32-S2", "ESP32"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/esp32_display_panel",
|
||||||
|
urlRepo: "https://github.com/esp-arduino-libs/ESP32_Display_Panel",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/esp32_display_panel: "^0.2.0"`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "espressif-esp_jpeg",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "esp_jpeg",
|
||||||
|
versao: "^1.3.0",
|
||||||
|
categoria: "ui_display",
|
||||||
|
oficial: true,
|
||||||
|
popular: false,
|
||||||
|
titulo: "ESP JPEG Decoder (TJpgDec)",
|
||||||
|
descricao: "Decodificador e codificador JPEG de alta velocidade com otimizações SIMD em Assembly para exibir imagens e câmeras em displays.",
|
||||||
|
tags: ["JPEG", "TJpgDec", "Câmera", "Imagem", "SIMD"],
|
||||||
|
chips: ["ESP32", "ESP32-S3", "ESP32-P4", "ESP32-C3"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/esp_jpeg",
|
||||||
|
urlRepo: "https://github.com/espressif/esp-jpeg",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/esp_jpeg: "^1.3.0"`
|
||||||
|
},
|
||||||
|
|
||||||
|
// Cloud & Conectividade
|
||||||
|
{
|
||||||
|
id: "espressif-esp_rainmaker",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "esp_rainmaker",
|
||||||
|
versao: "^1.4.0",
|
||||||
|
categoria: "cloud_conectividade",
|
||||||
|
oficial: true,
|
||||||
|
popular: true,
|
||||||
|
titulo: "ESP RainMaker Agent",
|
||||||
|
descricao: "Agente oficial de firmware para a plataforma de nuvem AIoT ESP RainMaker. Habilita controle por app móvel, Alexa, Google Home e OTA.",
|
||||||
|
tags: ["RainMaker", "AWS Cloud", "App iOS/Android", "Alexa", "Google Home", "OTA"],
|
||||||
|
chips: ["ESP32", "ESP32-S2", "ESP32-S3", "ESP32-C3", "ESP32-C6"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/esp_rainmaker",
|
||||||
|
urlRepo: "https://github.com/espressif/esp-rainmaker",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/esp_rainmaker: "^1.4.0"`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "espressif-esp_modbus",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "esp_modbus",
|
||||||
|
versao: "^1.0.15",
|
||||||
|
categoria: "cloud_conectividade",
|
||||||
|
oficial: true,
|
||||||
|
popular: true,
|
||||||
|
titulo: "ESP-Modbus Industrial Stack",
|
||||||
|
descricao: "Implementação completa da pilha industrial Modbus (Master/Slave) suportando interfaces RS-485 (RTU/ASCII) e Ethernet/Wi-Fi (Modbus TCP).",
|
||||||
|
tags: ["Modbus", "RS-485", "Modbus TCP", "Automação Industrial", "PLC"],
|
||||||
|
chips: ["ESP32", "ESP32-S3", "ESP32-C3", "ESP32-C6", "ESP32-P4"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/esp_modbus",
|
||||||
|
urlRepo: "https://github.com/espressif/esp-modbus",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/esp_modbus: "^1.0.15"`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "espressif-esp_hosted",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "esp_hosted",
|
||||||
|
versao: "^0.0.10",
|
||||||
|
categoria: "cloud_conectividade",
|
||||||
|
oficial: true,
|
||||||
|
popular: false,
|
||||||
|
titulo: "ESP-Hosted Coprocessor",
|
||||||
|
descricao: "Transforma o ESP32 em um coprocessador de comunicação sem fio (Wi-Fi + BLE) para hosts Linux (Raspberry Pi, i.MX) ou microcontroladores via SPI/SDIO/UART.",
|
||||||
|
tags: ["Coprocessador", "SDIO", "SPI", "Linux Wi-Fi", "Raspberry Pi"],
|
||||||
|
chips: ["ESP32", "ESP32-S3", "ESP32-C3", "ESP32-C6"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/esp_hosted",
|
||||||
|
urlRepo: "https://github.com/espressif/esp-hosted",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/esp_hosted: "^0.0.10"`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "espressif-esp-now",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "esp-now",
|
||||||
|
versao: "^2.5.0",
|
||||||
|
categoria: "cloud_conectividade",
|
||||||
|
oficial: true,
|
||||||
|
popular: true,
|
||||||
|
titulo: "ESP-NOW Enhanced & Provisioning",
|
||||||
|
descricao: "Extensão com recursos avançados de emparelhamento por controle remoto, segurança AES-128 e controle de múltiplos dispositivos com protocolo ESP-NOW.",
|
||||||
|
tags: ["ESP-NOW", "Sem Fio", "Baixa Latência", "Broadcast", "Controle Remoto"],
|
||||||
|
chips: ["ESP32", "ESP32-S2", "ESP32-S3", "ESP32-C3", "ESP32-C6"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/esp-now",
|
||||||
|
urlRepo: "https://github.com/espressif/esp-now",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/esp-now: "^2.5.0"`
|
||||||
|
},
|
||||||
|
|
||||||
|
// Áudio, Voz & IA
|
||||||
|
{
|
||||||
|
id: "espressif-esp-sr",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "esp-sr",
|
||||||
|
versao: "^1.5.0",
|
||||||
|
categoria: "audio_voz_ia",
|
||||||
|
oficial: true,
|
||||||
|
popular: true,
|
||||||
|
titulo: "ESP-SR Speech Recognition",
|
||||||
|
descricao: "Framework de reconhecimento de fala 100% offline com WakeNet (palavra de ativação), MultiNet (comandos locais) e algoritmos acústicos AFE.",
|
||||||
|
tags: ["Voz", "WakeNet", "MultiNet", "Reconhecimento de Fala", "Offline", "AEC"],
|
||||||
|
chips: ["ESP32-S3", "ESP32-P4", "ESP32"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/esp-sr",
|
||||||
|
urlRepo: "https://github.com/espressif/esp-sr",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/esp-sr: "^1.5.0"`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "espressif-esp-dsp",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "esp-dsp",
|
||||||
|
versao: "^1.5.1",
|
||||||
|
categoria: "audio_voz_ia",
|
||||||
|
oficial: true,
|
||||||
|
popular: true,
|
||||||
|
titulo: "ESP-DSP Signal Processing",
|
||||||
|
descricao: "Biblioteca oficial de processamento digital de sinais para SoCs ESP32 (FFT, filtros digitais FIR/IIR, matrizes e álgebra linear acelerada).",
|
||||||
|
tags: ["DSP", "FFT", "Filtros", "Matemática", "SIMD", "Assembly"],
|
||||||
|
chips: ["ESP32", "ESP32-S3", "ESP32-P4", "ESP32-C3", "ESP32-C6"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/esp-dsp",
|
||||||
|
urlRepo: "https://github.com/espressif/esp-dsp",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/esp-dsp: "^1.5.1"`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "espressif-esp-nn",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "esp-nn",
|
||||||
|
versao: "^1.2.0",
|
||||||
|
categoria: "audio_voz_ia",
|
||||||
|
oficial: true,
|
||||||
|
popular: true,
|
||||||
|
titulo: "ESP-NN Neural Network Kernels",
|
||||||
|
descricao: "Kernels otimizados em assembly vetorial para aceleração de redes neurais e modelos TensorFlow Lite Micro em chips ESP32.",
|
||||||
|
tags: ["TinyML", "TensorFlow Lite", "Redes Neurais", "Inferência", "Edge AI"],
|
||||||
|
chips: ["ESP32-S3", "ESP32-P4", "ESP32"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/esp-nn",
|
||||||
|
urlRepo: "https://github.com/espressif/esp-nn",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/esp-nn: "^1.2.0"`
|
||||||
|
},
|
||||||
|
|
||||||
|
// Smart Home & Mesh
|
||||||
|
{
|
||||||
|
id: "espressif-esp-matter",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "esp-matter",
|
||||||
|
versao: "^1.3.0",
|
||||||
|
categoria: "smart_home_mesh",
|
||||||
|
oficial: true,
|
||||||
|
popular: true,
|
||||||
|
titulo: "ESP Matter SDK",
|
||||||
|
descricao: "SDK oficial para criar dispositivos interoperáveis com Apple Home, Google Home, Amazon Alexa e Home Assistant sobre Wi-Fi e Thread.",
|
||||||
|
tags: ["Matter", "Smart Home", "Apple HomeKit", "Google Home", "Thread", "CHIP"],
|
||||||
|
chips: ["ESP32", "ESP32-S3", "ESP32-C3", "ESP32-C6", "ESP32-H2"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/esp-matter",
|
||||||
|
urlRepo: "https://github.com/espressif/esp-matter",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/esp-matter: "^1.3.0"`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "espressif-esp-zigbee-lib",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "esp-zigbee-lib",
|
||||||
|
versao: "^1.6.0",
|
||||||
|
categoria: "smart_home_mesh",
|
||||||
|
oficial: true,
|
||||||
|
popular: true,
|
||||||
|
titulo: "ESP Zigbee 3.0 Library",
|
||||||
|
descricao: "Pilha certificada Zigbee 3.0 (ZBOSS) para criação de nós Coordenadores, Roteadores e Dispositivos Finais de baixo consumo em chips 802.15.4.",
|
||||||
|
tags: ["Zigbee 3.0", "ZBOSS", "802.15.4", "Home Automation", "Bateria"],
|
||||||
|
chips: ["ESP32-H2", "ESP32-C6"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/esp-zigbee-lib",
|
||||||
|
urlRepo: "https://github.com/espressif/esp-zigbee-sdk",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/esp-zigbee-lib: "^1.6.0"`
|
||||||
|
},
|
||||||
|
|
||||||
|
// Drivers & Sensores
|
||||||
|
{
|
||||||
|
id: "espressif-led_indicator",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "led_indicator",
|
||||||
|
versao: "^1.2.0",
|
||||||
|
categoria: "drivers_perifericos",
|
||||||
|
oficial: true,
|
||||||
|
popular: true,
|
||||||
|
titulo: "LED Indicator Driver",
|
||||||
|
descricao: "Driver inteligente para controle de padrões de iluminação de LED (piscar rápido, respiração/fade, códigos de erro e RGB) sem travar o loop principal.",
|
||||||
|
tags: ["LED", "PWM", "RGB", "Blink", "Feedback Visual"],
|
||||||
|
chips: ["ESP32", "ESP32-S2", "ESP32-S3", "ESP32-C2", "ESP32-C3", "ESP32-C6", "ESP32-H2", "ESP32-P4"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/led_indicator",
|
||||||
|
urlRepo: "https://github.com/espressif/esp-iot-solution/tree/master/components/led/led_indicator",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/led_indicator: "^1.2.0"`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "espressif-button",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "button",
|
||||||
|
versao: "^3.4.0",
|
||||||
|
categoria: "drivers_perifericos",
|
||||||
|
oficial: true,
|
||||||
|
popular: true,
|
||||||
|
titulo: "IoT Button Handler (iot_button)",
|
||||||
|
descricao: "Gerenciador completo de botões com debounce, eventos de clique único, duplo, múltiplo, pressionamento longo e matrizes de teclado.",
|
||||||
|
tags: ["Botão", "Debounce", "Long Press", "Double Click", "GPIO"],
|
||||||
|
chips: ["ESP32", "ESP32-S2", "ESP32-S3", "ESP32-C3", "ESP32-C6", "ESP32-H2", "ESP32-P4"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/button",
|
||||||
|
urlRepo: "https://github.com/espressif/esp-iot-solution/tree/master/components/button",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/button: "^3.4.0"`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "espressif-led_strip",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "led_strip",
|
||||||
|
versao: "^2.5.4",
|
||||||
|
categoria: "drivers_perifericos",
|
||||||
|
oficial: true,
|
||||||
|
popular: true,
|
||||||
|
titulo: "Addressable LED Strip (WS2812/SK6812)",
|
||||||
|
descricao: "Driver de alto desempenho para fitas e matrizes de LED endereçáveis WS2812, WS2813 e SK6812 usando periféricos RMT ou SPI.",
|
||||||
|
tags: ["WS2812B", "Neopixel", "SK6812", "RMT", "Fita de LED", "RGB"],
|
||||||
|
chips: ["ESP32", "ESP32-S2", "ESP32-S3", "ESP32-C3", "ESP32-C6", "ESP32-P4"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/led_strip",
|
||||||
|
urlRepo: "https://github.com/espressif/idf-extra-components/tree/master/led_strip",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/led_strip: "^2.5.4"`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "espressif-usb_host_uvc",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "usb_host_uvc",
|
||||||
|
versao: "^1.0.4",
|
||||||
|
categoria: "drivers_perifericos",
|
||||||
|
oficial: true,
|
||||||
|
popular: false,
|
||||||
|
titulo: "USB Host UVC (Webcam Driver)",
|
||||||
|
descricao: "Driver USB Host para conectar webcams USB UVC padrão diretamente na porta USB nativa do ESP32-S2, ESP32-S3 ou ESP32-P4.",
|
||||||
|
tags: ["USB Host", "UVC", "Webcam", "Câmera USB", "Vídeo"],
|
||||||
|
chips: ["ESP32-S2", "ESP32-S3", "ESP32-P4"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/usb_host_uvc",
|
||||||
|
urlRepo: "https://github.com/espressif/esp-iot-solution/tree/master/components/usb/usb_host_uvc",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/usb_host_uvc: "^1.0.4"`
|
||||||
|
},
|
||||||
|
|
||||||
|
// BSPs (Board Support Packages)
|
||||||
|
{
|
||||||
|
id: "espressif-esp-box-3",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "esp-box-3",
|
||||||
|
versao: "^1.2.0",
|
||||||
|
categoria: "bsp_placas",
|
||||||
|
oficial: true,
|
||||||
|
popular: true,
|
||||||
|
titulo: "BSP ESP32-S3-BOX-3",
|
||||||
|
descricao: "Pacote de suporte completo para a placa de desenvolvimento de IA ESP32-S3-BOX-3, inicializando tela touch, codec de áudio, microfones duplos, sensor de movimento e LEDs com uma única função.",
|
||||||
|
tags: ["BSP", "ESP-BOX-3", "Display Touch", "Microfone", "Áudio ES8311", "I2C/SPI"],
|
||||||
|
chips: ["ESP32-S3"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/esp-box-3",
|
||||||
|
urlRepo: "https://github.com/espressif/esp-bsp/tree/master/bsp/esp-box-3",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/esp-box-3: "^1.2.0"`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "espressif-esp32_s3_korvo_2",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "esp32_s3_korvo_2",
|
||||||
|
versao: "^1.1.0",
|
||||||
|
categoria: "bsp_placas",
|
||||||
|
oficial: true,
|
||||||
|
popular: false,
|
||||||
|
titulo: "BSP ESP32-S3-Korvo-2",
|
||||||
|
descricao: "Board Support Package para o kit de desenvolvimento de áudio e reconhecimento de voz ESP32-S3-Korvo-2, com suporte a microfones I2S e botões de toque.",
|
||||||
|
tags: ["BSP", "Korvo", "Áudio", "Array de Microfones", "ESP-SR"],
|
||||||
|
chips: ["ESP32-S3"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/esp32_s3_korvo_2",
|
||||||
|
urlRepo: "https://github.com/espressif/esp-bsp/tree/master/bsp/esp32_s3_korvo_2",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/esp32_s3_korvo_2: "^1.1.0"`
|
||||||
|
},
|
||||||
|
|
||||||
|
// Sistema & Utilitários
|
||||||
|
{
|
||||||
|
id: "joltwallet-littlefs",
|
||||||
|
namespace: "joltwallet",
|
||||||
|
name: "littlefs",
|
||||||
|
versao: "^1.14.8",
|
||||||
|
categoria: "sistema_utilitarios",
|
||||||
|
oficial: false,
|
||||||
|
popular: true,
|
||||||
|
titulo: "LittleFS Filesystem for ESP-IDF",
|
||||||
|
descricao: "Port robusto do sistema de arquivos LittleFS para memória Flash SPI com wear-leveling dinâmico e proteção contra corrupção por queda de energia.",
|
||||||
|
tags: ["LittleFS", "Flash", "Filesystem", "Wear Leveling", "NVS"],
|
||||||
|
chips: ["ESP32", "ESP32-S2", "ESP32-S3", "ESP32-C3", "ESP32-C6", "ESP32-H2", "ESP32-P4"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/joltwallet/littlefs",
|
||||||
|
urlRepo: "https://github.com/joltwallet/esp_littlefs",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
joltwallet/littlefs: "^1.14.8"`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "espressif-cbor",
|
||||||
|
namespace: "espressif",
|
||||||
|
name: "cbor",
|
||||||
|
versao: "^0.6.0",
|
||||||
|
categoria: "sistema_utilitarios",
|
||||||
|
oficial: true,
|
||||||
|
popular: false,
|
||||||
|
titulo: "TinyCBOR Serialization",
|
||||||
|
descricao: "Biblioteca ultraleve para serialização e deserialização de dados em formato binário CBOR (Concise Binary Object Representation).",
|
||||||
|
tags: ["CBOR", "Serialização", "Binário", "IoT Protocol", "JSON Compacto"],
|
||||||
|
chips: ["ESP32", "ESP32-S2", "ESP32-S3", "ESP32-C3", "ESP32-C6", "ESP32-H2", "ESP32-P4"],
|
||||||
|
urlRegistry: "https://components.espressif.com/components/espressif/cbor",
|
||||||
|
urlRepo: "https://github.com/espressif/tinycbor",
|
||||||
|
exemploYaml: `dependencies:
|
||||||
|
espressif/cbor: "^0.6.0"`
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
export const GUIA_COMPONENT_MANAGER = {
|
||||||
|
titulo: "Como Usar o ESP Component Registry no ESP-IDF",
|
||||||
|
resumo: "A partir do ESP-IDF v4.4 e consolidado no v5.x+, a Espressif adotou a arquitetura de pacotes modulares gerenciada pelo IDF Component Manager. Esqueça submódulos git complexos: agora basta declarar as bibliotecas no arquivo de manifesto idf_component.yml do seu projeto.",
|
||||||
|
vantagens: [
|
||||||
|
{
|
||||||
|
titulo: "Instalação Automática e Desacoplada",
|
||||||
|
descricao: "O compilador baixa, compila e gerencia as versões das bibliotecas automaticamente durante o 'idf.py build' ou 'idf.py reconfigure'."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
titulo: "Versionamento Semântico Rigoroso",
|
||||||
|
descricao: "Controle exatamente quando atualizar com operadores de versão (^ para compatibilidade minor, ~ para patches ou versões exatas fixas)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
titulo: "Projetos mais Leves e Limpos",
|
||||||
|
descricao: "O repositório do seu projeto fica limpo, sem carregar código de terceiros dentro do histórico do Git."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
titulo: "Compartilhamento Corporativo ou Comunitário",
|
||||||
|
descricao: "Publique seus próprios componentes na nuvem pública da Espressif ou em registros privados locais da sua empresa."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
comandosCli: [
|
||||||
|
{
|
||||||
|
comando: 'idf.py add-dependency "namespace/componente^versao"',
|
||||||
|
exemplo: 'idf.py add-dependency "espressif/esp_lvgl_port^2.4.0"',
|
||||||
|
explicacao: "Cria ou atualiza automaticamente o arquivo 'main/idf_component.yml' adicionando a dependência informada."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
comando: "idf.py reconfigure",
|
||||||
|
exemplo: "idf.py reconfigure",
|
||||||
|
explicacao: "Força o CMake e o Component Manager a resolver novamente a árvore de dependências e baixar pacotes pendentes."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
comando: "compote component upload --name <component_name> --namespace <sua_org>",
|
||||||
|
exemplo: "compote component upload --name meu_driver_sensor --namespace minhadiv",
|
||||||
|
explicacao: "Publica seu componente de código aberto ou proprietário no ESP Component Registry usando a ferramenta oficial Compote CLI."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
sintaxeManifesto: `# Estrutura típica do arquivo: main/idf_component.yml
|
||||||
|
dependencies:
|
||||||
|
# Baixa do registro oficial da Espressif
|
||||||
|
espressif/esp_lvgl_port: "^2.4.0"
|
||||||
|
espressif/button: "~3.4.0"
|
||||||
|
|
||||||
|
# Versão exata
|
||||||
|
espressif/led_indicator: "1.2.0"
|
||||||
|
|
||||||
|
# Dependência da comunidade
|
||||||
|
joltwallet/littlefs: "^1.14.8"
|
||||||
|
|
||||||
|
# Dependência local no seu disco (opcional)
|
||||||
|
# meu_driver_local:
|
||||||
|
# path: "../../components/meu_driver"`
|
||||||
|
};
|
||||||
+147
-2
@@ -1,6 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* Base de dados estruturada para o Guia de Diagnóstico, Erros Comuns e Resolução de Problemas no ESP32.
|
* Base de dados estruturada para o Guia de Diagnóstico, Erros Comuns e Resolução de Problemas no ESP32.
|
||||||
* Abrange 6 categorias técnicas com causas raízes, comparativos de boas práticas vs gambiarras e exemplos de código.
|
* Abrange 6 categorias técnicas com causas raízes, comparativos de boas práticas vs gambiarras e exemplos de código
|
||||||
|
* em Arduino C++, ESP-IDF (C) e MicroPython.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export const categoriasDiagnostico = [
|
export const categoriasDiagnostico = [
|
||||||
@@ -102,6 +103,26 @@ void app_main(void) {
|
|||||||
// Para mitigar picos em ambientes com limite de potência:
|
// Para mitigar picos em ambientes com limite de potência:
|
||||||
esp_wifi_set_max_tx_power(68); // 68 = 17dBm (unidades de 0.25dBm)
|
esp_wifi_set_max_tx_power(68); // 68 = 17dBm (unidades de 0.25dBm)
|
||||||
}`,
|
}`,
|
||||||
|
codigoMicroPython: `# Conexão Wi-Fi segura no MicroPython com estabilização:
|
||||||
|
import network
|
||||||
|
import time
|
||||||
|
|
||||||
|
wlan = network.WLAN(network.STA_IF)
|
||||||
|
wlan.active(True)
|
||||||
|
|
||||||
|
# Aguarda estabilização da alimentação antes de iniciar transmissão
|
||||||
|
time.sleep_ms(200)
|
||||||
|
wlan.connect("SSID", "SENHA")
|
||||||
|
|
||||||
|
tentativas = 0
|
||||||
|
while not wlan.isconnected() and tentativas < 30:
|
||||||
|
time.sleep_ms(200)
|
||||||
|
tentativas += 1
|
||||||
|
|
||||||
|
if wlan.isconnected():
|
||||||
|
print("Wi-Fi Conectado! IP:", wlan.ifconfig()[0])
|
||||||
|
else:
|
||||||
|
print("[ERRO] Falha ao conectar Wi-Fi")`,
|
||||||
dicaPro: "Se estiver projetando sua própria PCB, coloque um plano de terra sólido sob o módulo e trilhas de alimentação com largura mínima de 0.5mm a 1mm para suportar os surtos de corrente sem queda resistiva (IR drop).",
|
dicaPro: "Se estiver projetando sua própria PCB, coloque um plano de terra sólido sob o módulo e trilhas de alimentação com largura mínima de 0.5mm a 1mm para suportar os surtos de corrente sem queda resistiva (IR drop).",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -139,6 +160,15 @@ void app_main(void) {
|
|||||||
// Se você usa ESP32 clássico e precisa liberar GPIO12, pode queimar o eFuse de 3.3V:
|
// Se você usa ESP32 clássico e precisa liberar GPIO12, pode queimar o eFuse de 3.3V:
|
||||||
// espefuse.py --port /dev/ttyUSB0 set_flash_voltage 3.3V
|
// espefuse.py --port /dev/ttyUSB0 set_flash_voltage 3.3V
|
||||||
// Isso desativa a amostragem de hardware no GPIO12 para sempre.`,
|
// Isso desativa a amostragem de hardware no GPIO12 para sempre.`,
|
||||||
|
codigoMicroPython: `# Configuração correta de pinos no MicroPython:
|
||||||
|
from machine import Pin
|
||||||
|
|
||||||
|
# ✅ Pinos seguros para saídas e botões com pull-up interno:
|
||||||
|
led = Pin(2, Pin.OUT) # GPIO 2
|
||||||
|
botao = Pin(4, Pin.IN, Pin.PULL_UP) # GPIO 4 (seguro)
|
||||||
|
|
||||||
|
# ⚠️ Pinos 34, 35, 36, 39 são APENAS ENTRADA e não têm pull-up interno:
|
||||||
|
sensor_analogico = Pin(36, Pin.IN) # Correto (requer resistor externo se for botão)`,
|
||||||
dicaPro: "Lembre-se sempre: pinos 'Input-Only' (GPI 34 a 39 no ESP32 clássico) não possuem circuitos de pull-up/pull-down de silício nem transistores de saída. Sensores analógicos ou botões neles exigem resistores de pull-up externos.",
|
dicaPro: "Lembre-se sempre: pinos 'Input-Only' (GPI 34 a 39 no ESP32 clássico) não possuem circuitos de pull-up/pull-down de silício nem transistores de saída. Sensores analógicos ou botões neles exigem resistores de pull-up externos.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -190,6 +220,23 @@ esp_err_t ler_dado(char* buffer, size_t max_len) {
|
|||||||
// Operação segura...
|
// Operação segura...
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}`,
|
}`,
|
||||||
|
codigoMicroPython: `# Prevenção contra NoneType e exceções de objeto no MicroPython:
|
||||||
|
import json
|
||||||
|
|
||||||
|
def processar_sensor(dados_raw):
|
||||||
|
# Proteção defensiva contra payload nulo:
|
||||||
|
if dados_raw is None:
|
||||||
|
print("[ERRO] Dados nulos recebidos!")
|
||||||
|
return None
|
||||||
|
|
||||||
|
try:
|
||||||
|
obj = json.loads(dados_raw)
|
||||||
|
# Uso seguro de .get() com valor padrão para evitar KeyError
|
||||||
|
temperatura = obj.get("temp", 0.0)
|
||||||
|
return temperatura
|
||||||
|
except (ValueError, AttributeError) as e:
|
||||||
|
print("Erro ao processar objeto:", e)
|
||||||
|
return None`,
|
||||||
dicaPro: "Se EXCVADDR for algo como 0x3fxxxxxx ou 0x40xxxxxx mas seu código falha, você pode estar acessando um array fora do limite (buffer overflow) que sobrescreveu ponteiros na memória.",
|
dicaPro: "Se EXCVADDR for algo como 0x3fxxxxxx ou 0x40xxxxxx mas seu código falha, você pode estar acessando um array fora do limite (buffer overflow) que sobrescreveu ponteiros na memória.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -241,6 +288,22 @@ void app_main(void) {
|
|||||||
gpio_install_isr_service(ESP_INTR_FLAG_IRAM);
|
gpio_install_isr_service(ESP_INTR_FLAG_IRAM);
|
||||||
gpio_isr_handler_add(GPIO_NUM_4, gpio_isr_handler, NULL);
|
gpio_isr_handler_add(GPIO_NUM_4, gpio_isr_handler, NULL);
|
||||||
}`,
|
}`,
|
||||||
|
codigoMicroPython: `# Tratamento seguro de interrupções (ISR) no MicroPython:
|
||||||
|
import micropython
|
||||||
|
from machine import Pin
|
||||||
|
|
||||||
|
# Aloca buffer de emergência para depurar exceções dentro de ISRs:
|
||||||
|
micropython.alloc_emergency_exception_buf(100)
|
||||||
|
|
||||||
|
contador_pulsos = 0
|
||||||
|
|
||||||
|
# Callback de interrupção: NÃO aloque memória (sem strings, sem floats novos)
|
||||||
|
def tratar_pulso(pin):
|
||||||
|
global contador_pulsos
|
||||||
|
contador_pulsos += 1
|
||||||
|
|
||||||
|
sensor = Pin(4, Pin.IN, Pin.PULL_UP)
|
||||||
|
sensor.irq(trigger=Pin.IRQ_FALLING, handler=tratar_pulso)`,
|
||||||
dicaPro: "Se você passar ESP_INTR_FLAG_IRAM ao registrar a interrupção no ESP-IDF, qualquer função chamada por essa interrupção (inclusive funções do FreeRTOS) DEVE suportar IRAM (ex: xQueueSendFromISR).",
|
dicaPro: "Se você passar ESP_INTR_FLAG_IRAM ao registrar a interrupção no ESP-IDF, qualquer função chamada por essa interrupção (inclusive funções do FreeRTOS) DEVE suportar IRAM (ex: xQueueSendFromISR).",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -293,6 +356,27 @@ void tarefa_processamento(void *pvParameters) {
|
|||||||
vTaskDelay(pdMS_TO_TICKS(50));
|
vTaskDelay(pdMS_TO_TICKS(50));
|
||||||
}
|
}
|
||||||
}`,
|
}`,
|
||||||
|
codigoMicroPython: `# Watchdog e laços não-bloqueantes com uasyncio no MicroPython:
|
||||||
|
from machine import WDT
|
||||||
|
import uasyncio as asyncio
|
||||||
|
|
||||||
|
# Inicializa o Watchdog de hardware com timeout de 5 segundos
|
||||||
|
wdt = WDT(timeout=5000)
|
||||||
|
|
||||||
|
async def tarefa_sensor():
|
||||||
|
while True:
|
||||||
|
# Alimenta o cão de guarda a cada ciclo saudável:
|
||||||
|
wdt.feed()
|
||||||
|
|
||||||
|
# Cede controle para o escalonador cooperativo:
|
||||||
|
await asyncio.sleep_ms(100)
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
asyncio.create_task(tarefa_sensor())
|
||||||
|
while True:
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
|
asyncio.run(main())`,
|
||||||
dicaPro: "No Arduino, a função delay(ms) na verdade chama internamente o vTaskDelay do FreeRTOS. Porém, loops que usam delayMicroseconds() ou operações puras de CPU não cedem tempo e podem disparar o TWDT se durarem mais de alguns segundos.",
|
dicaPro: "No Arduino, a função delay(ms) na verdade chama internamente o vTaskDelay do FreeRTOS. Porém, loops que usam delayMicroseconds() ou operações puras de CPU não cedem tempo e podem disparar o TWDT se durarem mais de alguns segundos.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -339,6 +423,17 @@ void setup() {
|
|||||||
codigoEspIdf: `// Habilite a checagem dupla de Stack no menuconfig:
|
codigoEspIdf: `// Habilite a checagem dupla de Stack no menuconfig:
|
||||||
// Component config -> FreeRTOS -> Set a end of stack check -> Option 2 (Check by Stack Canary)
|
// Component config -> FreeRTOS -> Set a end of stack check -> Option 2 (Check by Stack Canary)
|
||||||
// Isso detecta o estouro ANTES que dados sejam corrompidos em tempo de execução.`,
|
// Isso detecta o estouro ANTES que dados sejam corrompidos em tempo de execução.`,
|
||||||
|
codigoMicroPython: `# Monitoramento de memória e pilha no MicroPython:
|
||||||
|
import gc
|
||||||
|
import micropython
|
||||||
|
|
||||||
|
# Exibe estatísticas de memória RAM e pilha da VM do Python:
|
||||||
|
micropython.mem_info()
|
||||||
|
|
||||||
|
# Executa garbage collector para liberar blocos órfãos:
|
||||||
|
gc.collect()
|
||||||
|
print("Memória Heap Livre:", gc.mem_free(), "bytes")
|
||||||
|
print("Memória Heap Alocada:", gc.mem_alloc(), "bytes")`,
|
||||||
dicaPro: "Se a sua função precisa processar um JSON ou pacote HTTP esporadicamente, aloque o buffer no Heap apenas durante o processamento e libere-o logo em seguida, em vez de inflar o Stack permanente da tarefa.",
|
dicaPro: "Se a sua função precisa processar um JSON ou pacote HTTP esporadicamente, aloque o buffer no Heap apenas durante o processamento e libere-o logo em seguida, em vez de inflar o Stack permanente da tarefa.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -387,6 +482,23 @@ void inspecionar_memoria(void) {
|
|||||||
|
|
||||||
ESP_LOGI("HEAP", "Total livre: %d bytes | Maior bloco continuo: %d bytes", livre_total, maior_bloco);
|
ESP_LOGI("HEAP", "Total livre: %d bytes | Maior bloco continuo: %d bytes", livre_total, maior_bloco);
|
||||||
}`,
|
}`,
|
||||||
|
codigoMicroPython: `# Prevenção de fragmentação de Heap no MicroPython:
|
||||||
|
import gc
|
||||||
|
|
||||||
|
# 1. Habilita coleta automática
|
||||||
|
gc.enable()
|
||||||
|
|
||||||
|
# 2. Pré-aloque bytearrays para reaproveitamento em vez de criar novas strings:
|
||||||
|
buffer_leitura = bytearray(256)
|
||||||
|
|
||||||
|
def ler_sensor_sem_alocacao(stream):
|
||||||
|
# Lê reutilizando o mesmo espaço em memória (Zero-Allocation):
|
||||||
|
bytes_lidos = stream.readinto(buffer_leitura)
|
||||||
|
return buffer_leitura[:bytes_lidos]
|
||||||
|
|
||||||
|
# 3. Dispare o GC antes de abrir conexões pesadas (como HTTPS / TLS):
|
||||||
|
gc.collect()
|
||||||
|
print(f"Heap Livre: {gc.mem_free()} B | Alocado: {gc.mem_alloc()} B")`,
|
||||||
dicaPro: "Se o maior bloco contíguo livre for menor que 35KB ~ 40KB, conexões HTTPS/TLS modernas falharão durante o handshake de certificados.",
|
dicaPro: "Se o maior bloco contíguo livre for menor que 35KB ~ 40KB, conexões HTTPS/TLS modernas falharão durante o handshake de certificados.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -431,6 +543,15 @@ void setup() {
|
|||||||
uint8_t* alocar_buffer_spi(size_t len) {
|
uint8_t* alocar_buffer_spi(size_t len) {
|
||||||
return (uint8_t*) heap_caps_aligned_alloc(4, len, MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL);
|
return (uint8_t*) heap_caps_aligned_alloc(4, len, MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL);
|
||||||
}`,
|
}`,
|
||||||
|
codigoMicroPython: `# No MicroPython, verifique a memória PSRAM disponível:
|
||||||
|
import gc
|
||||||
|
import esp32
|
||||||
|
|
||||||
|
# Se o firmware foi compilado com suporte a SPIRAM (ex: firmwares com 'SPIRAM'):
|
||||||
|
print("Memória total acessível no MicroPython:", gc.mem_free() + gc.mem_alloc(), "bytes")
|
||||||
|
|
||||||
|
# Para operações rápidas com periféricos, use bytearrays contíguos:
|
||||||
|
buffer_spi = bytearray(1024)`,
|
||||||
dicaPro: "No ESP32-P4, a arquitetura avançada de barramento AXI permite DMA em certas regiões externas, mas para toda a linha ESP32/S2/S3/C3 a regra da SRAM interna é estrita.",
|
dicaPro: "No ESP32-P4, a arquitetura avançada de barramento AXI permite DMA em certas regiões externas, mas para toda a linha ESP32/S2/S3/C3 a regra da SRAM interna é estrita.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -463,6 +584,12 @@ uint8_t* alocar_buffer_spi(size_t len) {
|
|||||||
// idf.py -p /dev/ttyUSB0 -b 460800 flash
|
// idf.py -p /dev/ttyUSB0 -b 460800 flash
|
||||||
// Se o upload falhar em altas velocidades, reduza a taxa de baud rate para 115200:
|
// Se o upload falhar em altas velocidades, reduza a taxa de baud rate para 115200:
|
||||||
// idf.py -p /dev/ttyUSB0 -b 115200 flash`,
|
// idf.py -p /dev/ttyUSB0 -b 115200 flash`,
|
||||||
|
codigoMicroPython: `# Gravação do firmware MicroPython oficial no ESP32 via terminal:
|
||||||
|
# 1. Apague a memória Flash:
|
||||||
|
# esptool.py --port /dev/ttyUSB0 erase_flash
|
||||||
|
|
||||||
|
# 2. Grave o binário com taxa de baud segura:
|
||||||
|
# esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 460800 write_flash -z 0x1000 ESP32_GENERIC-*.bin`,
|
||||||
dicaPro: "Se estiver usando módulos ESP32-S3 ou C3 com USB nativo (Direct USB-JTAG), certifique-se de que a porta correta selecionada é a porta CDC/JTAG e não a UART legada.",
|
dicaPro: "Se estiver usando módulos ESP32-S3 ou C3 com USB nativo (Direct USB-JTAG), certifique-se de que a porta correta selecionada é a porta CDC/JTAG e não a UART legada.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -518,6 +645,24 @@ void inicializar_sntp(void) {
|
|||||||
|
|
||||||
// Aguarda sincronização do relógio...
|
// Aguarda sincronização do relógio...
|
||||||
}`,
|
}`,
|
||||||
|
codigoMicroPython: `# Sincronização SNTP e requisições HTTPS no MicroPython:
|
||||||
|
import ntptime
|
||||||
|
import time
|
||||||
|
import urequests
|
||||||
|
|
||||||
|
def sincronizar_e_requisitar():
|
||||||
|
try:
|
||||||
|
print("Sincronizando relógio via NTP...")
|
||||||
|
ntptime.host = "pool.ntp.br"
|
||||||
|
ntptime.settime() # Atualiza o RTC interno do ESP32 via NTP
|
||||||
|
print("Hora sincronizada UTC:", time.localtime())
|
||||||
|
|
||||||
|
# Agora o handshake TLS validará o certificado sem o erro -0x2700:
|
||||||
|
resposta = urequests.get("https://api.github.com")
|
||||||
|
print("Resposta HTTPS:", resposta.status_code)
|
||||||
|
resposta.close()
|
||||||
|
except Exception as e:
|
||||||
|
print("[ERRO TLS/NTP]:", e)`,
|
||||||
dicaPro: "Se seu projeto opera em ambientes sem acesso à internet externa (rede local isolada), configure um servidor NTP local no roteador ou adicione um módulo RTC físico como o DS3231 via I2C.",
|
dicaPro: "Se seu projeto opera em ambientes sem acesso à internet externa (rede local isolada), configure um servidor NTP local no roteador ou adicione um módulo RTC físico como o DS3231 via I2C.",
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
@@ -584,7 +729,7 @@ export const regrasDecodificadorLog = [
|
|||||||
explicacao:
|
explicacao:
|
||||||
"O ESP32 tentou autenticar um certificado HTTPS/TLS com a data zerada na época Unix (01/01/1970).",
|
"O ESP32 tentou autenticar um certificado HTTPS/TLS com a data zerada na época Unix (01/01/1970).",
|
||||||
acaoRecomendada:
|
acaoRecomendada:
|
||||||
"Sincronize o horário via SNTP (`configTime`) antes de iniciar requisições HTTPS seguras.",
|
"Sincronize o horário via SNTP (`configTime` no Arduino ou `ntptime.settime()` no MicroPython) antes de iniciar requisições HTTPS seguras.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
padrao: /rst:0x1 \(POWERON_RESET\),boot:0x[0-9a-fA-F]+/i,
|
padrao: /rst:0x1 \(POWERON_RESET\),boot:0x[0-9a-fA-F]+/i,
|
||||||
|
|||||||
+45
-14
@@ -1,25 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Exemplo ESP-IDF v5.x+ para ESP32
|
||||||
|
* Demonstração de inicialização do sistema, gerenciamento de tarefas FreeRTOS e log unificado
|
||||||
|
*
|
||||||
|
* Gerenciamento de componentes (main/idf_component.yml):
|
||||||
|
* dependencies:
|
||||||
|
* espressif/led_strip: "^2.5.0"
|
||||||
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
#include "driver/gpio.h"
|
#include "driver/gpio.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "esp_system.h"
|
||||||
|
#include "esp_chip_info.h"
|
||||||
|
|
||||||
#define LED_PIN GPIO_NUM_2 // LED onboard (ajuste conforme sua placa)
|
static const char *TAG = "main_app";
|
||||||
|
|
||||||
|
#define BLINK_GPIO GPIO_NUM_2 // Ajuste conforme o pino do LED da sua placa
|
||||||
|
|
||||||
|
static void blink_task(void *pvParameters)
|
||||||
|
{
|
||||||
|
// Configura o pino GPIO com a nova API do ESP-IDF
|
||||||
|
gpio_reset_pin(BLINK_GPIO);
|
||||||
|
gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
|
||||||
|
|
||||||
|
bool led_state = false;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
led_state = !led_state;
|
||||||
|
gpio_set_level(BLINK_GPIO, led_state);
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "LED %s | Heap livre: %lu bytes",
|
||||||
|
led_state ? "LIGADO" : "DESLIGADO",
|
||||||
|
(unsigned long)esp_get_free_heap_size());
|
||||||
|
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void app_main(void)
|
void app_main(void)
|
||||||
{
|
{
|
||||||
// Configura o pino do LED como saída
|
// Informações do chip SoC
|
||||||
gpio_reset_pin(LED_PIN);
|
esp_chip_info_t chip_info;
|
||||||
gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
|
esp_chip_info(&chip_info);
|
||||||
|
|
||||||
while (1) {
|
ESP_LOGI(TAG, "===========================================");
|
||||||
// Liga o LED
|
ESP_LOGI(TAG, " Iniciando ESP-IDF v5.x Modern Application ");
|
||||||
gpio_set_level(LED_PIN, 1);
|
ESP_LOGI(TAG, " Modelo do Chip: %d | Núcleos: %d | Rev: %d",
|
||||||
printf("LED ON\n");
|
chip_info.model, chip_info.cores, chip_info.revision);
|
||||||
vTaskDelay(pdMS_TO_TICKS(1000)); // Espera 1 segundo
|
ESP_LOGI(TAG, "===========================================");
|
||||||
|
|
||||||
// Desliga o LED
|
// Cria uma tarefa FreeRTOS dedicada
|
||||||
gpio_set_level(LED_PIN, 0);
|
xTaskCreate(blink_task, "blink_task", 3072, NULL, 5, NULL);
|
||||||
printf("LED OFF\n");
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(1000)); // Espera 1 segundo
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* Exemplo ESP-IoT-Solution para ESP32
|
||||||
|
* Inicialização de Botão Inteligente com Callbacks e Driver de Display/Sensores
|
||||||
|
*
|
||||||
|
* Dependência (idf_component.yml):
|
||||||
|
* espressif/button: "^3.3.0"
|
||||||
|
* espressif/led_indicator: "^1.2.0"
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "iot_button.h"
|
||||||
|
#include "led_indicator.h"
|
||||||
|
|
||||||
|
static const char *TAG = "iot_solution_app";
|
||||||
|
|
||||||
|
#define BUTTON_GPIO_NUM 0 // Botão BOOT nativo
|
||||||
|
#define LED_INDICATOR_GPIO 2 // LED indicador
|
||||||
|
|
||||||
|
static led_indicator_handle_t led_handle = NULL;
|
||||||
|
|
||||||
|
/* Callback para clique único do botão */
|
||||||
|
static void button_single_click_cb(void *arg, void *data)
|
||||||
|
{
|
||||||
|
ESP_LOGI(TAG, "Evento: Clique Único detectado!");
|
||||||
|
led_indicator_start(led_handle, BLINK_DOUBLE_FAST);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Callback para clique longo (> 3 segundos) */
|
||||||
|
static void button_long_press_cb(void *arg, void *data)
|
||||||
|
{
|
||||||
|
ESP_LOGW(TAG, "Evento: Pressionamento Longo! Acionando modo de reset de fábrica.");
|
||||||
|
led_indicator_start(led_handle, BLINK_BREATHE_FAST);
|
||||||
|
}
|
||||||
|
|
||||||
|
void app_main(void)
|
||||||
|
{
|
||||||
|
ESP_LOGI(TAG, "Iniciando ESP-IoT-Solution Component Suite");
|
||||||
|
|
||||||
|
// 1. Configuração do LED Indicator
|
||||||
|
led_indicator_gpio_config_t led_cfg = {
|
||||||
|
.is_active_level_high = true,
|
||||||
|
.gpio_num = LED_INDICATOR_GPIO,
|
||||||
|
};
|
||||||
|
led_handle = led_indicator_create(&led_cfg);
|
||||||
|
|
||||||
|
// 2. Configuração do Botão com debounce de hardware/software automático
|
||||||
|
button_config_t btn_cfg = {
|
||||||
|
.type = BUTTON_TYPE_GPIO,
|
||||||
|
.long_press_time = 3000,
|
||||||
|
.short_press_time = 180,
|
||||||
|
.gpio_button_config = {
|
||||||
|
.gpio_num = BUTTON_GPIO_NUM,
|
||||||
|
.active_level = 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
button_handle_t btn_handle = iot_button_create(&btn_cfg);
|
||||||
|
assert(btn_handle != NULL);
|
||||||
|
|
||||||
|
// Registra callbacks para diferentes gestos
|
||||||
|
iot_button_register_cb(btn_handle, BUTTON_SINGLE_CLICK, button_single_click_cb, NULL);
|
||||||
|
iot_button_register_cb(btn_handle, BUTTON_LONG_PRESS_START, button_long_press_cb, NULL);
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Drivers inicializados com sucesso! Pressione o botão GPIO 0.");
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
* Exemplo ESP-NOW para ESP32
|
||||||
|
* Comunicação Sem Fio Ponto-a-Ponto e Broadcast sem roteador Wi-Fi
|
||||||
|
*
|
||||||
|
* Protocolo nativo integrado no ESP-IDF
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
#include "esp_wifi.h"
|
||||||
|
#include "esp_now.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "nvs_flash.h"
|
||||||
|
|
||||||
|
static const char *TAG = "esp_now_demo";
|
||||||
|
|
||||||
|
// Estrutura de dados enviada no pacote
|
||||||
|
typedef struct {
|
||||||
|
uint32_t sensor_id;
|
||||||
|
float temperatura;
|
||||||
|
float umidade;
|
||||||
|
uint32_t tempo_ms;
|
||||||
|
} __attribute__((packed)) dados_pacote_t;
|
||||||
|
|
||||||
|
// Endereço MAC de Broadcast (envia para todos os nós ESP-NOW por perto)
|
||||||
|
static const uint8_t broadcast_mac[ESP_NOW_ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
|
||||||
|
|
||||||
|
/* Callback executado ao enviar um pacote */
|
||||||
|
static void on_data_sent(const uint8_t *mac_addr, esp_now_send_status_t status)
|
||||||
|
{
|
||||||
|
ESP_LOGI(TAG, "Envio concluído: %s", status == ESP_NOW_SEND_SUCCESS ? "SUCESSO (ACK)" : "FALHA");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Callback executado ao receber um pacote de outro ESP32 */
|
||||||
|
static void on_data_recv(const esp_now_recv_info_t *recv_info, const uint8_t *data, int len)
|
||||||
|
{
|
||||||
|
if (len == sizeof(dados_pacote_t)) {
|
||||||
|
dados_pacote_t *pct = (dados_pacote_t *)data;
|
||||||
|
ESP_LOGI(TAG, "Pacote recebido de [%02X:%02X:%02X:%02X:%02X:%02X]: Sensor #%ld | Temp: %.1f C | Umid: %.1f %%",
|
||||||
|
recv_info->src_addr[0], recv_info->src_addr[1], recv_info->src_addr[2],
|
||||||
|
recv_info->src_addr[3], recv_info->src_addr[4], recv_info->src_addr[5],
|
||||||
|
pct->sensor_id, pct->temperatura, pct->umidade);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void app_main(void)
|
||||||
|
{
|
||||||
|
// Inicializa NVS e Wi-Fi em modo Station
|
||||||
|
nvs_flash_init();
|
||||||
|
esp_netif_init();
|
||||||
|
esp_event_loop_create_default();
|
||||||
|
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
||||||
|
esp_wifi_init(&cfg);
|
||||||
|
esp_wifi_set_mode(WIFI_MODE_STA);
|
||||||
|
esp_wifi_start();
|
||||||
|
|
||||||
|
// Inicializa o protocolo ESP-NOW
|
||||||
|
ESP_ERROR_CHECK(esp_now_init());
|
||||||
|
esp_now_register_send_cb(on_data_sent);
|
||||||
|
esp_now_register_recv_cb(on_data_recv);
|
||||||
|
|
||||||
|
// Registra o peer de Broadcast
|
||||||
|
esp_now_peer_info_t peer_info = {
|
||||||
|
.channel = 1,
|
||||||
|
.ifidx = WIFI_IF_STA,
|
||||||
|
.encrypt = false,
|
||||||
|
};
|
||||||
|
memcpy(peer_info.peer_addr, broadcast_mac, ESP_NOW_ETH_ALEN);
|
||||||
|
ESP_ERROR_CHECK(esp_now_add_peer(&peer_info));
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "ESP-NOW pronto! Enviando telemetria a cada 3 segundos...");
|
||||||
|
|
||||||
|
dados_pacote_t telemetria = {
|
||||||
|
.sensor_id = 101,
|
||||||
|
.temperatura = 24.8f,
|
||||||
|
.umidade = 58.2f,
|
||||||
|
};
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
telemetria.tempo_ms = esp_log_timestamp();
|
||||||
|
telemetria.temperatura += ((float)(rand() % 10) - 5.0f) / 10.0f;
|
||||||
|
|
||||||
|
esp_err_t res = esp_now_send(broadcast_mac, (uint8_t *)&telemetria, sizeof(telemetria));
|
||||||
|
if (res != ESP_OK) {
|
||||||
|
ESP_LOGE(TAG, "Erro ao disparar envio ESP-NOW: %d", res);
|
||||||
|
}
|
||||||
|
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(3000));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* Exemplo ESP-RainMaker para ESP32
|
||||||
|
* Dispositivo: Interruptor Inteligente com controle via App e Nuvem
|
||||||
|
*
|
||||||
|
* Dependência (idf_component.yml):
|
||||||
|
* espressif/esp_rainmaker: "^1.4.0"
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "nvs_flash.h"
|
||||||
|
|
||||||
|
#include <esp_rmaker_core.h>
|
||||||
|
#include <esp_rmaker_standard_params.h>
|
||||||
|
#include <esp_rmaker_standard_devices.h>
|
||||||
|
#include <app_wifi.h>
|
||||||
|
|
||||||
|
static const char *TAG = "app_rainmaker";
|
||||||
|
static esp_rmaker_device_t *switch_device;
|
||||||
|
|
||||||
|
/* Callback acionado quando o usuário altera o estado no App móvel */
|
||||||
|
static esp_err_t write_cb(const esp_rmaker_device_t *dev, const esp_rmaker_param_val_t val, void *priv_data, esp_rmaker_write_ctx_t *ctx)
|
||||||
|
{
|
||||||
|
if (ctx) {
|
||||||
|
ESP_LOGI(TAG, "Comando recebido via %s", esp_rmaker_device_cb_src_to_str(ctx->src));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool state = val.val.b;
|
||||||
|
ESP_LOGI(TAG, "Estado do interruptor alterado para: %s", state ? "LIGADO" : "DESLIGADO");
|
||||||
|
|
||||||
|
// Atualiza o parâmetro na nuvem e no aplicativo
|
||||||
|
esp_rmaker_param_update_and_report(priv_data, val);
|
||||||
|
return ESP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void app_main(void)
|
||||||
|
{
|
||||||
|
// Inicialização da memória não-volátil (NVS)
|
||||||
|
esp_err_t err = nvs_flash_init();
|
||||||
|
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
|
||||||
|
ESP_ERROR_CHECK(nvs_flash_erase());
|
||||||
|
err = nvs_flash_init();
|
||||||
|
}
|
||||||
|
ESP_ERROR_CHECK(err);
|
||||||
|
|
||||||
|
// Inicializa o provisionamento Wi-Fi
|
||||||
|
app_wifi_init();
|
||||||
|
|
||||||
|
// Configura o nó RainMaker
|
||||||
|
esp_rmaker_config_t rainmaker_cfg = {
|
||||||
|
.enable_time_sync = true,
|
||||||
|
};
|
||||||
|
esp_rmaker_node_t *node = esp_rmaker_node_init(&rainmaker_cfg, "ESP32_SmartSwitch", "Switch");
|
||||||
|
|
||||||
|
// Cria o dispositivo padrão 'Switch'
|
||||||
|
switch_device = esp_rmaker_switch_device_create("Luz Sala", NULL, true);
|
||||||
|
|
||||||
|
// Registra callback de escrita
|
||||||
|
esp_rmaker_device_add_cb(switch_device, write_cb, NULL);
|
||||||
|
esp_rmaker_node_add_device(node, switch_device);
|
||||||
|
|
||||||
|
// Habilita serviços adicionais (OTA e Timezone)
|
||||||
|
esp_rmaker_ota_enable_default();
|
||||||
|
esp_rmaker_timezone_service_enable();
|
||||||
|
|
||||||
|
// Inicia o agente RainMaker
|
||||||
|
esp_rmaker_start();
|
||||||
|
|
||||||
|
// Inicia o provisionamento Wi-Fi via BLE (abre no app oficial RainMaker)
|
||||||
|
app_wifi_start(POP_TYPE_RANDOM);
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Nó RainMaker pronto! Escaneie o QR Code no app ESP RainMaker.");
|
||||||
|
}
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* Exemplo ESP-SR para ESP32-S3 / ESP32-P4
|
||||||
|
* Reconhecimento de Fala Local Offline (WakeNet + MultiNet)
|
||||||
|
*
|
||||||
|
* Dependência (idf_component.yml):
|
||||||
|
* espressif/esp-sr: "^1.5.0"
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "esp_wn_iface.h"
|
||||||
|
#include "esp_wn_models.h"
|
||||||
|
#include "esp_mn_iface.h"
|
||||||
|
#include "esp_mn_models.h"
|
||||||
|
#include "esp_afe_sr_iface.h"
|
||||||
|
#include "esp_afe_sr_models.h"
|
||||||
|
|
||||||
|
static const char *TAG = "app_voice_sr";
|
||||||
|
|
||||||
|
void feed_audio_task(void *arg)
|
||||||
|
{
|
||||||
|
esp_afe_sr_data_t *afe_data = (esp_afe_sr_data_t *)arg;
|
||||||
|
int audio_chunksize = afe_handle->get_feed_chunksize(afe_data);
|
||||||
|
int16_t *feed_buff = (int16_t *)malloc(audio_chunksize * sizeof(int16_t) * 2);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
// Leitura de áudio I2S dos microfones da placa
|
||||||
|
// i2s_read(I2S_NUM_0, feed_buff, ...);
|
||||||
|
|
||||||
|
afe_handle->feed(afe_data, feed_buff);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
|
}
|
||||||
|
free(feed_buff);
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void speech_recognition_task(void *arg)
|
||||||
|
{
|
||||||
|
esp_afe_sr_data_t *afe_data = (esp_afe_sr_data_t *)arg;
|
||||||
|
const esp_afe_sr_iface_t *afe_handle = &ESP_AFE_SR_HANDLE;
|
||||||
|
|
||||||
|
// Inicializa o modelo de comandos de fala (MultiNet)
|
||||||
|
const esp_mn_iface_t *multinet = &ESP_MN_HANDLE;
|
||||||
|
model_iface_data_t *model_data = multinet->create(&MULTINET_MODEL, 6000);
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Aguardando palavra-chave de ativação (ex: 'Hi, ESP')...");
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
afe_fetch_result_t *res = afe_handle->fetch(afe_data);
|
||||||
|
if (!res || res->ret_value == ESP_FAIL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1. Verificação de Wake Word (Palavra de ativação)
|
||||||
|
if (res->wake_word_detected == WAKENET_DETECTED) {
|
||||||
|
ESP_LOGW(TAG, ">>> PALAVRA-CHAVE DETECTADA! Canal de escuta aberto.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Reconhecimento de comando local
|
||||||
|
if (res->raw_data_size > 0) {
|
||||||
|
esp_mn_state_t mn_state = multinet->detect(model_data, res->data);
|
||||||
|
|
||||||
|
if (mn_state == ESP_MN_STATE_DETECTED) {
|
||||||
|
esp_mn_results_t *mn_res = multinet->get_results(model_data);
|
||||||
|
ESP_LOGI(TAG, ">>> COMANDO RECONHECIDO: ID #%d (Frase correspondente)", mn_res->command_id[0]);
|
||||||
|
|
||||||
|
// Exemplo de ação
|
||||||
|
if (mn_res->command_id[0] == 1) {
|
||||||
|
ESP_LOGI(TAG, "Ação: Ligar Luz da Sala");
|
||||||
|
} else if (mn_res->command_id[0] == 2) {
|
||||||
|
ESP_LOGI(TAG, "Ação: Desligar Luz da Sala");
|
||||||
|
}
|
||||||
|
} else if (mn_state == ESP_MN_STATE_TIMEOUT) {
|
||||||
|
ESP_LOGI(TAG, "Tempo esgotado. Retornando ao modo de escuta de Wake Word.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void app_main(void)
|
||||||
|
{
|
||||||
|
ESP_LOGI(TAG, "Iniciando ESP-SR Speech Recognition Engine");
|
||||||
|
|
||||||
|
// Configura o pipeline de Audio Front-End (AEC, BSS, VAD, WakeNet)
|
||||||
|
afe_config_t afe_config = AFE_CONFIG_DEFAULT();
|
||||||
|
afe_config.wakenet_init = true;
|
||||||
|
afe_config.voice_communication_init = false;
|
||||||
|
|
||||||
|
esp_afe_sr_data_t *afe_data = ESP_AFE_SR_HANDLE.create_from_config(&afe_config);
|
||||||
|
|
||||||
|
// Cria as tarefas de alimentação de áudio e reconhecimento
|
||||||
|
xTaskCreatePinnedToCore(feed_audio_task, "feed_task", 4096, afe_data, 5, NULL, 0);
|
||||||
|
xTaskCreatePinnedToCore(speech_recognition_task, "sr_task", 8192, afe_data, 5, NULL, 1);
|
||||||
|
}
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* Exemplo ESP-Zigbee-SDK para ESP32-H2 e ESP32-C6 (IEEE 802.15.4)
|
||||||
|
* Dispositivo: Lâmpada Inteligente Zigbee 3.0 (Home Automation End Device)
|
||||||
|
*
|
||||||
|
* Dependência (idf_component.yml):
|
||||||
|
* espressif/esp-zigbee-lib: "^1.6.0"
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "nvs_flash.h"
|
||||||
|
#include "esp_zigbee_core.h"
|
||||||
|
|
||||||
|
static const char *TAG = "zigbee_light_device";
|
||||||
|
|
||||||
|
#define HA_ESP_LIGHT_ENDPOINT 1
|
||||||
|
#define ESP_ZB_PRIMARY_CHANNEL_MASK (1l << 15) // Canal 15 padrão Zigbee
|
||||||
|
|
||||||
|
/* Callback de escrita em atributos Zigbee (ex: Liga/Desliga via Home Assistant) */
|
||||||
|
static esp_err_t zb_attribute_handler(const esp_zb_zcl_set_attr_value_message_t *message)
|
||||||
|
{
|
||||||
|
if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_ON_OFF) {
|
||||||
|
if (message->attribute.id == ESP_ZB_ZCL_ATTR_ON_OFF_ON_OFF_ID &&
|
||||||
|
message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_BOOL) {
|
||||||
|
bool on_off_state = message->attribute.data.value ? *(bool *)message->attribute.data.value : false;
|
||||||
|
ESP_LOGW(TAG, ">>> COMANDO ZIGBEE RECEBIDO: Lâmpada %s", on_off_state ? "LIGADA" : "DESLIGADA");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ESP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Callback de eventos da pilha Zigbee */
|
||||||
|
void esp_zb_app_signal_handler(esp_zb_app_signal_msg_t *signal_msg)
|
||||||
|
{
|
||||||
|
uint32_t *p_sg_p = signal_msg->p_app_signal;
|
||||||
|
esp_err_t err_status = signal_msg->esp_err_status;
|
||||||
|
esp_zb_app_signal_type_t sig_type = *p_sg_p;
|
||||||
|
|
||||||
|
switch (sig_type) {
|
||||||
|
case ESP_ZB_ZDO_SIGNAL_SKIP_STARTUP:
|
||||||
|
ESP_LOGI(TAG, "Iniciando comissionamento na rede Zigbee...");
|
||||||
|
esp_zb_bdb_start_top_level_commissioning(ESP_ZB_BDB_MODE_NETWORK_STEERING);
|
||||||
|
break;
|
||||||
|
case ESP_ZB_BDB_SIGNAL_STEERING:
|
||||||
|
if (err_status == ESP_OK) {
|
||||||
|
ESP_LOGI(TAG, "Conectado com sucesso à rede Zigbee 3.0!");
|
||||||
|
} else {
|
||||||
|
ESP_LOGW(TAG, "Buscando coordenador Zigbee novamente...");
|
||||||
|
esp_zb_scheduler_alarm((esp_zb_callback_t)esp_zb_bdb_start_top_level_commissioning, ESP_ZB_BDB_MODE_NETWORK_STEERING, 1000);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void esp_zb_task(void *pvParameters)
|
||||||
|
{
|
||||||
|
// Configura nó Zigbee como End Device
|
||||||
|
esp_zb_cfg_t zb_nwk_cfg = {
|
||||||
|
.esp_zb_role = ESP_ZB_DEVICE_TYPE_ED,
|
||||||
|
.install_code_policy = false,
|
||||||
|
.nwk_cfg.zed_cfg = {
|
||||||
|
.ed_timeout = ESP_ZB_ED_0_5_MIN,
|
||||||
|
.keep_alive = 3000,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
esp_zb_init(&zb_nwk_cfg);
|
||||||
|
|
||||||
|
// Cria o cluster de On/Off de iluminação residencial
|
||||||
|
esp_zb_on_off_light_cfg_t light_cfg = ESP_ZB_DEFAULT_ON_OFF_LIGHT_CONFIG();
|
||||||
|
esp_zb_ep_list_t *ep_list = esp_zb_on_off_light_ep_create(HA_ESP_LIGHT_ENDPOINT, &light_cfg);
|
||||||
|
|
||||||
|
// Registra endpoint e manipulador de atributos
|
||||||
|
esp_zb_device_register(ep_list);
|
||||||
|
esp_zb_core_action_handler_register(zb_attribute_handler);
|
||||||
|
|
||||||
|
esp_zb_set_primary_network_channel_set(ESP_ZB_PRIMARY_CHANNEL_MASK);
|
||||||
|
ESP_ERROR_CHECK(esp_zb_start(false));
|
||||||
|
esp_zb_main_loop_iteration();
|
||||||
|
}
|
||||||
|
|
||||||
|
void app_main(void)
|
||||||
|
{
|
||||||
|
ESP_ERROR_CHECK(nvs_flash_init());
|
||||||
|
|
||||||
|
// Inicializa a pilha de rádio IEEE 802.15.4
|
||||||
|
esp_zb_platform_config_t config = {
|
||||||
|
.radio_config = { .radio_mode = ZB_RADIO_MODE_NATIVE },
|
||||||
|
.host_config = { .host_connection_mode = ZB_HOST_CONNECTION_MODE_NONE },
|
||||||
|
};
|
||||||
|
ESP_ERROR_CHECK(esp_zb_platform_config(&config));
|
||||||
|
|
||||||
|
xTaskCreate(esp_zb_task, "Zigbee_main", 4096, NULL, 5, NULL);
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
//! Exemplo Rust no ESP32 usando `esp-hal` (Modo Bare-Metal / no_std)
|
||||||
|
//! Pisca um LED e envia mensagens via UART Serial com segurança de memória garantida.
|
||||||
|
//!
|
||||||
|
//! Cargo.toml:
|
||||||
|
//! esp-hal = { version = "0.22", features = ["esp32s3"] }
|
||||||
|
//! esp-println = { version = "0.12", features = ["esp32s3", "log"] }
|
||||||
|
|
||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
|
||||||
|
use esp_backtrace as _;
|
||||||
|
use esp_hal::{
|
||||||
|
clock::ClockControl,
|
||||||
|
gpio::{Io, Level, Output},
|
||||||
|
peripherals::Peripherals,
|
||||||
|
system::SystemControl,
|
||||||
|
timer::timg::TimerGroup,
|
||||||
|
delay::Delay,
|
||||||
|
prelude::*,
|
||||||
|
};
|
||||||
|
use esp_println::println;
|
||||||
|
|
||||||
|
#[entry]
|
||||||
|
fn main() -> ! {
|
||||||
|
// Inicializa periféricos do SoC com verificação em tempo de compilação
|
||||||
|
let peripherals = Peripherals::take();
|
||||||
|
let system = SystemControl::new(peripherals.SYSTEM);
|
||||||
|
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
|
||||||
|
|
||||||
|
// Configura os pinos de E/S
|
||||||
|
let io = Io::new(peripherals.GPIO, peripherals.IO_MUX);
|
||||||
|
let mut led = Output::new(io.pins.gpio2, Level::Low);
|
||||||
|
|
||||||
|
let delay = Delay::new(&clocks);
|
||||||
|
|
||||||
|
println!("🦀 Firmware Rust Bare-Metal inicializado no ESP32!");
|
||||||
|
|
||||||
|
let mut counter: u32 = 0;
|
||||||
|
|
||||||
|
loop {
|
||||||
|
// Inverte estado do LED com garantia de exclusão mútua
|
||||||
|
led.toggle();
|
||||||
|
counter += 1;
|
||||||
|
|
||||||
|
println!("Ciclo Rust #{}: LED está {:?}", counter, led.is_set_high());
|
||||||
|
delay.delay_millis(500);
|
||||||
|
}
|
||||||
|
}
|
||||||
+336
-191
@@ -3,214 +3,364 @@
|
|||||||
"nome": "ESP-IDF",
|
"nome": "ESP-IDF",
|
||||||
"icone": "⚙️",
|
"icone": "⚙️",
|
||||||
"nome_completo": "Espressif IoT Development Framework",
|
"nome_completo": "Espressif IoT Development Framework",
|
||||||
"descricao": "Framework oficial de desenvolvimento da Espressif para ESP32, baseado em FreeRTOS",
|
"descricao": "Framework oficial nativo da Espressif para todos os SoCs ESP32. Baseado em FreeRTOS multicore e CMake, oferece controle total do silício, periféricos, rádio e arquitetura de componentes modulares.",
|
||||||
"linguagem": "C / C++",
|
"linguagem": "C / C++",
|
||||||
"tipo": "Framework Base",
|
"tipo": "Framework Base Oficial",
|
||||||
"funcao_principal": "Desenvolvimento de aplicações IoT de propósito geral com acesso completo ao hardware",
|
"funcao_principal": "Desenvolvimento industrial e de alta performance com acesso direto aos registradores, RTOS em tempo real e pilha completa de protocolos",
|
||||||
"caracteristicas": [
|
"caracteristicas": [
|
||||||
"Sistema operacional em tempo real (FreeRTOS)",
|
"Sistema operacional de tempo real (FreeRTOS SMP multicore)",
|
||||||
"Pilha completa de Wi-Fi e Bluetooth",
|
"Suporte nativo ao ESP Component Registry via idf_component.yml",
|
||||||
"Suporte a todos os periféricos do ESP32",
|
"Pilha completa de conectividade Wi-Fi 4/6, BLE 5.x, Zigbee e Thread",
|
||||||
"Ferramentas de build e debug integradas",
|
"Suporte a todos os SoCs (ESP32, S2, S3, C2, C3, C6, H2, P4)",
|
||||||
"Gerenciamento de energia avançado",
|
"Gerenciamento avançado de energia e modos Deep Sleep",
|
||||||
"Suporte OTA (Over-The-Air updates)",
|
"Segurança robusta: Secure Boot v2, Flash Encryption e Crypto HW",
|
||||||
"Biblioteca de componentes extensível"
|
"Atualizações OTA criptografadas com rollback automático",
|
||||||
|
"Toolchain moderna Clang/GCC, suporte a C++23 e debug via JTAG OpenOCD"
|
||||||
],
|
],
|
||||||
"casos_uso": [
|
"casos_uso": [
|
||||||
"Dispositivos IoT conectados",
|
"Produtos comerciais e industriais de IoT",
|
||||||
"Automação residencial e industrial",
|
"Dispositivos com requisitos rigorosos de bateria e consumo",
|
||||||
"Wearables e dispositivos vestíveis",
|
"Aplicações em tempo real com controle de interrupções",
|
||||||
"Gateways e hubs de comunicação",
|
"Sistemas de segurança com criptografia de hardware",
|
||||||
"Sistemas embarcados em tempo real"
|
"Gateways multiprotocolo de alto desempenho"
|
||||||
],
|
],
|
||||||
"exemplo": "/exemplos/esp-idf.c",
|
"exemplo": "/exemplos/esp-idf.c",
|
||||||
"exemplos": "https://github.com/espressif/esp-idf/tree/master/examples",
|
"exemplos": "https://github.com/espressif/esp-idf/tree/master/examples",
|
||||||
"documentacao": "https://docs.espressif.com/projects/esp-idf/",
|
"documentacao": "https://docs.espressif.com/projects/esp-idf/en/latest/",
|
||||||
"repositorio": "https://github.com/espressif/esp-idf",
|
"repositorio": "https://github.com/espressif/esp-idf",
|
||||||
"cor": "#E74C3C"
|
"cor": "#E74C3C"
|
||||||
},
|
},
|
||||||
"ESP-ADF": {
|
"ESP-RainMaker": {
|
||||||
"nome": "ESP-ADF",
|
"nome": "ESP-RainMaker",
|
||||||
"icone": "🎵",
|
"icone": "☁️",
|
||||||
"nome_completo": "ESP Audio Development Framework",
|
"nome_completo": "ESP RainMaker AIoT Cloud Platform",
|
||||||
"descricao": "Framework especializado para aplicações de áudio no ESP32",
|
"descricao": "Plataforma completa de nuvem e firmware da Espressif para produtos conectados. Permite criar dispositivos IoT sem precisar desenvolver backend ou aplicativos móveis do zero.",
|
||||||
"linguagem": "C / C++",
|
"linguagem": "C / C++",
|
||||||
"tipo": "Framework Especializado",
|
"tipo": "Cloud & AIoT Framework",
|
||||||
"funcao_principal": "Desenvolvimento de aplicações de áudio com suporte a codecs, streaming e processamento",
|
"funcao_principal": "Construção acelerada de produtos inteligentes com aplicativo móvel (iOS/Android), nuvem AWS Serverless e controle por voz (Alexa/Google Home)",
|
||||||
"caracteristicas": [
|
"caracteristicas": [
|
||||||
"Suporte a múltiplos codecs de áudio (MP3, AAC, FLAC, WAV, etc.)",
|
"Provisionamento Wi-Fi e BLE assistido via aplicativo oficial",
|
||||||
"Pipeline de áudio configurável",
|
"Geração dinâmica de interface no app com base nos parâmetros do firmware",
|
||||||
"Streaming de áudio via HTTP, HTTPS, HLS",
|
"Integração nativa com Amazon Alexa e Google Assistant",
|
||||||
"Integração com serviços de nuvem (AWS, Google, Baidu)",
|
"Suporte a controle local (Local Control via mDNS/HTTP) e nuvem simultâneos",
|
||||||
"Reconhecimento de voz e wake word",
|
"Painel administrativo (RainMaker Dashboard) para gerenciamento de frotas e OTA",
|
||||||
"Equalização e efeitos de áudio",
|
"Compatibilidade nativa com nós Matter e Bridge de dispositivos",
|
||||||
"Suporte a Bluetooth A2DP e HFP"
|
"Biblioteca integrada via ESP Component Registry (espressif/esp_rainmaker)"
|
||||||
],
|
],
|
||||||
"casos_uso": [
|
"casos_uso": [
|
||||||
"Alto-falantes inteligentes",
|
"Eletrodomésticos e iluminação inteligente para consumidor final",
|
||||||
"Assistentes de voz",
|
"Produtos IoT com prazo reduzido de lançamento no mercado (Time-to-Market)",
|
||||||
"Rádios de internet",
|
"Dispositivos que exigem controle por app móvel sem custo de infraestrutura própria",
|
||||||
"Players de música",
|
"Sistemas de monitoramento remoto com atualização OTA centralizada"
|
||||||
"Interfones e intercomunicadores",
|
|
||||||
"Sistemas de PA (Public Address)"
|
|
||||||
],
|
],
|
||||||
"exemplo": "/exemplos/esp-adf.c",
|
"exemplo": "/exemplos/esp-rainmaker.c",
|
||||||
"exemplos": "https://github.com/espressif/esp-adf/tree/master/examples",
|
"exemplos": "https://github.com/espressif/esp-rainmaker/tree/master/examples",
|
||||||
"documentacao": "https://docs.espressif.com/projects/esp-adf/",
|
"documentacao": "https://rainmaker.espressif.com/docs/",
|
||||||
"repositorio": "https://github.com/espressif/esp-adf",
|
"repositorio": "https://github.com/espressif/esp-rainmaker",
|
||||||
"cor": "#3498DB"
|
"cor": "#3B82F6"
|
||||||
},
|
|
||||||
"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": "/exemplos/esp-dsp.c",
|
|
||||||
"exemplos": "https://github.com/espressif/esp-dsp/tree/master/examples",
|
|
||||||
"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": "/exemplos/esp-who.c",
|
|
||||||
"exemplos": "https://github.com/espressif/esp-who/tree/master/examples",
|
|
||||||
"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": "/exemplos/esp-nn.c",
|
|
||||||
"exemplos": "https://github.com/espressif/esp-nn/tree/master/test_app",
|
|
||||||
"documentacao": "https://github.com/espressif/esp-nn",
|
|
||||||
"repositorio": "https://github.com/espressif/esp-nn",
|
|
||||||
"cor": "#1ABC9C"
|
|
||||||
},
|
},
|
||||||
"ESP-Matter": {
|
"ESP-Matter": {
|
||||||
"nome": "ESP-Matter",
|
"nome": "ESP-Matter",
|
||||||
"icone": "🏠",
|
"icone": "🏠",
|
||||||
"nome_completo": "ESP Matter SDK",
|
"nome_completo": "ESP Matter SDK",
|
||||||
"descricao": "SDK para desenvolvimento de dispositivos compatíveis com o padrão Matter",
|
"descricao": "SDK oficial da Espressif para o padrão universal de casa inteligente Matter (antigo Project CHIP). Permite que seus dispositivos operem de forma interoperável com Apple HomeKit, Google Home, Amazon Alexa e Home Assistant.",
|
||||||
"linguagem": "C/C++",
|
"linguagem": "C++",
|
||||||
"tipo": "Framework Especializado",
|
"tipo": "Smart Home Framework",
|
||||||
"funcao_principal": "Criar dispositivos smart home interoperáveis usando o padrão Matter",
|
"funcao_principal": "Desenvolvimento de dispositivos e pontes inteligentes compatíveis com o padrão unificado Matter sobre Wi-Fi e Thread",
|
||||||
"caracteristicas": [
|
"caracteristicas": [
|
||||||
"Compatibilidade com padrão Matter (ex-Project CHIP)",
|
"Implementação completa dos clusters da especificação Matter",
|
||||||
"Interoperabilidade entre ecossistemas (Apple, Google, Amazon)",
|
"Suporte a transporte sobre Wi-Fi e Thread (802.15.4 em ESP32-H2 e ESP32-C6)",
|
||||||
"Suporte a Thread e Wi-Fi",
|
"Comissionamento simplificado via BLE ou On-Network",
|
||||||
"Comissionamento simplificado",
|
"Compatibilidade simultânea com Apple Home, Google Home, Alexa e SmartThings",
|
||||||
"Segurança robusta (PKI, criptografia)",
|
"Segurança baseada em certificados de autenticação de dispositivo (DAC)",
|
||||||
"Modelos de dispositivos pré-definidos",
|
"Suporte a Matter Bridge (conectando dispositivos legados Zigbee/BLE ao Matter)",
|
||||||
"Integração com ESP-IDF"
|
"Integração direta ao ESP-IDF e ESP Component Registry"
|
||||||
],
|
],
|
||||||
"casos_uso": [
|
"casos_uso": [
|
||||||
"Lâmpadas inteligentes",
|
"Lâmpadas, tomadas, interruptores e dimmers interoperáveis",
|
||||||
"Tomadas e interruptores smart",
|
"Sensores de presença, temperatura, umidade e contato",
|
||||||
"Sensores de temperatura e umidade",
|
"Fechaduras eletrônicas e atuadores de cortinas",
|
||||||
"Fechaduras inteligentes",
|
"Matter Border Routers e Bridges residenciais"
|
||||||
"Termostatos",
|
|
||||||
"Dispositivos de controle de cortinas"
|
|
||||||
],
|
],
|
||||||
"exemplo": "/exemplos/esp-matter.c",
|
"exemplo": "/exemplos/esp-matter.c",
|
||||||
"exemplos": "https://github.com/espressif/esp-matter/tree/main/examples",
|
"exemplos": "https://github.com/espressif/esp-matter/tree/main/examples",
|
||||||
"documentacao": "https://docs.espressif.com/projects/esp-matter/",
|
"documentacao": "https://docs.espressif.com/projects/esp-matter/en/latest/",
|
||||||
"repositorio": "https://github.com/espressif/esp-matter",
|
"repositorio": "https://github.com/espressif/esp-matter",
|
||||||
"cor": "#F39C12"
|
"cor": "#F59E0B"
|
||||||
},
|
},
|
||||||
"Arduino": {
|
"ESP-ADF": {
|
||||||
"nome": "Arduino",
|
"nome": "ESP-ADF",
|
||||||
"icone": "🛠️",
|
"icone": "🎵",
|
||||||
"nome_completo": "Arduino Core for ESP32",
|
"nome_completo": "ESP Audio Development Framework",
|
||||||
"descricao": "Implementação do framework Arduino para ESP32, facilitando o desenvolvimento",
|
"descricao": "Framework especializado para processamento, streaming e reprodução de áudio digital de alta qualidade em SoCs ESP32.",
|
||||||
"linguagem": "C++",
|
"linguagem": "C / C++",
|
||||||
"tipo": "Framework Alternativo",
|
"tipo": "Framework de Áudio & Voz",
|
||||||
"funcao_principal": "Desenvolvimento rápido e simplificado usando a API familiar do Arduino",
|
"funcao_principal": "Criação de pipelines de áudio flexíveis com decodificadores, streaming de rede, equalização e efeitos acústicos",
|
||||||
"caracteristicas": [
|
"caracteristicas": [
|
||||||
"API simples e intuitiva",
|
"Arquitetura de pipeline de áudio modular (Audio Elements & Audio Stream)",
|
||||||
"Grande comunidade e bibliotecas",
|
"Suporte a múltiplos codecs: MP3, AAC, FLAC, WAV, OGG, Opus e AMR",
|
||||||
"IDE Arduino integrada",
|
"Streaming de áudio via HTTP, HTTPS, HLS, RTSP e WebSockets",
|
||||||
"Suporte a Wi-Fi e Bluetooth",
|
"Suporte a Bluetooth A2DP (Sink/Source) e Bluetooth Handsfree (HFP)",
|
||||||
"Compatibilidade com bibliotecas Arduino",
|
"Algoritmos de processamento acústico (AEC, AGC, NS, equalizadores paramétricos)",
|
||||||
"Ideal para prototipagem rápida",
|
"Suporte a placas dedicadas como ESP32-LyraT e ESP32-S3-Korvo"
|
||||||
"Curva de aprendizado suave"
|
|
||||||
],
|
],
|
||||||
"casos_uso": [
|
"casos_uso": [
|
||||||
"Prototipagem rápida",
|
"Caixas de som inteligentes e internet radios",
|
||||||
"Projetos educacionais",
|
"Intercomunicadores, walkie-talkies e sistemas de interfonia VoIP",
|
||||||
"Makers e hobistas",
|
"Aparelhos de reprodução musical com PSRAM",
|
||||||
"IoT simples",
|
"Sistemas de som ambiente para automação predial"
|
||||||
"Sensores e atuadores básicos",
|
],
|
||||||
"Projetos DIY"
|
"exemplo": "/exemplos/esp-adf.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-adf/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-adf/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-adf",
|
||||||
|
"cor": "#0284C7"
|
||||||
|
},
|
||||||
|
"ESP-SR": {
|
||||||
|
"nome": "ESP-SR",
|
||||||
|
"icone": "🎙️",
|
||||||
|
"nome_completo": "ESP Speech Recognition Framework",
|
||||||
|
"descricao": "Framework de reconhecimento de fala local e processamento de áudio com IA na borda (Edge AI), permitindo comandos de voz sem depender de conexão à internet.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Framework de Voz & IA",
|
||||||
|
"funcao_principal": "Processamento de voz local, detecção de palavra de ativação (Wake Word) e reconhecimento de comandos de fala em tempo real",
|
||||||
|
"caracteristicas": [
|
||||||
|
"WakeNet: Detecção precisa de Wake Words locais (como 'Hi, ESP' e palavras personalizadas)",
|
||||||
|
"MultiNet: Reconhecimento de até centenas de comandos de voz locais offline em português, inglês e mandarim",
|
||||||
|
"AFE (Audio Front-End): Cancelamento acústico de eco (AEC), supressão de ruído (BSS/NS) e controle automático de ganho (AGC)",
|
||||||
|
"Suporte a múltiplos microfones com formação de feixe direcional (Beamforming)",
|
||||||
|
"Otimizado com aceleração vetorial SIMD para ESP32-S3 e ESP32-P4",
|
||||||
|
"Componente disponível no ESP Component Registry (espressif/esp-sr)"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Eletrodomésticos com controle por voz 100% offline e privativo",
|
||||||
|
"Painéis de automação residencial acionados por fala",
|
||||||
|
"Brinquedos interativos e robótica educacional",
|
||||||
|
"Equipamentos hospitalares e industriais com comando sem as mãos"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-sr.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-sr/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-sr/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-sr",
|
||||||
|
"cor": "#6366F1"
|
||||||
|
},
|
||||||
|
"ESP-IoT-Solution": {
|
||||||
|
"nome": "ESP-IoT-Solution",
|
||||||
|
"icone": "🧩",
|
||||||
|
"nome_completo": "ESP-IoT-Solution Driver & Peripheral Suite",
|
||||||
|
"descricao": "Coleção oficial da Espressif com dezenas de drivers, componentes de periféricos, telas touch, sensores e protocolos de barramento prontos para produção.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Biblioteca de Periféricos & Drivers",
|
||||||
|
"funcao_principal": "Acelerar a integração de componentes de hardware (telas LCD/OLED, sensores ambientais/IMU, botões inteligentes, barramentos I2C/SPI/Modbus)",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Drivers completos de sensores (temperatura, umidade, pressão, acelerômetros, luz)",
|
||||||
|
"Gerenciamento avançado de botões físicos, matrizes touch e encoders rotativos",
|
||||||
|
"Drivers para displays LCD e OLED (ST7789, ILI9341, SSD1306) e controladores touch (FT6X36, GT911)",
|
||||||
|
"Pilha industrial Modbus (Master e Slave sobre RS-485 ou TCP)",
|
||||||
|
"Controle de motores de passo e drivers de LED endereçável (WS2812/SK6812)",
|
||||||
|
"Totalmente modularizado no ESP Component Registry"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Interfaces homem-máquina (IHM / HMI) com telas e botões capacitivos",
|
||||||
|
"Estações meteorológicas e monitoramento de sensores industriais",
|
||||||
|
"Equipamentos de automação industrial integrados via RS-485 Modbus",
|
||||||
|
"Projetos com fitas e matrizes de LED RGB complexas"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-iot-solution.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-iot-solution/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-iot-solution/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-iot-solution",
|
||||||
|
"cor": "#10B981"
|
||||||
|
},
|
||||||
|
"ESP-NOW": {
|
||||||
|
"nome": "ESP-NOW & Mesh",
|
||||||
|
"icone": "📡",
|
||||||
|
"nome_completo": "ESP-NOW Protocol & Mesh-Lite",
|
||||||
|
"descricao": "Protocolo de comunicação sem fio de ultra-baixa latência desenvolvido pela Espressif, operando na faixa de 2.4 GHz sem a necessidade de um roteador Wi-Fi tradicional.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Protocolo de Rede & Mesh",
|
||||||
|
"funcao_principal": "Troca de mensagens ponto-a-ponto, broadcast e formação de redes em malha leves entre dezenas de placas ESP32",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Comunicação direta sem roteador ou ponto de acesso (AP)",
|
||||||
|
"Latência de transmissão de milissegundos e conexão instantânea",
|
||||||
|
"Criptografia nativa com chaves de chaveamento AES-128",
|
||||||
|
"Extremamente econômico em energia, ideal para nós alimentados por bateria",
|
||||||
|
"Capacidade de emparelhamento por controle remoto e broadcast para múltiplos nós",
|
||||||
|
"Suporte ao Mesh-Lite para roteamento em malha com salto IP"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Controles remotos sem fio e interruptores de parede a bateria",
|
||||||
|
"Redes de sensores agrícolas distribuídas no campo",
|
||||||
|
"Sincronização em tempo real de iluminação cênica e drones",
|
||||||
|
"Alarmes e botões de pânico residenciais"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-now.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-now/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-now",
|
||||||
|
"cor": "#8B5CF6"
|
||||||
|
},
|
||||||
|
"ESP-Zigbee-SDK": {
|
||||||
|
"nome": "ESP-Zigbee-SDK",
|
||||||
|
"icone": "🐝",
|
||||||
|
"nome_completo": "ESP Zigbee SDK (ZCL & ZBOSS)",
|
||||||
|
"descricao": "SDK oficial para desenvolvimento de nós, roteadores e coordenadores Zigbee 3.0 nos SoCs ESP32 com suporte ao rádio 802.15.4 (como ESP32-H2 e ESP32-C6).",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Smart Home & Mesh",
|
||||||
|
"funcao_principal": "Construção de redes de automação predial ultraleves e de baixíssimo consumo energético baseadas no padrão Zigbee 3.0",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Implementação certificada Zigbee 3.0 baseada na stack ZBOSS",
|
||||||
|
"Suporte a papéis de Coordenador (ZC), Roteador (ZR) e Dispositivo Final (ZED / Sleepy End Device)",
|
||||||
|
"Biblioteca rica de clusters ZCL (On/Off, Nível, Cor, Temperatura, Medição de Energia)",
|
||||||
|
"Consumo em microampères durante sono profundo para sensores operando por anos a bateria",
|
||||||
|
"Compatibilidade nativa com pontes Zigbee (Home Assistant ZHA/Zigbee2MQTT, Philips Hue)"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Sensores de presença, porta/janela e vazamento operando a pilha botão",
|
||||||
|
"Lâmpadas e tomadas inteligentes na rede Zigbee 3.0",
|
||||||
|
"Gateways e pontes Zigbee-para-Wi-Fi ou Zigbee-para-Ethernet",
|
||||||
|
"Automação predial comercial com alta densidade de nós"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-zigbee.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-zigbee-sdk/tree/main/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-zigbee-sdk/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-zigbee-sdk",
|
||||||
|
"cor": "#EC4899"
|
||||||
|
},
|
||||||
|
"ESP-WHO": {
|
||||||
|
"nome": "ESP-WHO",
|
||||||
|
"icone": "📷",
|
||||||
|
"nome_completo": "ESP Image Processing & Vision Framework",
|
||||||
|
"descricao": "Framework da Espressif para processamento de imagens e visão computacional na borda (Edge Vision) com câmeras conectadas ao ESP32.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Visão Computacional & IA",
|
||||||
|
"funcao_principal": "Detecção de rostos, identificação biométrica, detecção de pessoas e processamento de stream de vídeo",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Detecção de faces em tempo real e extração de marcos faciais (Landmarks)",
|
||||||
|
"Reconhecimento facial local com banco de dados de usuários cadastrados",
|
||||||
|
"Detecção de presença humana e contagem de pessoas (Human Detection)",
|
||||||
|
"Otimizado para ESP32-S3 e ESP32-P4 com instruções vetoriais de IA",
|
||||||
|
"Suporte a sensores de câmera DVP e MIPI-CSI (OV2640, OV3660, OV5640, SC030IOT)"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Controle de acesso por biometria facial",
|
||||||
|
"Campainhas e câmeras de segurança inteligentes (Smart Doorbells)",
|
||||||
|
"Sensores inteligentes de ocupação de salas e escritórios",
|
||||||
|
"Robôs seguidores de pessoas e brinquedos interativos"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-who.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-who/tree/master/examples",
|
||||||
|
"documentacao": "https://github.com/espressif/esp-who",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-who",
|
||||||
|
"cor": "#F97316"
|
||||||
|
},
|
||||||
|
"ESP-NN": {
|
||||||
|
"nome": "ESP-NN",
|
||||||
|
"icone": "🧠",
|
||||||
|
"nome_completo": "ESP Neural Network Acceleration Library",
|
||||||
|
"descricao": "Biblioteca de kernels e operações de redes neurais altamente otimizada para as arquiteturas Xtensa e RISC-V dos chips ESP32.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Biblioteca Especializada de IA",
|
||||||
|
"funcao_principal": "Aceleração de inferência de redes neurais profundas com quantização INT8 e INT16 aproveitando as instruções SIMD vetoriais",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Operações otimizadas: Convolução 2D, Depthwise Conv, Fully Connected e Pooling",
|
||||||
|
"Backend acelerador oficial integrado ao TensorFlow Lite for Microcontrollers (TFLM)",
|
||||||
|
"Quantização eficiente de 8 e 16 bits para redução drástica de uso de RAM e Flash",
|
||||||
|
"Aceleração extrema no ESP32-S3 e ESP32-P4 usando instruções vetoriais dedicadas",
|
||||||
|
"Execução sem overhead de sistema operacional em tempo real"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Classificação de áudio e sinais de vibração industrial (manutenção preditiva)",
|
||||||
|
"Detecção de anomalias em sensores por modelos TinyML",
|
||||||
|
"Reconhecimento de gestos por IMU",
|
||||||
|
"Visão computacional ultraleve em microcontroladores"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-nn.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-nn/tree/master/test_app",
|
||||||
|
"documentacao": "https://github.com/espressif/esp-nn",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-nn",
|
||||||
|
"cor": "#14B8A6"
|
||||||
|
},
|
||||||
|
"ESP-DSP": {
|
||||||
|
"nome": "ESP-DSP",
|
||||||
|
"icone": "📊",
|
||||||
|
"nome_completo": "ESP Digital Signal Processing Library",
|
||||||
|
"descricao": "Biblioteca oficial de processamento digital de sinais para a família ESP32, fornecendo algoritmos matemáticos acelerados em hardware.",
|
||||||
|
"linguagem": "C / C++",
|
||||||
|
"tipo": "Biblioteca Especializada de Sinais",
|
||||||
|
"funcao_principal": "Execução de cálculos matemáticos pesados como FFT, transformadas, filtragem digital e operações matriciais com máxima velocidade",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Transformadas Rápidas de Fourier (FFT real e complexa) otimizadas em Assembly",
|
||||||
|
"Filtros digitais IIR, FIR e estimadores de Kalman",
|
||||||
|
"Operações com matrizes, vetores e produtos escalares",
|
||||||
|
"Suporte a números de ponto flutuante e ponto fixo (Radix-2 e Radix-4)",
|
||||||
|
"Otimizações personalizadas para arquiteturas Xtensa Dual-Core e RISC-V"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Análise espectral de áudio e vibrações em tempo real",
|
||||||
|
"Filtros anti-ruído para sensores biomédicos (ECG/EMG) e industriais",
|
||||||
|
"Controle de motores de alta precisão e algoritmos FOC",
|
||||||
|
"Compressão e codificação de dados na borda"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/esp-dsp.c",
|
||||||
|
"exemplos": "https://github.com/espressif/esp-dsp/tree/master/examples",
|
||||||
|
"documentacao": "https://docs.espressif.com/projects/esp-dsp/en/latest/",
|
||||||
|
"repositorio": "https://github.com/espressif/esp-dsp",
|
||||||
|
"cor": "#A855F7"
|
||||||
|
},
|
||||||
|
"Rust-ESP": {
|
||||||
|
"nome": "Rust on ESP32",
|
||||||
|
"icone": "🦀",
|
||||||
|
"nome_completo": "ESP-RS Rust Ecosystem for ESP32",
|
||||||
|
"descricao": "Ecossistema moderno de desenvolvimento em linguagem Rust para a família ESP32, combinando segurança de memória (Memory Safety), concorrência robusta e alto desempenho.",
|
||||||
|
"linguagem": "Rust",
|
||||||
|
"tipo": "Linguagem & Framework Moderno",
|
||||||
|
"funcao_principal": "Desenvolvimento de firmware seguro e de alta performance tanto em modo bare-metal (no_std via esp-hal) quanto com a pilha completa (std via esp-idf-svc)",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Modo Bare-Metal `no_std` com a biblioteca `esp-hal`: controle total sem RTOS e boot ultrarrápido",
|
||||||
|
"Modo `std` com `esp-idf-svc`: acesso à biblioteca padrão do Rust, Wi-Fi, BLE, HTTP, MQTT e threads",
|
||||||
|
"Prevenção garantida em tempo de compilação contra corrupção de memória e Data Races",
|
||||||
|
"Suporte a targets Xtensa (ESP32, S2, S3) e RISC-V nativo (C2, C3, C6, H2, P4)",
|
||||||
|
"Integração com ecossistema de crates `embedded-hal` e async/await com `embassy`",
|
||||||
|
"Ferramentas oficiais: `espflash` para gravação e monitor serial e `esp-generate` para templates"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Sistemas críticos onde falhas de memória (Null Pointer, Buffer Overflow) são inaceitáveis",
|
||||||
|
"Aplicações IoT modernas com concorrência assíncrona limpa",
|
||||||
|
"Dispositivos industriais que exigem segurança de alto nível",
|
||||||
|
"Projetos modernos de robótica e instrumentação"
|
||||||
|
],
|
||||||
|
"exemplo": "/exemplos/rust-esp.rs",
|
||||||
|
"exemplos": "https://github.com/esp-rs/esp-hal/tree/main/examples",
|
||||||
|
"documentacao": "https://esp-rs.github.io/book/",
|
||||||
|
"repositorio": "https://github.com/esp-rs",
|
||||||
|
"cor": "#E44D26"
|
||||||
|
},
|
||||||
|
"Arduino": {
|
||||||
|
"nome": "Arduino Core",
|
||||||
|
"icone": "🛠️",
|
||||||
|
"nome_completo": "Arduino Core for ESP32",
|
||||||
|
"descricao": "Implementação oficial do framework Arduino sobre o ESP-IDF (versões 3.x+ baseadas em ESP-IDF v5.1+), combinando extrema facilidade com os recursos avançados do ESP32.",
|
||||||
|
"linguagem": "C++",
|
||||||
|
"tipo": "Framework Alternativo Popular",
|
||||||
|
"funcao_principal": "Prototipagem rápida, projetos educacionais e desenvolvimento acelerado aproveitando o vasto ecossistema de bibliotecas Arduino",
|
||||||
|
"caracteristicas": [
|
||||||
|
"Sintaxe clássica `setup()` e `loop()` com centenas de milhares de bibliotecas compatíveis",
|
||||||
|
"Execução como uma tarefa FreeRTOS sobre o ESP-IDF oficial",
|
||||||
|
"Suporte completo a Wi-Fi, Bluetooth Classic/BLE, WebServer e WebSockets",
|
||||||
|
"Compatibilidade com Arduino IDE 2.x, PlatformIO e VS Code",
|
||||||
|
"Suporte atualizado a todos os SoCs populares (ESP32, S2, S3, C3, C6)",
|
||||||
|
"Acesso a funções nativas do ESP-IDF quando necessário"
|
||||||
|
],
|
||||||
|
"casos_uso": [
|
||||||
|
"Prototipagem rápida e validação de conceitos (PoC)",
|
||||||
|
"Projetos educacionais, makers e acadêmicos",
|
||||||
|
"Sistemas IoT simples com dashboards (Blynk, Adafruit IO, ThingSpeak)",
|
||||||
|
"Robótica amadora e automação residencial faça-você-mesmo (DIY)"
|
||||||
],
|
],
|
||||||
"exemplo": "/exemplos/arduino.ino",
|
"exemplo": "/exemplos/arduino.ino",
|
||||||
"exemplos": "https://github.com/espressif/arduino-esp32/tree/master/docs/en/tutorials",
|
"exemplos": "https://github.com/espressif/arduino-esp32/tree/master/docs/en/tutorials",
|
||||||
"documentacao": "https://docs.espressif.com/projects/arduino-esp32/",
|
"documentacao": "https://docs.espressif.com/projects/arduino-esp32/en/latest/",
|
||||||
"repositorio": "https://github.com/espressif/arduino-esp32",
|
"repositorio": "https://github.com/espressif/arduino-esp32",
|
||||||
"cor": "#00979D"
|
"cor": "#00979D"
|
||||||
},
|
},
|
||||||
@@ -218,26 +368,22 @@
|
|||||||
"nome": "MicroPython",
|
"nome": "MicroPython",
|
||||||
"icone": "🐍",
|
"icone": "🐍",
|
||||||
"nome_completo": "MicroPython for ESP32",
|
"nome_completo": "MicroPython for ESP32",
|
||||||
"descricao": "Implementação do Python 3 otimizada para microcontroladores ESP32",
|
"descricao": "Implementação enxuta e eficiente da linguagem Python 3 otimizada para rodar diretamente na CPU do ESP32 com interpretador em tempo real.",
|
||||||
"linguagem": "Python",
|
"linguagem": "Python",
|
||||||
"tipo": "Framework Alternativo",
|
"tipo": "Linguagem & Interpretador Dinâmico",
|
||||||
"funcao_principal": "Desenvolvimento em Python para prototipagem rápida e scripting",
|
"funcao_principal": "Desenvolvimento interativo e prototipagem ágil em Python com console REPL interativo e manipulação instantânea de hardware",
|
||||||
"caracteristicas": [
|
"caracteristicas": [
|
||||||
"Sintaxe Python 3",
|
"Interpretador Python 3 completo com compilação para bytecode em RAM",
|
||||||
"REPL interativo",
|
"Console interativo REPL via porta serial e WebREPL via Wi-Fi",
|
||||||
"Desenvolvimento iterativo",
|
"Sistema de arquivos integrado (LittleFS / FAT) com upload de scripts `.py` sem recompilar",
|
||||||
"Bibliotecas padrão Python",
|
"Módulos nativos `machine`, `network`, `bluetooth`, `espnow` e `asyncio`",
|
||||||
"Suporte a Wi-Fi e Bluetooth",
|
"Excelente para ensinar programação e algoritmos com hardware real"
|
||||||
"Sistema de arquivos integrado",
|
|
||||||
"Ideal para educação e prototipagem"
|
|
||||||
],
|
],
|
||||||
"casos_uso": [
|
"casos_uso": [
|
||||||
"Prototipagem rápida",
|
"Ensino de computação física e laboratórios universitários",
|
||||||
"Educação e ensino",
|
"Prototipagem ágil e testes rápidos de sensores em bancada",
|
||||||
"Scripts de automação",
|
"Scripts de automação de testes de bancada",
|
||||||
"IoT experimental",
|
"Aplicações experimentais de coleta de dados IoT"
|
||||||
"Projetos de ciência de dados embarcados",
|
|
||||||
"Testes e validação"
|
|
||||||
],
|
],
|
||||||
"exemplo": "/exemplos/micropython.py",
|
"exemplo": "/exemplos/micropython.py",
|
||||||
"exemplos": "https://github.com/micropython/micropython/tree/master/examples",
|
"exemplos": "https://github.com/micropython/micropython/tree/master/examples",
|
||||||
@@ -246,4 +392,3 @@
|
|||||||
"cor": "#2B2B2B"
|
"cor": "#2B2B2B"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Reference in new issue
Block a user