ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
Educação personalizada: descubra o curso ideal com nosso quiz de orientação profissional.
Translation pending
EducationGitHub @Santozs2OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Plataforma de orientação educacional: o aluno responde um quiz de perfil e recebe uma recomendação de cursos técnicos, com uma explicação em linguagem natural. Depois do curso, a escola coleta a avaliação da turma pelo mesmo sistema.
Projeto de TCC, em produção no SENAI São José do Rio Preto (CFP 8.01 Antonio Devisate).
Aplicação Django única, renderizada no servidor — templates mais CSS e JavaScript
estáticos, sem build step. Não existe SPA: o front em React foi removido e as telas
vivem em backend/templates/ e nos templates/ de cada app.
São duas camadas, e a segunda nunca é obrigatória:
quiz/engine.py) — determinística. As respostas viram um vetor de
pesos por área, comparado por similaridade de cosseno com o vetor de cada
curso. Saem os 5 cursos mais parecidos (QUIZ_RECOMENDACAO_LIMIT), cada um com
rank_engine e as 3 áreas que mais pesaram na escolha, mais a diferença entre
1º e 2º, uma banda de confiança e o tie_set (os cursos empatados dentro de
EMPATE = 0.02).quiz/delivery.py) — opcional. Manda um payload sem dados
pessoais para uma LLM, que escreve a explicação e pode reordenar a lista —
mas só promove ao 1º lugar um curso que já esteja no tie_set. A resposta passa
por validação de contrato (quiz/serializers.py); se falhar, estourar o timeout
ou o provedor cair, o resultado da engine é entregue como está
(used_fallback=True).Cada tentativa guarda o que aconteceu — llm_model, prompt_version,
latency_ms, tokens_in/tokens_out, used_fallback, diverged, cache_hit —
para a análise do TCC. LLM_ENABLED=0 desliga a camada de IA por completo.
Quando o provedor falha, uma pausa de LLM_PAUSA segundos é gravada no cache: os
próximos alunos vão direto para a engine em vez de esperar o timeout cada um.
educmatch/
├─ backend/
│ ├─ core/ settings, rotas raiz e testes de infraestrutura
│ ├─ quiz/ questões, tentativas, engine de cosseno, camada de LLM (quiz/llm/)
│ ├─ catalogo/ áreas, cursos e os pesos que ligam um ao outro
│ ├─ accounts/ usuário customizado, login/cadastro, lista de interesse
│ ├─ avaliacao/ avaliação de fim de curso, respondida por link público
│ ├─ painel/ telas da coordenação: métricas, cursos, links, avaliações
│ ├─ templates/ base.html, componentes/ e telas do quiz
│ ├─ static/ css/ e js/ por tela
│ ├─ scripts/ carga_turma.py (teste de carga)
│ └─ startup.sh inicialização no Azure
└─ docs/
├─ apresentacao/ material da banca (engine, ia, contratos, backend, frontend)
│ └─ mvt.md arquitetura MVT: o caminho de uma requisição pelas 3 camadas
├─ experimento/ CSVs do experimento engine x LLM
├─ specs/ plano e passo a passo de cada fase
└─ DER.png modelo de dados
Pré-requisitos: Python 3.12+ e MySQL com o banco educmatch criado.
cd backend
python -m venv .venv
source .venv/Scripts/activate # Linux/macOS: source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # ajuste DB_USER e DB_PASSWORD para o seu MySQL
python manage.py migrate
python manage.py createcachetable
python manage.py seed # áreas, cursos e questões de uma vez
python manage.py seed_avaliacao # perguntas da avaliação de fim de curso
python manage.py runserver # http://localhost:8000
Confira o catálogo pelo número: 12 áreas, 20 cursos, 73 pesos.
Para entrar no painel é preciso um usuário staff: python manage.py createsuperuser.
backend/.env)Tudo que muda de uma máquina para outra vem de variável de ambiente. O
core/settings.py lê o backend/.env sozinho; os nomes estão em
backend/.env.example. O .env nunca vai para o Git.
Valores booleanos aceitos em .env são 1/0 e true/false (por exemplo,
DJANGO_DEBUG=true e LLM_ENABLED=0).
| Grupo | Variáveis |
|---|---|
| Django | DJANGO_SECRET_KEY, DJANGO_DEBUG, DJANGO_ALLOWED_HOSTS |
| Banco | DB_ENGINE (mysql padrão, ou sqlite), DB_NAME, DB_USER, DB_PASSWORD, DB_HOST, DB_PORT |
| Escola | ESCOLA_NOME, ESCOLA_ENDERECO, ESCOLA_TELEFONE — aparecem nas telas |
| LLM | LLM_ENABLED, LLM_PROVIDER (fake, gemini, openai_compat), LLM_BASE_URL, LLM_MODEL, LLM_API_KEY, LLM_TIMEOUT, LLM_PROMPT_VERSION, LLM_PAUSA |
O provedor fake responde sem rede nenhuma: é o que os testes usam e serve para
desenvolver a tela de resultado sem gastar cota.
O projeto usa TIME_ZONE = "America/Sao_Paulo", e o MySQL vem sem as tabelas de
fuso: sem elas, todo filtro por data do painel volta vazio, sem erro. Baixe o
pacote POSIX em https://dev.mysql.com/downloads/timezones.html e rode:
mysql -u root -p mysql < timezone_posix.sql
O teste python manage.py test core diz se deu certo.
| Rota | O que é |
|---|---|
/ | início do quiz |
/questionario/<token>/ | acesso ao questionário pelo link gerado no painel |
/resultado/<id>/ | resultado com os cursos recomendados |
/cursos/<id>/ | detalhe do curso |
/entrar/, /cadastro_usuario/, /logout/ | conta |
/meus-testes/, /meu-perfil/, /lista_interesse/ | área do aluno |
/avaliacao/<token>/ | avaliação de fim de curso (link público, sem login) |
| Rota | O que é |
|---|---|
/painel/ | visão geral |
/painel/quiz/ | métricas do quiz |
/painel/cursos/ | catálogo: editar curso, criar área |
/painel/links/ | gerar e fechar links de questionário |
/painel/interesse/ | quem marcou interesse em quais cursos |
/painel/avaliacoes/ | links de avaliação por curso e turma |
/painel/avaliacoes/resultados/ | resultados, com exportação em .csv |
/quiz/dashboard/ | endereço antigo: redireciona para /painel/ |
/admin/ | admin do Django |
O payload que vai para a LLM não leva nome, e-mail nem id de usuário — só o vetor de áreas e os cursos candidatos.
O painel tem supressão k-anônima implementada em painel/privacidade.py, que
esconde o número de qualquer célula com menos de k ocorrências (a linha
continua na tabela, para que a omissão não vaze o valor). Por decisão do grupo em
01/10/2026 ela está desligada — K_MINIMO = 0. Para religar, volte a
constante para 5.
cd backend
python manage.py test
A suíte cobre a engine de recomendação e a camada de LLM (quiz/tests/), as rotas
web e a lista de interesse (accounts/tests/), a avaliação de fim de curso
(avaliacao/tests/), as métricas e telas do painel (painel/tests/) e o fuso do
banco (core/tests.py).
Comandos de apoio:
python manage.py testar_llm # checa o provedor configurado no .env
python manage.py medir_empate # calibra o limiar de empate da engine
python manage.py experimento_ia # roda N perfis na engine e na LLM e grava um CSV
python scripts/carga_turma.py # uma turma inteira enviando o quiz ao mesmo tempo
O experimento_ia roda cada perfil numa transação desfeita: nada fica no banco.
Os CSVs já gerados estão em docs/experimento/.
App Service Linux no plano gratuito F1 (rg-educmatch / educmatch-7249),
em https://educmatch-7249.azurewebsites.net.
O deploy é automático: .github/workflows/deploy.yml publica a cada merge na
main, e só se os testes de test.yml passarem. O pacote leva o commit dentro,
em backend/VERSAO.
requirements.txt na raiz; o da raiz só inclui o de backend/.bash backend/startup.sh, que roda migrações,
seeds e collectstatic a cada boot e sobe o gunicorn com worker gthread
(2 workers x 8 threads: a chamada à LLM é espera de rede, e com threads um
worker atende outros alunos enquanto espera)./home/data/educmatch.sqlite3
(DB_ENGINE=sqlite), já que o MySQL gerenciado não tem camada gratuita
permanente.versao.main na mão:
az webapp deployment source sync -g rg-educmatch -n educmatch-7249mysqlclient), SQLite em produçãodjangorestframework continua instalado, mas nenhuma rota de API está exposta hojemain (uma fase do plano = um PR)python manage.py test em backend/main