"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 [answers, setAnswers] = useState({
wifi: null,
bluetooth: null,
cores: null,
ai: null,
matter: null,
gpio: null,
usb: null,
lowPower: null,
});
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: "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: "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) => {
setAnswers({ ...answers, [questionId]: value });
if (currentStep < questions.length - 1) {
setCurrentStep(currentStep + 1);
}
};
const resetQuiz = () => {
setCurrentStep(0);
setAnswers({
wifi: null,
bluetooth: null,
cores: null,
ai: null,
matter: null,
gpio: null,
usb: null,
lowPower: null,
});
};
const goBack = () => {
if (currentStep > 0) {
setCurrentStep(currentStep - 1);
}
};
const calculateRecommendations = () => {
const scores = {};
Object.keys(seriesData).forEach(key => {
scores[key] = 0;
const serie = seriesData[key];
// Wi-Fi
if (answers.wifi === "required" && serie.wifi && !String(serie.wifi).includes("Não")) {
scores[key] += 10;
} else if (answers.wifi === "no" && (!serie.wifi || String(serie.wifi).includes("Não"))) {
scores[key] += 5;
} else if (answers.wifi === "nice" && serie.wifi && !String(serie.wifi).includes("Não")) {
scores[key] += 3;
} else if (answers.wifi === "required" && (!serie.wifi || String(serie.wifi).includes("Não"))) {
scores[key] -= 100; // Desqualifica
}
// Bluetooth
if (answers.bluetooth === "required" && serie.bluetooth !== "Não") {
scores[key] += 10;
} else if (answers.bluetooth === "no" && serie.bluetooth === "Não") {
scores[key] += 5;
} else if (answers.bluetooth === "nice" && serie.bluetooth !== "Não") {
scores[key] += 3;
} else if (answers.bluetooth === "required" && serie.bluetooth === "Não") {
scores[key] -= 100; // Desqualifica
}
// Núcleos
if (answers.cores === "dual" && serie.nucleos.includes("2")) {
scores[key] += 8;
} else if (answers.cores === "single" && serie.nucleos.includes("1")) {
scores[key] += 5;
} else if (answers.cores === "dual" && !serie.nucleos.includes("2")) {
scores[key] -= 5;
}
// IA
if (answers.ai === "yes" && serie.aceleradores_ia) {
scores[key] += 15;
} else if (answers.ai === "yes" && !serie.aceleradores_ia) {
scores[key] -= 10;
}
// Matter/Zigbee/Thread
if (answers.matter === "yes" && serie.matter === "Sim") {
scores[key] += 12;
} else if (answers.matter === "yes" && serie.matter !== "Sim") {
scores[key] -= 8;
}
// GPIO
const gpioCount = parseInt(serie.gpio);
if (answers.gpio === "many" && gpioCount >= 35) {
scores[key] += 8;
} else if (answers.gpio === "medium" && gpioCount >= 20 && gpioCount < 35) {
scores[key] += 8;
} else if (answers.gpio === "few" && gpioCount < 20) {
scores[key] += 8;
} else if (answers.gpio === "many" && gpioCount < 35) {
scores[key] -= 5;
}
// USB
if (answers.usb === "yes" && serie.usb && serie.usb !== "Não") {
scores[key] += 10;
} else if (answers.usb === "nice" && serie.usb && serie.usb !== "Não") {
scores[key] += 5;
} else if (answers.usb === "yes" && (!serie.usb || serie.usb === "Não")) {
scores[key] -= 5;
}
// Baixo consumo
if (answers.lowPower === "critical") {
const deepSleep = serie.consumo_energia?.deep_sleep;
if (deepSleep && (deepSleep.includes("µA") || deepSleep.includes("5 µA") || deepSleep.includes("7 µA"))) {
scores[key] += 12;
}
}
});
// Ordenar por pontuação
const sortedSeries = Object.entries(scores)
.filter(([_, score]) => score > 0)
.sort(([, a], [, b]) => b - a)
.slice(0, 3);
return sortedSeries.map(([key]) => key);
};
const recommendations = currentStep === questions.length - 1 && Object.values(answers).every(a => a !== null)
? calculateRecommendations()
: [];
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 && recommendations.length === 0 && (
{questions[currentStep].question}
{questions[currentStep].description}
{questions[currentStep].options.map((option) => (
))}
{/* Navigation Buttons */}
)}
{/* Results */}
{recommendations.length > 0 && (
✨
Recomendações para seu Projeto
Baseado nas suas respostas, estas são as melhores opções de ESP32 para você:
{recommendations.map((seriesKey, index) => {
const serie = seriesData[seriesKey];
const badges = ["🥇 Melhor Opção", "🥈 Segunda Opção", "🥉 Terceira Opção"];
return (
{badges[index]}
{serie.icone}
{seriesKey}
{serie.descricao}
Arquitetura:
{serie.arquitetura.split(' ')[0]}
Núcleos:
{serie.nucleos}
Frequência:
{serie.frequencia}
SRAM:
{serie.memoria_sram}
GPIO:
{serie.gpio}
Ver Detalhes
);
})}
📊
Comparar Recomendações
{/* 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
)}
);
}