Brief — Pedido de nova atividade de laboratório
Cole este brief junto com o pedido e preencha só o que muda (tema e tarefas). Ele define o padrão fixo do curso; o assistente entrega a aula pronta e validada.
Contexto e stack
- Plataforma: ESP32 · Ambiente: PlatformIO (VS Code) · Framework: Arduino.
- Simulador: Wokwi (sem placa física) — ou placa física, conforme o periférico (ver "Wokwi × placa física"). Broker/telemetria: stack Docker (Mosquitto + Node-RED + MQTT Explorer).
- Documentação: Docusaurus em MDX. Entrega/correção: Git + GitHub Actions, por commit.
- Organização:
ELT85B-N21-2026-2. Repos por aula:labNN-template,labNN-grupo-a/b/c…, elabNN-grupo-n= repositório de notas/correção daquela aula (mesmo padrão paraprojeto-*). - Tipo de aula: a maioria é embarcada (ESP32/Wokwi ou placa física), mas há aulas somente de ferramentas (ex.: Lab 00 — git/GitHub/gh/Markdown). Nessas, não há PlatformIO/Wokwi/firmware; o "produto" é outro artefato (ex.:
README.md). Diga no pedido qual é o caso.
Estrutura de pastas (padrão)
Use o componente FileTree para mostrar a estrutura ao aluno. Códigos de ação:
c criar · r ler · u editar · d apagar · p professor (infra) · n notas · g gerado.
labNN-template — aula embarcada (entregue ao grupo):
- ├── 🔧platformio.ini
- ├── 📂src
- └── 📄main.cpp👈 Edite Aqui
- ├── 🔧diagram.json
- ├── 🔧wokwi.toml
- ├── 📄.gitignore
- ├── 📂.vscode
- └── 🔧extensions.json
- ├── 📂evidencias
- └── 📄.gitkeep
- └── 📝README.md👈 Edite Aqui
labNN-template — aula somente de ferramentas (ex.: Lab 00):
- ├── 📝README.md👈 Edite Aqui
- ├── 📄.gitignore
- ├── 📂.vscode
- └── 🔧extensions.json
- └── 📂evidencias
- └── 📄.gitkeep
labNN-grupo-n — repositório de correção:
- ├── 📂autograde
- ├── 📄grade.py👈 (Professor)
- ├── 📄gen_grade.py👈 (Professor)
- └── 📄gen_tarefas_toc.py👈 (Professor)
- ├── 📂.github
- └── 📂workflows
- ├── 🚀grade-one.yml👈 (Professor)
- └── 🚀grade-all.yml👈 (Professor)
- └── 📂workflows
- ├── 📂notas
- ├── 📝GRADE-grupo-a.md👈 Gerado
- └── 📄nota.csv👈 Gerado
- └── 📝README.md
Site de docs — onde vivem a aula e os componentes:
- ├── 📂labs-docs
- └── 📂labNN
- └── 📄labNN-....mdx👈 Criar Aqui
- └── 📂labNN
- └── 📂src
- └── 📂components
- ├── 📄CommitPoint.tsx👈 (Professor)
- ├── 📄InstructionsSite.tsx👈 (Professor)
- └── 📂shared
- └── 📄FileTree.tsx👈 (Professor)
- └── 📂components
Formato do documento (MDX Docusaurus)
- Front matter completo (
id,title,sidebar_label,sidebar_position,slug,keywords). - Avisos como admonitions (
:::info/tip/warning/danger/note);Tabs/TabItemquando útil; diagramas em blocosmermaid(requer@docusaurus/theme-mermaid). - Imports no topo:
import CommitPoint from '@site/src/components/CommitPoint';e, para a estrutura de pastas,import FileTree from '@site/src/components/shared/FileTree';. - Code blocks com
title="...". Seções típicas: Objetivos, Material, Setup, Partes (experimentos com saída esperada), Projeto integrador, Desafios D1–D4, Gabarito (emdetailsatrás de:::danger Spoiler), Checklist. - Regra MDX (crítica): todo código com
<,>,{,},&fica em blocos/backticks; nunca use esses caracteres nas stringstask="..."dos CommitPoint (ex.: escreva "citacao e regra horizontal", não "citacao (>) e (---)"). Para mostrar um bloco de código dentro de outro, use quatro crases no bloco externo. - Nota
:::infoexplicando quando o código fica emsetup()(demonstração única) vsloop()(comportamento contínuo). Só em aulas embarcadas — omitir quando não houver firmware.
Abertura da aula (padrão fixo)
- Ambiente de desenvolvimento: não repita comandos de instalação inline. Use os componentes reutilizáveis (fonte única de verdade):
import {LabSetup, LabLogout} from '@site/src/components/InstructionsSite';<LabSetup />no topo → admonition "Antes de começar" (procedimento numerado: instalar → configurar → verificar + verificação rápidagit --version && gh auth status && code -v).<LabLogout />no fim → admonition "Ao terminar" (logout, importante em máquina de laboratório compartilhada).- Distinguir uma vez por máquina (config) vs a cada aula (verificação).
- Âncoras estáveis no
/lab/intro(evita link podre ao reescrever títulos):{#setup},{#git-config},{#verify},{#logout}. - Clone + entrega:
<LabTeamMembers labName="labNN" />(cria/clona o repo do grupo) e<LabSubmit labName="labNN" />(envio do link no Moodle). Esses componentes são globais no site (não precisam deimportno MDX). - Mapa de tarefas: logo após o H1, insira o bloco gerado pelo
gen_tarefas_toc.py(ver "Ferramentas de autoria"), delimitado por<!-- TAREFAS:START -->/<!-- TAREFAS:END -->.
Wokwi × placa física (escolha do periférico)
Antes de definir o circuito, verifique o que o Wokwi simula para o chip alvo (matriz completa em Simulation Features e nos test-binaries). Resumo dos periféricos mais usados:
| Periférico | ESP32 | S3 | C3 | C6 | Observação |
|---|---|---|---|---|---|
| GPIO / ADC | ✔️ | ✔️ | ✔️ | ✔️ | Interrupções OK |
| I2C (master) | ✔️ | ✔️ | ✔️ | ✔️ | Sem 10-bit; só master |
| SPI | ✔️ | ✔️ | ✔️ | ✔️ | |
| LEDC PWM | ✔️ | ✔️ | ✔️ | ✔️ | analogWrite(), Servo, buzzer |
| WiFi | ✔️ | ✔️ | ✔️ | ✔️ | SSID Wokwi-GUEST |
| RMT (WS2812) | 🟡 | 🟡 | 🟡 | 🟡 | Transmit-only (fitas de LED) |
| TWAI (CAN) | 🟡 | 🟡 | 🟡 | 🟡 | Parcial |
| I2S | 🟡 | ❌ | ❌ | ❌ | Em progresso; só ESP32 |
| USB nativo / CDC | ❌ | ✔️ | ❌ | ❌ | ESP32 clássico não tem USB nativo |
| Bluetooth | ❌ | ❌ | ❌ | ❌ | Nenhum chip simula → placa física |
| Hall sensor / MCPWM | ❌ | ❌ | — | ❌ | Não implementado |
Legenda: ✔️ simulado · 🟡 parcial/em progresso · ❌ não implementado · — indisponível no chip.
- Regra de decisão: se o periférico do pedido estiver ✔️ para o chip → Wokwi. Se estiver 🟡/❌ (ex.: Bluetooth, I2S fora do ESP32, MCPWM, Hall) → placa física (ou trocar o periférico/ajustar o chip).
- Chip alvo reflete-se em
platformio.ini(board = ...) e na peça dodiagram.json. Ex.:esp32dev,esp32-s3-devkitc-1,esp32-c6-devkitc-1. - Aula em placa física: o
pio run(e o CI) ainda compilam normalmente; a evidência de execução vem de log serial salvo emevidencias/*.txt(e, se pedido, foto/vídeo). A simulação Wokwi é pulada nessas tarefas.
Wokwi (apenas aulas com circuito simulado)
- Incluir
diagram.json(circuito) ewokwi.toml(.pio/build/<env>/firmware.bine.elf). Fluxo: Build → "Wokwi: Start Simulator". Recompilar antes de simular. - WiFi no Wokwi: SSID
Wokwi-GUEST, senha vazia; broker público (broker.hivemq.com:1883). Broker local no Wokwi exige o IoT Gateway (Wokwi Club). ESP32 físico → broker local direto (IP da máquina, nãolocalhost). - (Opcional) Verificação de saída serial no CI: cenário
test/*.test.yaml(wait-serial) +WOKWI_CLI_TOKEN. - Aula sem circuito: pular esta seção; o
labNN-templatetraz só os arquivos do artefato-alvo (ver "Estrutura de pastas").
Pontos de commit (componente CommitPoint)
- Marcar cada tarefa avaliada:
<CommitPoint task="descrição" pontos={N} />. Numeração automática T1…Tn na ordem do documento. - Props:
type,files(multi:files="a.cpp b.ini"),prefix,push,n,id(âncora),allowEmpty(deploy/release, sem mudar arquivos),run(comando extra, ex.: alias de deploy). - Convenção: 1 tarefa = 1 commit cuja mensagem começa com
Tn:. Vale o commitTn:mais recente; refazer > desfazer; nuncapush --forceno repo de grupo. - Passos de runtime (subir stack, testar MQTT, deploy, comandos git/gh, log serial) → salvar evidência em
evidencias/*.txt(checável) ouallowEmpty. - Alinhamento MDX × mensagem de commit: o
Tngerado pela ordem dosCommitPointdeve casar com oTn:escrito nos blocos de comando. Conferir após inserir/remover tarefas.
Pontuação (padrão)
- Somar 100 pts (o autograder normaliza p/ 0–10). Ex.: experimentos ~5 cada, projeto 15–25, desafios ~5 cada. Ajustar conforme o nº de tarefas.
- Split usual: Base T1…Tk = 80 pts · Desafios = 20 pts (declarar na nota
:::info Pontuaçãodo fim).
Ferramentas de autoria e correção
gen_tarefas_toc.py(emautograde/): gera o Mapa de tarefas a partir dosCommitPoint, para colar no início da aula (busca rápida pelo aluno).- Padrões:
--format list(bullets),--anchorsligado (injetaid="tN"p/ os links),--detailsligado (bloco recolhível). python3 autograde/gen_tarefas_toc.py aula.mdx --write→ insere/atualiza o bloco após o H1 (idempotente, entre marcadores) e injeta as âncoras.--format table|checklist|toc,--no-details,--no-anchors, e--check(CI: falha se o mapa estiver desatualizado).
- Padrões:
grade.py(nolabNN-grupo-n):TAREFAS=token,nome,pontos,checks. Checks:contem,nao_contem,arquivo,compila(pio run, aulas embarcadas),release(gh api),jobe(sandbox). Correção por commit (git worktree); geraGRADE.md+nota.csv. Deve conterassert sum(pontos) == 100.- Aulas de Markdown/ferramentas: usar checks de texto sobre o artefato (ex.: no
README.md— H1/H2, ênfase, listas, links, imagem, bloco de código, tabela, citação, régua, âncoras) com regex tolerantes.
- Aulas de Markdown/ferramentas: usar checks de texto sobre o artefato (ex.: no
- Repo
labNN-grupo-nautoconfigurável: deduz a aula pelo nome, descobre os grupos, corrige em paralelo (grade-one.yml+grade-all.yml), lê grupos read-only (org secretSTUDENTS_TOKEN), grava boletins emnotas/. À prova de adulteração. gen_grade.py: gera o scaffold dograde.pya partir dosCommitPoint(-o grade.py) e tem modo--check(compara MDX ×grade.py, aponta divergências — para CI).- Lógica pura no Jobe (sem Moodle): mocks
Arduino.h/WiFi.h/PubSubClient.h+ harness +jobe_test.py(--local/--jobe). Firmware real →pio run+ Wokwi.
Fluxo ao criar a aula
- Escrever a aula em MDX com
CommitPointem cada tarefa (validar:gen_grade.py aula.mdx --tarefas-onlydeve listar T1…Tn com os pontos certos e somar 100). - Definir o tipo (embarcada/placa física/ferramentas) e conferir a matriz Wokwi × placa física para cada periférico.
- Documentar a estrutura de pastas com
FileTree(template, correção e site). - Varrer MDX: nenhum
</{solto fora de código (só JSX deCommitPoint/Tabs/details/FileTree/LabSetup/LabLogout/LabTeamMembers/LabSubmit); nenhum<>{}&emtask="...". - Conferir alinhamento
Tn(ordem dos CommitPoint) ×Tn:das mensagens de commit. - Se a aula não for embarcada: confirmar que não sobrou resíduo de
platformio/wokwi/esp32/firmware/pio runno texto. python3 autograde/gen_tarefas_toc.py aula.mdx --write→ inserir o Mapa de tarefas no topo.gen_grade.py aula.mdx -o autograde/grade.py→ completar oschecks.- (Opcional) cenário Wokwi / check
jobeno CI.
Modelo de pedido (preencher)
- Tema / número (
labNN): … - Tipo: embarcada (Wokwi) · embarcada (placa física) · somente ferramentas …
- Chip alvo: (esp32 · esp32-s3 · esp32-c3 · esp32-c6 · …) …
- Objetivos de aprendizagem: …
- Periféricos/circuito: (LEDs, botões, sensores, I²C/SPI, MQTT, Bluetooth…) — checar na matriz se é Wokwi ou placa física …
- Artefato-alvo do template: (firmware
src/main.cpp·README.md· outro) … - Tarefas avaliadas (viram
CommitPointT1…Tn) e pontos de cada: … - Checagens por tarefa (
contem/compila/jobe/saída serial/release/Markdown): … - Desafios/gabarito? (sim/não) · Usa Docker/Node-RED? (sim/não)
Regras de qualidade do entregável
- Precisão técnica para ESP32 (ex.:
int/word= 4 bytes,double= 8 bytes; difere do Uno) — verificar quando o tamanho importa. - Ao escolher periféricos, conferir a matriz de simulação do Wokwi para o chip alvo antes de decidir Wokwi vs placa física.
- Buscar detalhes de ferramentas que mudam (versões de extensões/plugins, Wokwi,
gh, CodeRunner/Jobe) antes de afirmar. - Código com saída esperada ("preveja antes de rodar"); gabarito testável.
- Validar o que der: extração dos CommitPoint (soma = 100, sem char proibido em
task), Mapa de tarefas atualizado (gen_tarefas_toc.py --check), alinhamento Tn × mensagem, compilação de exemplos, parsing de configs, e — em aulas de Markdown — os checks contra um artefato de exemplo.