"use client";
import { useState } from "react";
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import Link from "next/link";
import seriesData from "@/public/series.json";
export default function Seletor() {
const [currentStep, setCurrentStep] = useState(0);
const [currentAnswer, setCurrentAnswer] = useState(null);
const [answers, setAnswers] = useState({
wifi: null,
bluetooth: null,
cores: null,
ai: null,
matter: null,
gpio: null,
usb: null,
lowPower: null,
ethernet: null,
display: null,
});
const [showResults, setShowResults] = useState(false);
const [showSummary, setShowSummary] = useState(false);
const questions = [
{
id: "wifi",
question: "Seu projeto precisa de conectividade Wi-Fi?",
description: "Wi-Fi permite conexão com internet e redes locais sem fio",
options: [
{ value: "required", label: "Sim, é essencial", icon: "📶" },
{ value: "nice", label: "Seria útil, mas não é obrigatório", icon: "📡" },
{ value: "no", label: "Não preciso", icon: "📵" },
]
},
{
id: "bluetooth",
question: "Seu projeto precisa de Bluetooth?",
description: "Bluetooth permite comunicação com dispositivos móveis e periféricos",
options: [
{ value: "required", label: "Sim, é essencial", icon: "📱" },
{ value: "nice", label: "Seria útil, mas não é obrigatório", icon: "🔵" },
{ value: "no", label: "Não preciso", icon: "🚫" },
]
},
{
id: "ethernet",
question: "Precisa de conexão Ethernet (cabeada)?",
description: "Ethernet oferece conexão mais estável e rápida que Wi-Fi",
options: [
{ value: "yes", label: "Sim, preciso", icon: "🔌" },
{ value: "no", label: "Não preciso", icon: "🚫" },
]
},
{
id: "cores",
question: "Quantos núcleos de processamento você precisa?",
description: "Mais núcleos permitem executar tarefas em paralelo",
options: [
{ value: "dual", label: "Dual-core (2 núcleos)", icon: "⚡⚡" },
{ value: "single", label: "Single-core (1 núcleo)", icon: "⚡" },
{ value: "any", label: "Tanto faz", icon: "🤷" },
]
},
{
id: "ai",
question: "Precisa de recursos de IA/Machine Learning?",
description: "Aceleradores de IA ajudam em reconhecimento de voz, imagem e visão computacional",
options: [
{ value: "yes", label: "Sim, vou usar IA", icon: "🤖" },
{ value: "no", label: "Não preciso", icon: "🚫" },
]
},
{
id: "display",
question: "Precisa conectar display ou câmera?",
description: "Interfaces LCD/MIPI para displays e DVP/CSI para câmeras",
options: [
{ value: "both", label: "Display e câmera", icon: "📱📷" },
{ value: "display", label: "Apenas display", icon: "📺" },
{ value: "camera", label: "Apenas câmera", icon: "📷" },
{ value: "no", label: "Não preciso", icon: "🚫" },
]
},
{
id: "matter",
question: "Precisa de suporte a Matter, Zigbee ou Thread?",
description: "Protocolos para casa inteligente e IoT de baixo consumo",
options: [
{ value: "yes", label: "Sim, preciso", icon: "🏠" },
{ value: "no", label: "Não preciso", icon: "🚫" },
]
},
{
id: "gpio",
question: "Quantos pinos GPIO você precisa?",
description: "GPIO permite conectar sensores, displays e outros componentes",
options: [
{ value: "many", label: "Muitos (35+)", icon: "🔌🔌🔌" },
{ value: "medium", label: "Quantidade média (20-35)", icon: "🔌🔌" },
{ value: "few", label: "Poucos (menos de 20)", icon: "🔌" },
]
},
{
id: "usb",
question: "Precisa de USB nativo?",
description: "USB nativo facilita programação e comunicação sem adaptadores",
options: [
{ value: "yes", label: "Sim, preciso", icon: "🔌" },
{ value: "nice", label: "Seria útil", icon: "💡" },
{ value: "no", label: "Não preciso", icon: "🚫" },
]
},
{
id: "lowPower",
question: "Baixo consumo de energia é crítico?",
description: "Importante para projetos com bateria ou painéis solares",
options: [
{ value: "critical", label: "Sim, é crítico", icon: "🔋" },
{ value: "nice", label: "Seria bom", icon: "💡" },
{ value: "no", label: "Não é prioridade", icon: "⚡" },
]
},
];
const handleAnswer = (questionId, value) => {
setCurrentAnswer(value);
setAnswers({ ...answers, [questionId]: value });
};
const handleNext = () => {
if (currentAnswer !== null) {
if (currentStep < questions.length - 1) {
setCurrentStep(currentStep + 1);
setCurrentAnswer(answers[questions[currentStep + 1].id] || null);
} else {
// Última pergunta - mostrar resumo primeiro
setShowSummary(true);
}
}
};
const resetQuiz = () => {
setCurrentStep(0);
setCurrentAnswer(null);
setShowResults(false);
setShowSummary(false);
setAnswers({
wifi: null,
bluetooth: null,
cores: null,
ai: null,
matter: null,
gpio: null,
usb: null,
lowPower: null,
ethernet: null,
display: null,
});
};
const goBack = () => {
if (currentStep > 0) {
setCurrentStep(currentStep - 1);
setCurrentAnswer(answers[questions[currentStep - 1].id] || null);
}
};
const calculateRecommendations = () => {
const scores = {};
const reasons = {};
Object.keys(seriesData).forEach(key => {
scores[key] = 0;
reasons[key] = [];
const serie = seriesData[key];
// Wi-Fi
if (answers.wifi === "required") {
if (serie.wifi && !String(serie.wifi).includes("Não")) {
scores[key] += 10;
reasons[key].push(`✅ Wi-Fi ${serie.wifi.includes("Wi-Fi 6") ? "6 (última geração)" : "disponível"}`);
} else {
scores[key] -= 100;
reasons[key].push("❌ Wi-Fi não disponível (requisito essencial)");
}
} else if (answers.wifi === "nice" && serie.wifi && !String(serie.wifi).includes("Não")) {
scores[key] += 3;
reasons[key].push(`💡 Wi-Fi ${serie.wifi.includes("Wi-Fi 6") ? "6" : ""} disponível`);
}
// Bluetooth
if (answers.bluetooth === "required") {
if (serie.bluetooth !== "Não") {
scores[key] += 10;
reasons[key].push(`✅ ${serie.bluetooth}`);
} else {
scores[key] -= 100;
reasons[key].push("❌ Bluetooth não disponível (requisito essencial)");
}
} else if (answers.bluetooth === "nice" && serie.bluetooth !== "Não") {
scores[key] += 3;
reasons[key].push(`💡 ${serie.bluetooth}`);
}
// Ethernet
if (answers.ethernet === "yes") {
if (serie.ethernet === "Sim") {
scores[key] += 12;
reasons[key].push("✅ Ethernet MAC integrado");
} else {
scores[key] -= 8;
reasons[key].push("⚠️ Ethernet não disponível");
}
}
// Núcleos
if (answers.cores === "dual") {
if (serie.nucleos.includes("2")) {
scores[key] += 8;
reasons[key].push("✅ Dual-core para processamento paralelo");
} else {
scores[key] -= 5;
reasons[key].push("⚠️ Apenas single-core");
}
} else if (answers.cores === "single" && serie.nucleos.includes("1")) {
scores[key] += 5;
reasons[key].push("✅ Single-core eficiente");
}
// IA
if (answers.ai === "yes") {
if (serie.aceleradores_ia) {
scores[key] += 15;
reasons[key].push("✅ Aceleradores de IA integrados");
} else {
scores[key] -= 10;
reasons[key].push("⚠️ Sem aceleradores de IA dedicados");
}
}
// Display/Câmera
if (answers.display === "both") {
if ((serie.lcd || serie.mipi_dsi) && (serie.camera || serie.mipi_csi)) {
scores[key] += 15;
reasons[key].push("✅ Interfaces para display e câmera");
} else {
scores[key] -= 8;
reasons[key].push("⚠️ Interfaces limitadas para display/câmera");
}
} else if (answers.display === "display") {
if (serie.lcd || serie.mipi_dsi) {
scores[key] += 10;
reasons[key].push(`✅ Interface ${serie.mipi_dsi ? "MIPI DSI" : "LCD"} para display`);
} else {
scores[key] -= 5;
reasons[key].push("⚠️ Interface de display limitada");
}
} else if (answers.display === "camera") {
if (serie.camera || serie.mipi_csi) {
scores[key] += 10;
reasons[key].push(`✅ Interface ${serie.mipi_csi ? "MIPI CSI" : "DVP"} para câmera`);
} else {
scores[key] -= 5;
reasons[key].push("⚠️ Interface de câmera limitada");
}
}
// Matter/Zigbee/Thread
if (answers.matter === "yes") {
if (serie.matter === "Sim") {
scores[key] += 12;
reasons[key].push("✅ Suporte a Matter/Thread/Zigbee");
} else {
scores[key] -= 8;
reasons[key].push("⚠️ Sem suporte a Matter/Thread/Zigbee");
}
}
// GPIO
const gpioCount = parseInt(serie.gpio);
if (answers.gpio === "many") {
if (gpioCount >= 35) {
scores[key] += 8;
reasons[key].push(`✅ ${gpioCount} pinos GPIO (muitos)`);
} else {
scores[key] -= 5;
reasons[key].push(`⚠️ ${gpioCount} GPIO (pode ser limitado)`);
}
} else if (answers.gpio === "medium") {
if (gpioCount >= 20 && gpioCount < 35) {
scores[key] += 8;
reasons[key].push(`✅ ${gpioCount} pinos GPIO (quantidade média)`);
} else if (gpioCount >= 35) {
scores[key] += 6;
reasons[key].push(`✅ ${gpioCount} pinos GPIO (mais que o necessário)`);
} else {
scores[key] -= 3;
reasons[key].push(`⚠️ ${gpioCount} GPIO (pode ser limitado)`);
}
} else if (answers.gpio === "few" && gpioCount < 20) {
scores[key] += 8;
reasons[key].push(`✅ ${gpioCount} pinos GPIO (suficiente)`);
}
// USB
if (answers.usb === "yes") {
if (serie.usb && serie.usb !== "Não") {
scores[key] += 10;
reasons[key].push(`✅ ${serie.usb}`);
} else {
scores[key] -= 5;
reasons[key].push("⚠️ USB não disponível");
}
} else if (answers.usb === "nice" && serie.usb && serie.usb !== "Não") {
scores[key] += 5;
reasons[key].push(`💡 ${serie.usb} disponível`);
}
// Baixo consumo
if (answers.lowPower === "critical") {
const deepSleep = serie.consumo_energia?.deep_sleep;
if (deepSleep) {
const microAmps = deepSleep.match(/(\d+)\s*µA/);
if (microAmps && parseInt(microAmps[1]) <= 10) {
scores[key] += 12;
reasons[key].push(`✅ Consumo ultra-baixo: ${deepSleep} em deep sleep`);
} else {
scores[key] += 5;
reasons[key].push(`💡 Consumo: ${deepSleep} em deep sleep`);
}
}
} else if (answers.lowPower === "nice") {
const deepSleep = serie.consumo_energia?.deep_sleep;
if (deepSleep) {
const microAmps = deepSleep.match(/(\d+)\s*µA/);
if (microAmps && parseInt(microAmps[1]) <= 10) {
scores[key] += 5;
reasons[key].push(`💡 Baixo consumo: ${deepSleep}`);
}
}
}
// Bonus: Características adicionais
if (serie.frequencia && parseInt(serie.frequencia) >= 240) {
reasons[key].push(`⚡ Alta performance: ${serie.frequencia}`);
}
});
return { scores, reasons };
};
const { scores: allScores, reasons: allReasons } = showResults && Object.values(answers).every(a => a !== null)
? calculateRecommendations()
: { scores: {}, reasons: {} };
const recommendations = Object.entries(allScores)
.filter(([_, score]) => score > 0)
.sort(([, a], [, b]) => b - a);
const topRecommendations = recommendations.slice(0, 3);
const otherRecommendations = recommendations.slice(3);
const progress = ((currentStep + 1) / questions.length) * 100;
return (
🎯
Ferramenta de Seleção Inteligente
Encontre seu ESP32 Ideal
Responda algumas perguntas sobre seu projeto e descubra qual série ESP32 é perfeita para você
{/* Progress Bar */}
Pergunta {currentStep + 1} de {questions.length}
{Math.round(progress)}%
{/* Question Card */}
{currentStep < questions.length && !showResults && !showSummary && (
{questions[currentStep].question}
{questions[currentStep].description}
{questions[currentStep].options.map((option) => (
handleAnswer(questions[currentStep].id, option.value)}
className={`group border-2 rounded-2xl p-4 md:p-6 transition-all duration-300 transform hover:scale-105 hover:shadow-xl ${
currentAnswer === option.value
? 'bg-purple-50 border-purple-500 shadow-lg scale-105'
: 'bg-gray-50 hover:bg-purple-50 border-gray-200 hover:border-purple-500'
}`}
>
{option.icon}
{option.label}
{currentAnswer === option.value && (
✓
)}
))}
{/* Navigation Buttons */}
Voltar
Recomeçar
{currentStep === questions.length - 1 ? 'Ver Resultados' : 'Avançar'}
)}
{/* Summary Page */}
{showSummary && !showResults && (
📋
Resumo das suas Respostas
Revise suas escolhas antes de ver as recomendações
{questions.map((question) => {
const answer = answers[question.id];
const selectedOption = question.options.find(opt => opt.value === answer);
return (
{question.question}
{selectedOption && (
{selectedOption.icon}
{selectedOption.label}
)}
{
const questionIndex = questions.findIndex(q => q.id === question.id);
setCurrentStep(questionIndex);
setCurrentAnswer(answers[question.id]);
setShowSummary(false);
}}
className="self-start md:self-center px-4 py-2 bg-white border-2 border-gray-300 rounded-xl text-sm font-semibold text-gray-700 hover:bg-gray-100 hover:border-purple-500 transition-all"
>
✏️ Editar
);
})}
{
setCurrentStep(questions.length - 1);
setCurrentAnswer(answers[questions[questions.length - 1].id]);
setShowSummary(false);
}}
className="inline-flex items-center justify-center gap-2 bg-gray-200 text-gray-800 px-6 md:px-8 py-3 md:py-4 rounded-xl font-bold text-sm md:text-base hover:bg-gray-300 transition-all duration-300"
>
Voltar
setShowResults(true)}
className="inline-flex items-center justify-center gap-2 bg-linear-to-r from-blue-600 via-purple-600 to-pink-600 text-white px-8 md:px-12 py-3 md:py-4 rounded-xl font-bold text-sm md:text-base shadow-lg hover:shadow-xl transition-all duration-300"
>
✨
Ver Recomendações
)}
{/* Results */}
{showResults && recommendations.length > 0 && (
✨
Recomendações para seu Projeto
Baseado nas suas respostas, estas são as melhores opções de ESP32 para você:
{topRecommendations.map(([seriesKey, score], index) => {
const serie = seriesData[seriesKey];
const badges = ["🥇 Melhor Opção", "🥈 Segunda Opção", "🥉 Terceira Opção"];
const matchReasons = allReasons[seriesKey] || [];
return (
{badges[index]}
{serie.icone}
{seriesKey}
{serie.descricao}
Score:
{score}
{/* Match Reasons */}
{matchReasons.length > 0 && (
Por que esta série?
{matchReasons.slice(0, 5).map((reason, idx) => (
{reason}
))}
{matchReasons.length > 5 && (
+{matchReasons.length - 5} mais vantagens
)}
)}
Arquitetura:
{serie.arquitetura.split(' ')[0]}
Núcleos:
{serie.nucleos}
Frequência:
{serie.frequencia}
SRAM:
{serie.memoria_sram}
GPIO:
{serie.gpio}
Ver Detalhes
);
})}
{/* Other Compatible Options */}
{otherRecommendations.length > 0 && (
Outras Opções Compatíveis
{otherRecommendations.map(([seriesKey, score]) => {
const serie = seriesData[seriesKey];
return (
{serie.icone}
{seriesKey}
Score: {score}
Ver Detalhes
);
})}
)}
📊
Comparar Recomendações
🔄
Fazer Novamente
{/* Additional Resources */}
Próximos Passos
🛒
Ver Catálogo de Placas
Encontre placas de desenvolvimento verificadas
⚡
Explorar Frameworks
Conheça ESP-IDF, Arduino, MicroPython e mais
📚
Consultar Glossário
Entenda termos técnicos e especificações
)}
{/* No Results Found */}
{showResults && recommendations.length === 0 && (
🤔
Nenhuma Correspondência Perfeita
Não encontramos uma série ESP32 que atenda completamente aos seus requisitos.
Isso pode acontecer quando você combina requisitos que são mutuamente exclusivos ou muito específicos.
💡 Sugestões:
•
Revise seus requisitos e considere quais são realmente essenciais
•
Algumas combinações (como Wi-Fi 6 + aceleradores de IA) podem requerer séries específicas
•
Considere usar múltiplos módulos ESP32 para diferentes funções do seu projeto
🔄
Tentar Novamente
📊
Ver Todas as Séries
)}
);
}