ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Plataforma de professores e alunos de idiomas (inglês, espanhol, italiano, francês, japonês, mandarim, alemão e coreano), com contas de professor e aluno. O professor escolhe o idioma que ensina; os alunos vinculados pelo código adicionam palavras nesse idioma, recebem a tradução e frases de exemplo geradas por IA. O professor acompanha o vocabulário de cada aluno, deixa recados, registra anotações no calendário e gerencia a agenda de aulas (com confirmação e cancelamento por WhatsApp).查看完整 README ↗
Plataforma de professores e alunos de idiomas (inglês, espanhol, italiano, francês, japonês, mandarim, alemão e coreano), com contas de professor e aluno. O professor escolhe o idioma que ensina; os alunos vinculados pelo código adicionam palavras nesse idioma, recebem a tradução e frases de exemplo geradas por IA. O professor acompanha o vocabulário de cada aluno, deixa recados, registra anotações no calendário, monta a sala de aula (link da aula online e documentos, com anotações do aluno em cada um) e gerencia a agenda de aulas — confirma se cada aula foi realizada (se não foi, o aluno ganha uma reposição) e marca aulas para alunos, inclusive os que não usam o app (com confirmação e cancelamento por WhatsApp).
Custo: R$ 0,00. Firebase no plano Spark (grátis, sem cartão) + Vercel no plano Hobby (grátis, sem cartão) + Gemini API (camada gratuita, sem cartão).
</> para adicionar um "App da Web".firebaseConfig que aparecer.js/firebase-config.js (substitua os campos SEU_...).seu-app.vercel.app) — sem isso, a janela do Google não abre.southamerica-east1, mais perto do Brasil).As regras ficam no arquivo firestore.rules e são publicadas junto com o
site pelo firebase deploy (Passo 5). Se preferir publicar só elas, sem o
site, rode firebase deploy --only firestore:rules — ou, no Console do
Firebase, vá em Firestore → Regras, cole o conteúdo do arquivo e clique
em Publicar.
Isso garante que um aluno só vê os próprios dados, e um professor só vê os alunos vinculados a ele pelo código.
Publique as regras de novo sempre que o arquivo firestore.rules mudar.
O site (Vercel) se atualiza sozinho a cada mudança no GitHub, mas as regras
não: com regras antigas, recursos novos falham com "permissão negada" (ex:
cadastrar aluno sem app, ajustar o plano do aluno, notificações). O painel
do professor avisa quando isso acontece.
GEMINI_API_KEYjs/firebase-config.js se a constante AI_ENDPOINT_VERCEL aponta para o
endereço de produção do projeto na Vercel (Settings → Domains), seguido de
/api/gerar-frase.Também gratuito, sem cartão, dentro do plano Spark.
npm install -g firebase-tools
firebase login
firebase init hosting # escolha "usar pasta atual" como public
firebase deploy
A pasta testes/ tem testes das regras do Firestore, do servidor da IA e do
app no navegador (cadastro, vocabulário, recados, agenda...), todos com o
Firebase emulado. Veja como rodar em testes/README.md.
O Idiomex pode ser instalado como app: no Android (Chrome), toque em
"Instalar app" ou no menu ⋮ → "Adicionar à tela inicial"; no iPhone
(Safari), toque em Compartilhar → "Adicionar à Tela de Início". O
manifest.webmanifest define nome, cores e ícones, e o sw.js guarda as
telas do site para abrirem mesmo sem internet (os dados continuam vindo
do Firebase).
PROF-8X2K), visível no painel dele, e registra esse
código na coleção codigosProfessor.codigosProfessor e grava professorId (e o
codigoVinculo usado) no perfil do aluno. O aluno pode trocar de
professor depois, em "Meu perfil", digitando o código do novo professor.firestore.rules) usam esse campo para
liberar a leitura do vocabulário do aluno e das mensagens apenas
para o professor vinculado.usuarios/{uid}
nome, email, tipo ("professor" | "aluno")
codigoProfessor -> só em professores
professorId -> só em alunos, aponta para o uid do professor
codigoVinculo -> só em alunos, código usado para o vínculo
plano -> só em alunos, definido pelo professor, POR IDIOMA:
{professorId, porIdioma: {en: {aulasPorSemana
(0 = sem limite), reposicoesConcedidas}, ...}}
(aulasPorSemana/reposicoesConcedidas fora de
"porIdioma" = plano antigo, vale para o primeiro
idioma do professor)
codigosProfessor/{codigo}
professorId -> uid do professor dono do código
usuarios/{uid}/palavras/{id}
palavraEn, traducaoPt, fraseExemplo, criadoEm
usuarios/{uid}/mensagens/{id}
texto, criadoEm -> escrito pelo professor, lido pelo aluno
usuarios/{uid}/notificacoes/{id}
tipo, texto, idioma, lida, criadoEm, professorId
-> o sino do aluno mostra só as do idioma que
ele está estudando
-> criadas pelo professor (crédito de reposição,
pedido aprovado/recusado), lidas pelo aluno
tipo, texto, idioma, lida, criadoEm, alunoId
-> no professor: criadas pelos alunos vinculados
(aula marcada, pedido de reposição, aula
cancelada), lidas no sino do painel
usuarios/{professorId}/configuracaoAgenda/dados
duracaoAulaMinutos, intervaloMinutos, modalidades, modalidadesPorDia,
disponibilidade -> configuração padrão das aulas
porIdioma: {en: {...os mesmos campos}}
-> idioma com configuração própria (os outros
usam a padrão)
whatsapp, mesesLiberados -> valem para todos os idiomas
usuarios/{uid}/salaDeAula/link
url, professorId, atualizadoEm
-> link da aula online, deixado pelo professor
usuarios/{uid}/documentosAula/{id}
titulo, professorId, criadoEm
url -> documento por link, ou
nomeArquivo, tipoArquivo, tamanho, partes
-> arquivo enviado (até 10 MB), guardado em
documentosAula/{id}/partes/{n} {dados, indice}
anotacao, anotacaoEm -> bloco de anotações do aluno sobre o documento
(o aluno escreve, o professor lê)
aulas/{professorId_data_hora}
professorId, alunoId, alunoNome, data, horaInicio, horaFim, modalidade,
idioma, reposicao, status ("agendada" | "pendente" | "concluida" |
"cancelada" | "recusada" | "nao-realizada")
-> "pendente" = pedido de reposição sem
crédito, esperando o professor aprovar;
"nao-realizada" = o professor confirmou que
a aula não aconteceu (o aluno ganha 1 reposição)
alunoId pode ser um aluno sem app (abaixo)
usuarios/{professorId}/alunosSemApp/{id}
nome, telefone, idioma, reposicoesConcedidas (nesse idioma), criadoEm
-> alunos que não usam o app: o professor marca as
aulas por eles e recebe um lembrete na agenda
enquanto não houver aula marcada
Se a chave da IA ficasse no JavaScript do navegador, qualquer pessoa
poderia abrir o código-fonte da página e copiá-la — foi exatamente o
problema da versão anterior deste projeto, que usava uma "senha" para
tentar esconder isso. Agora a chamada para a IA acontece dentro da
function do Vercel (api/gerar-frase.js), que roda no servidor: o
navegador nunca vê a chave, só o resultado (a frase pronta).