Logo Rodrigo Barbosa

🤖 ROBÓTICA NO ENSINO FUNDAMENTAL I — 5º ANO

⚡ 1º BIMESTRE: FUNÇÕES, LÓGICA E MICRO:BIT — A REVOLUÇÃO DOS PARAFUSOS PENSANTES ⚡
APROVADO PELO MINISTÉRIO DO SE-ENTÃO-SENÃO
Logo Gisele Nunes

📬 CARTA DE ABERTURA DO BIMESTRE

"ESQUECE O CHATGPT, A GENTE VAI PROGRAMAR UM ROBÔ QUE PENSA! (E QUE TALVEZ TENTE DOMINAR O MUNDO)" 😈🤖

Prezado(a) Professor(a) de Robótica,

Senta que lá vem história! Este bimestre não é sobre ficar copiando código igual um papagaio de pirata. É sobre TRANSFORMAR SEUS ALUNOS EM MESTRES DA LÓGICA, usando a placa mais irada do momento: a BBC micro:bit!

Você já imaginou seus alunos:

  • Criando um semáforo inteligente que decide quando abrir com base na luz ambiente? (E que pisca igual uma balada!)
  • Construindo um detector de mentiras que acusa o colega quando ele conta uma história duvidosa?
  • Programando um alarme ninja que dispara se alguém tocar na mochila?
  • Fazendo um coração pulsante que acelera quando você coloca o dedo no sensor?

Pois é, isso não é ficção científica. É ROBÓTICA COM MICRO:BIT!

E o melhor: tudo alinhado com a BNCC (porque a gente segue as regras, mas com estilo) e o RCP-PR (o currículo do Paraná que manda a gente ser foda no ensino de programação).

Bora codar? 🚀

Seu parceiro na revolução dos parafusos pensantes

🗺️ MAPEAMENTO BIMESTRE

RCP-PR · Programação e Robótica
Habilidades BNCC (Outras) Semana Título da Aula Habilidades BNCC (Matemática) Habilidades BNCC (LP)
Competência Geral 5 - Pensamento computacional
RCP-pr: Pensamento Algébrico - Função como máquina
1 "Função: o tio do churrasco que repete a mesma piada" EF05MA10 - Regularidades (repetição de comportamentos) EF05LP10 - Textos instrucionais (explicar o que a função faz)
RCP-pr: Pensamento Algébrico - Função como máquina 2 "Parâmetros: a lanchonete do robô que aceita pedidos" EF05MA01 - Ler e escrever números grandes (parâmetros) EF05LP10 - Especificar parâmetros
EF05CI01 - Construir protótipos 3 "Matrioska do código: funções que chamam funções" EF05MA10 - Regularidades (função maior chama outras) EF05LP10 - Estruturação textual (aninhamento)
RCP-pr: Prototipagem - Artefato modular 4 "Cardápio de funções: o minichef programador" EF05MA10 - Reutilização de funções EF05LP10 - Produzir texto instrucional
EF05CI02 - Estímulos e respostas 5 "Operadores lógicos: SE, E, OU, NÃO" EF05MA18 - Trajetos com decisões Conectivos lógicos
EF05MA23 - Coordenadas no tabuleiro 6 "O jogo do tabuleiro programado" EF05MA02 - Ler números (variáveis) Textos instrucionais
EF05CI01 - Protótipos com sensores 7 "O robô medroso e o sensor de toque" EF05MA10 - Regularidades (valores do sensor) Relatar experimentos
EF05CI01 - Protótipo funcional 8 "Cofre robô: a senha tátil" EF05MA10 - Sequências e padrões EF05LP17 - Planejar roteiro de teste
Competência Geral 7 - Argumentação 9 "Caça ao bug: exterminadores de erros" EF05MA10 - Bugs típicos se repetem EF05LP10 - Relatar experimentos
Todas do bimestre 10 "Avaliação: Passeporte da Função" Todas do bimestre Todas do bimestre

📋 BIMESTRE - PLANO SINTÉTICO

10 semanas de funções, lógica e micro:bit
Atividade Principal Semana Título da Aula Conceito
Criar função `piscar()` na micro:bit 1 "Função: o tio do churrasco que repete a mesma piada" Definir função como bloco de código reutilizável
Criar função `mostrarNumero(n)` 2 "Parâmetros: a lanchonete do robô que aceita pedidos" Parâmetros personalizam a função
Criar `dancaCompleta()` com subfunções 3 "Matrioska do código: funções que chamam funções" Funções aninhadas
Mini-sistema de animações com funções 4 "Cardápio de funções: o minichef programador" Revisão integrada
Código com condicionais na micro:bit 5 "Operadores lógicos: SE, E, OU, NÃO" AND, OR, NOT
Jogo de perguntas na micro:bit 6 "O jogo do tabuleiro programado" Variáveis + operadores lógicos
Robô que reage ao toque 7 "O robô medroso e o sensor de toque" Sensor de toque + lógica
Cofre com senha na micro:bit 8 "Cofre robô: a senha tátil" Projeto integrado
Identificar e corrigir bugs 9 "Caça ao bug: exterminadores de erros" Depuração de funções
5 estações com desafios 10 "Avaliação: Passeporte da Função" Avaliação prática

🎒 PLANOS DE AULA DETALHADOS -- BIMESTRE 1

Funções, Lógica e Micro:bit — A Revolução dos Parafusos Pensantes!
0/10
0%

🎯 Objetivos Operacionais
  • Definir o conceito de função como um bloco de código que executa uma tarefa específica e pode ser chamado várias vezes.
  • Criar funções simples com nomes significativos usando a micro:bit.
  • Executar uma função chamando-a pelo nome no programa principal.
  • Diferenciar definição de função de chamada de função.
📚 Conteúdo Programático

Conceito de função na programação — Criação de funções no MakeCode (bloco "function") — Chamada de função — Matriz de LEDs da micro:bit — Eventos (botão A, botão B).

📋 Habilidades BNCC e RCP-PR

BNCC (Matemática): EF05MA10 - Concluir regularidades (repetição de comportamentos via função).
BNCC (Língua Portuguesa): EF05LP10 - Produzir textos instrucionais (explicar o que a função faz).
BNCC (Outras): Competência Geral 5 - Pensamento computacional (decomposição e abstração).
RCP-pr (Programação): Programação de Sistemas - Criar e chamar funções em ambiente visual.

🧰 Materiais
Computadores com MakeCode BBC micro:bit para cada dupla Cabo USB Cartões coloridos: PISCAR, GIRAR, ANIMAR, MOSTRAR NÚMERO "Diário da Função" (folha de sulfite) Projetor para demonstração
🔧 Explicação Detalhada da Montagem do Hardware

Configuração Inicial:

  1. Conecte a micro:bit ao computador usando o cabo USB.
  2. A micro:bit acenderá com uma luz amarela/verde indicando que está recebendo energia.
  3. No computador, aparecerá uma unidade chamada "MICROBIT" (como se fosse um pendrive).
  4. Abra o navegador e acesse makecode.microbit.org.
  5. Clique em "Novo Projeto" e dê o nome AULA1_FUNCAO.

Verificação: A matriz de 5×5 LEDs da micro:bit deve acender com uma mensagem padrão quando conectada. Se não acender, verifique o cabo e a porta USB.

Compreendendo o Hardware: A BBC micro:bit é uma placa programável que funciona como um pequeno computador. Ela possui: Matriz de LEDs 5×5, Botões A e B, Conectores de borda.

💻 Código a Ser Desenvolvido

Código 1: Função PISCAR

// ========================================================================
// PROJETO DIDÁTICO - MICRO:BIT (MAKECODE)
// ========================================================================
// Tema: Controlando a Matriz de LEDs e o Tempo (Delay)
// 
// O que você precisa saber antes de começar:
// A placa micro:bit possui uma matriz frontal composta por 25 LEDs (5 colunas 
// x 5 linhas). Para controlar cada LED individualmente, usamos um sistema de 
// coordenadas (X, Y), onde:
//   - X (coluna) varia de 0 (esquerda) a 4 (direita).
//   - Y (linha) varia de 0 (cima) a 1 (baixo).
// 
// O ponto central da matriz está exatamente na coordenada (2, 2). É nele que 
// vamos trabalhar hoje!
// 
// Teoria fundamental para entender o código:
// Para o olho humano perceber uma piscada (ligado/desligado), o LED precisa 
// ficar aceso e apagado por um tempo mínimo. Se trocarmos o estado muito 
// rápido (menos de 50 milissegundos), o cérebro humano interpretará como se 
// o LED estivesse "meio aceso" ou tremendo (efeito de persistência retiniana).
// Por isso usamos pausas de 200 milissegundos (0,2 segundos) – é tempo 
// suficiente para vermos claramente o "ligar" e o "desligar".
// ========================================================================

// ==========================================
// FUNÇÃO PISCAR - O CORAÇÃO DA AULA DE HOJE!
// ==========================================
// ATENÇÃO: Uma função é como uma "receita de bolo". Ela agrupa vários 
// comandos em um único bloco que pode ser reutilizado quantas vezes 
// quisermos. Quando chamamos o nome da função (piscar()), o micro:bit 
// executa todas as linhas que estão dentro dela, na ordem em que aparecem.

// Declaramos a função chamada "piscar". Ela não recebe nenhum dado de 
// entrada (parâmetros) e também não devolve nenhum resultado. Seu único 
// objetivo é executar as instruções internas para criar o efeito visual.
function piscar() {
  
  // ----------------------------------------------------------------
  // COMANDO 1: led.plot(2, 2)
  // ----------------------------------------------------------------
  // O comando "led.plot" significa "desenhar/marcar um ponto na matriz".
  // Ele recebe dois números: a coordenada X (coluna) e a coordenada Y (linha).
  // Ao executar "led.plot(2, 2)", estamos mandando o micro:bit acender 
  // o LED que está exatamente no centro da tela (pois 2 é o valor central 
  // em uma escala que vai de 0 a 4).
  // 
  // Em termos elétricos: o micro:bit aplica uma tensão (voltagem) nos pinos 
  // que controlam a linha 2 e a coluna 2, fazendo com que esse LED específico 
  // emita luz. Todos os outros 24 LEDs permanecem apagados.
  led.plot(2, 2)

  // ----------------------------------------------------------------
  // COMANDO 2: basic.pause(200)
  // ----------------------------------------------------------------
  // O comando "basic.pause" faz o micro:bit "dormir" ou "esperar" por um 
  // determinado período de tempo.
  // O número 200 dentro dos parênteses representa 200 milissegundos (ms).
  // Lembre-se: 1000 ms = 1 segundo. Portanto, 200 ms = 0,2 segundos.
  // 
  // Por que colocamos esta pausa AQUI?
  // Porque queremos que o LED fique aceso por 0,2 segundos para que 
  // possamos vê-lo brilhando. Se não houvesse essa pausa, o micro:bit 
  // passaria para o próximo comando tão rápido que o LED acenderia e 
  // apagaria em menos de 1 microssegundo, sendo invisível aos nossos olhos!
  basic.pause(200)

  // ----------------------------------------------------------------
  // COMANDO 3: led.unplot(2, 2)
  // ----------------------------------------------------------------
  // O comando "led.unplot" é o oposto do "plot". Ele significa 
  // "desmarcar/apagar/remover" o ponto desenhado na matriz.
  // Ao executar "led.unplot(2, 2)", mandamos o micro:bit apagar o LED 
  // central que estava aceso. 
  // 
  // Em termos elétricos: o micro:bit corta a tensão que estava indo para 
  // a linha 2 e coluna 2, fazendo com que o LED apague completamente.
  led.unplot(2, 2)

  // ----------------------------------------------------------------
  // COMANDO 4: basic.pause(200)
  // ----------------------------------------------------------------
  // Aqui temos outra pausa de 200 milissegundos.
  // Mas por que precisamos de uma pausa depois de apagar o LED?
  // Porque o efeito de "piscar" exige que o LED fique APAGADO por algum 
  // tempo também. Se apagássemos e já acendêssemos de novo instantaneamente, 
  // o LED pareceria estar sempre aceso (só que um pouco mais fraco).
  // 
  // Esta segunda pausa garante que o LED fique desligado por 0,2 segundos, 
  // criando o ritmo visual perfeito para uma piscada (aceso 0,2s -> apagado 0,2s).
  basic.pause(200)

// Fim da função "piscar". Quando o micro:bit chega nesta chave "}", 
// ele volta para o local onde a função foi chamada e continua a execução 
// do programa a partir dali.
}


// ========================================================================
// INSTRUÇÕES FINAIS - COMO USAR ESTA FUNÇÃO NA PRÁTICA?
// ========================================================================
// ATENÇÃO: Apenas declarar a função NÃO faz o LED piscar! A função é como 
// um "manual de instruções". Precisamos "chamar" (executar) essa função para 
// que os comandos internos sejam colocados em ação.
//
// COMO CHAMAR A FUNÇÃO NO MAKECODE:
// Para vermos a piscada acontecendo infinitamente (até desligarmos a placa), 
// devemos colocar a chamada da função dentro de um laço de repetição "sempre" 
// (basic.forever). 
// 
// Código complementar obrigatório (que DEVE ser adicionado ao seu projeto):
// ----------------------------------------------------------------
// basic.forever(function () {
//     piscar()  // <--- Esta é a chamada da função! Executa "piscar" sem parar.
// })
// ----------------------------------------------------------------
//
// O que acontece se você chamar a função apenas no "iniciar" (on start)?
// Se você escrever apenas "piscar()" dentro do bloco "iniciar", o programa 
// acenderá o LED, esperará 200ms, apagará o LED, esperará 200ms e... 
// PARA! O programa termina. A placa ficará com o LED apagado para sempre, 
// pois a função só foi executada UMA ÚNICA VEZ.
//
// PORTANTO: Para uma piscada contínua, SEMPRE use a função dentro do 
// "basic.forever".
// ========================================================================

Código 2: Programa Principal

/*
 ============================================================
 PROJETO DIDÁTICO - MICRO:BIT (MAKECODE)
 ============================================================
 OBJETIVO GERAL:
 Este programa ensina os conceitos fundamentais de:
 - Programação orientada a eventos (Event-Driven Programming)
 - Interação com o hardware (botões físicos A e B)
 - Estruturas de repetição (laço FOR)
 - Criação e chamada de funções (mesmo que a função 'piscar' ainda
   precise ser definida pelo estudante).

 FUNCIONALIDADE ESPERADA:
 - Ao pressionar o botão A, a matriz de LEDs deve piscar 1 vez.
 - Ao pressionar o botão B, a matriz de LEDs deve piscar 5 vezes.

 OBSERVAÇÃO IMPORTANTE SOBRE A FUNÇÃO 'piscar()':
 ------------------------------------------------
 O código chama uma função chamada 'piscar()', mas ela NÃO está
 definida neste trecho. Em um projeto completo, o estudante
 deve criar esta função. Exemplo do que ela deve conter:
 
 function piscar() {
     led.plotAll()      // Acende todos os LEDs
     basic.pause(200)   // Aguarda 200 milissegundos
     led.unplotAll()    // Apaga todos os LEDs
     basic.pause(200)   // Aguarda 200 milissegundos
 }
 
 Isso garante que o efeito de "piscar" seja visualmente perceptível.
 ============================================================
*/

// ============================================================
// BLOCO 1: EVENTO DO BOTÃO A (Pressionar uma vez)
// ============================================================
// A função 'input.onButtonPressed' é um "ouvinte de eventos".
// Ela fica monitorando constantemente se o usuário interagiu com
// o botão A do micro:bit.
// 
// Parâmetros:
//   1. Button.A -> Especifica que estamos vigiando o botão A.
//   2. function () { ... } -> É a "função de retorno" (callback).
//      Ela será executada automaticamente SEMPRE que o botão A for
//      pressionado (evento de borda de subida - "pressed").
//
// DENTRO DA FUNÇÃO:
// A única instrução é 'piscar()'. Isso significa que, ao apertar
// o botão A, o micro:bit irá executar a rotina de piscar UMA única vez.
// 
// APRENDIZADO DIDÁTICO:
// Perceba que aqui temos uma relação direta: 1 clique do usuário
// resulta em 1 piscada. Isso é chamado de comportamento "síncrono"
// acionado por interrupção (hardware interrupt).
// ============================================================
input.onButtonPressed(Button.A, function () {
  piscar()
})

// ============================================================
// BLOCO 2: EVENTO DO BOTÃO B (Pressionar para repetir)
// ============================================================
// Aqui temos o segundo ouvinte de eventos, agora focado no botão B.
// Assim que o botão B for pressionado, a função de retorno será
// executada. Note que esta função é mais complexa, pois contém
// uma estrutura de repetição.
//
// DENTRO DA FUNÇÃO (ANÁLISE DO LAÇO FOR):
// for (let i = 0; i < 5; i++) { ... }
// 
// Esta é uma das estruturas de controle mais importantes da
// programação. Vamos detalhar cada parte:
// 
// 1. INICIALIZAÇÃO: 'let i = 0'
//    -> Criamos uma variável contadora chamada 'i' e atribuímos
//       o valor inicial ZERO (0). Esta variável controla quantas
//       vezes o laço já rodou.
// 
// 2. CONDIÇÃO: 'i < 5'
//    -> O laço só continua rodando ENQUANTO esta condição for
//       verdadeira (true). Aqui, enquanto 'i' for menor que 5,
//       o bloco de código dentro das chaves { ... } será executado.
//       Quando 'i' chegar a 5, a condição fica falsa (5 < 5 é falso)
//       e o programa sai do laço.
// 
// 3. INCREMENTO: 'i++'
//    -> Após executar todo o bloco interno, o programa faz o
//       incremento (soma 1) ao valor de 'i'. Isso impede que o
//       laço rode para sempre (looping infinito).
// 
// FLUXO DE EXECUÇÃO PASSO A PASSO:
// - 1ª volta: i = 0 (0 < 5, entra) -> executa piscar() -> depois i vira 1.
// - 2ª volta: i = 1 (1 < 5, entra) -> executa piscar() -> depois i vira 2.
// - 3ª volta: i = 2 (2 < 5, entra) -> executa piscar() -> depois i vira 3.
// - 4ª volta: i = 3 (3 < 5, entra) -> executa piscar() -> depois i vira 4.
// - 5ª volta: i = 4 (4 < 5, entra) -> executa piscar() -> depois i vira 5.
// - 6ª checagem: i = 5 (5 < 5? Falso!) -> SAÍ do laço. Fim da função.
// 
// RESULTADO FINAL:
// Ao apertar o botão B, a função 'piscar()' será chamada 5 vezes
// em sequência, resultando em 5 piscadas completas.
// 
// APRENDIZADO DIDÁTICO (Dica valiosa):
// Se a função 'piscar()' NÃO tiver pausas (basic.pause) internas,
// as 5 piscadas acontecerão tão rápido (milissegundos) que o olho
// humano não verá o efeito, parecendo que o LED ficou aceso ou apagado
// o tempo todo. Por isso, ao definir 'piscar()', lembre-se de
// colocar pausas (ex: 200ms) entre "acender" e "apagar".
// ============================================================
input.onButtonPressed(Button.B, function () {
  for (let i = 0; i < 5; i++) {
    piscar()
  }
})

/*
 ============================================================
 CONCLUSÃO E PRÓXIMOS PASSOS PARA O ESTUDANTE:
 ============================================================
 1. Copie este código para o ambiente MakeCode (JavaScript).
 2. Logo acima ou abaixo deste bloco, crie a função 'function piscar()'.
 3. Dentro dela, use 'led.plotAll()', 'basic.pause(200)', 
    'led.unplotAll()' e 'basic.pause(200)' para ver o efeito visual.
 4. Teste no simulador ou carregue no micro:bit físico:
    - Aperte A -> 1 piscada.
    - Aperte B -> 5 piscadas.
 
 Este código é a base para entender como interagir com o mundo
 físico usando programação. Domine o FOR e os eventos e você
 estará pronto para criar projetos incríveis, como semáforos,
 contadores ou jogos com botões!
 ============================================================
*/
⏱️ Detalhamento Minuto a Minuto (50 min)
0-5 min
O Grito da Função - Ativação Neurológica 🔥 — "HOJE VOCÊS VÃO APRENDER O CONCEITO MAIS PODEROSO DA PROGRAMAÇÃO: FUNÇÃO! FUNÇÃO NÃO É SÓ AQUELA COISA DA MATEMÁTICA COM X E Y! FUNÇÃO É UM BLOCO DE CÓDIGO QUE A GENTE CHAMA QUANDO QUER!" Ação: Definir uma função corporal: SAUDACAO_ROBO() = pular + bater palmas + gritar "Robô ativo!". Fazer junto com a turma 3 vezes. Pergunta: "Se eu quiser fazer essa bagunça de novo, o que eu faço?" (Resposta: "Chama a função!")
5-15 min
Programação Desplugada - Cartões de Função 🃏 — Em duplas, cada aluno recebe 5 cartões de ações. Desafio: definir uma função DANÇA_ESTRANHA() que é uma sequência de 3 ações. Os alunos escrevem no verso do cartão principal: DANÇA_ESTRANHA() = [ação1] + [ação2] + [ação3]. Discussão: "Por que é útil dar um nome para um conjunto de ações?" (Para não ter que repetir tudo toda vez)
15-25 min
Primeira Função na Micro:bit 💻 — Passo a passo (professor projeta, alunos acompanham): 1. Abrir MakeCode e criar novo projeto. 2. Clicar em "Avançado" → "Funções" → "Criar uma função". 3. Nomear a função como piscar. 4. Adicionar os blocos dentro: plot x y com x=2, y=2; pausa (ms) com 200; unplot x y com x=2, y=2; pausa (ms) com 200. 5. No programa principal: ao pressionar botão A (em "Entrada"); Dentro: colocar o bloco chamar piscar. 6. Testar no simulador.
25-35 min
Desafio do Pisca-Pisca ⚡ — Criar uma função piscaPisca() que faz o LED piscar 5 vezes usando repetir. function piscaPisca() { for (let i = 0; i < 5; i++) { led.plot(2, 2); basic.pause(100); led.unplot(2, 2); basic.pause(100); } }
35-45 min
Animação com Funções ❤️ — Criar função coração() que desenha um coração na matriz. function coracao() { let coracao = images.createImage(`. . . . . . . . . . . . . . . . . . . . . . . . .`); coracao.showImage(0); }
45-50 min
Diário de Bordo 📝 — Cada aluno escreve: "Minha função de hoje se chamava ______." "Ela fazia (descreva) ______." "Eu chamei ela fazendo (o que escrevi no código) ______."
♿ Orientações para Adaptações e Inclusão
  • TEA: Rotina visual na lousa: (1) Definir função, (2) Chamar função, (3) Testar, (4) Anotar. Usar cores fixas: azul para definição, vermelho para chamada. Cartões com instruções passo a passo impressas.
  • TDAH: Checklist individual: [ ] Criei a função, [ ] Testei com botão A, [ ] Anotei no diário. Timer visível no projetor. Dividir em blocos curtos com pausas ativas.
  • Deficiência física: Usar botões grandes (Makey Makey) como alternativa. Configurar comandos de voz. Permitir que um colega digite o código conforme o aluno dita.
  • Altas habilidades: Criar função com parâmetro (introdução intuitiva): piscar(3) pisca 3 vezes. Adicionar mais animações à função coração.
📊 Critérios Operacionais de Avaliação
Critério Evidência Pontuação
Compreensão do conceito de função Explica o que é uma função em suas palavras 0-3
Criação da função no MakeCode Criou piscar() com os blocos corretos 0-3
Chamada da função Usou a função no programa principal 0-2
Registro no diário Completou as perguntas do diário 0-2

Total: 10 pontos

Frase do dia: "Função é a receita de bolo do código: você escreve uma vez e usa várias vezes!"

🎯 Objetivos Operacionais
  • Compreender parâmetros como informações que a função precisa para funcionar de maneira personalizada.
  • Criar funções que recebem parâmetros numéricos para controlar a matriz de LEDs.
  • Chamar a mesma função com parâmetros diferentes, observando comportamentos distintos.
  • Diferenciar parâmetro (o que a função espera) de argumento (o que você passa).
📚 Conteúdo Programático

Definição de parâmetros em funções — Tipos de parâmetros (numérico) — Chamada de função com argumentos — Controle da matriz de LEDs com parâmetros — Introdução à função mostrar número com parâmetro.

📋 Habilidades BNCC e RCP-PR

BNCC (Matemática): EF05MA01 - Ler e escrever números naturais até a ordem das centenas de milhar. EF05MA10 - Concluir regularidades (mesma função, resultado diferente conforme o parâmetro).
BNCC (Língua Portuguesa): EF05LP10 - Produzir textos instrucionais (especificar quais parâmetros são necessários).
BNCC (Outras): Competência Geral 5 - Pensamento computacional.
RCP-pr (Programação): Pensamento Algébrico - Função como máquina que transforma entrada em saída.

🧰 Materiais
Computadores com MakeCode BBC micro:bit para cada dupla Cabo USB Cartões com números de 0 a 9 "Cardápio de Parâmetros" (folha ilustrada) Canetas coloridas
🔧 Explicação Detalhada da Montagem do Hardware

Configuração da micro:bit: Conecte a micro:bit ao computador via USB. Acesse makecode.microbit.org e crie um novo projeto chamado AULA2_PARAMETROS. A micro:bit possui uma matriz de LEDs 5×5 que será nosso principal "display".

Verificação da Matriz: A matriz de LEDs é composta por 25 LEDs individuais (5 colunas × 5 linhas). Cada LED pode ser aceso individualmente usando coordenadas (0 a 4). A função led.plot(x, y) acende o LED na posição (x, y). A função led.unplot(x, y) apaga o LED na posição (x, y).

Explorando os Botões: O micro:bit tem dois botões (A e B) que são dispositivos de entrada que, quando pressionados, executam uma ação programada. Podemos usá-los para chamar funções com diferentes parâmetros.

💻 Código a Ser Desenvolvido

Código 1: Função com Parâmetro Numérico

/*
 * =====================================================================
 * PROJETO: Micro:bit - Exibindo Números com Botões
 * =====================================================================
 *
 * Este é um programa didático para a placa micro:bit, desenvolvido
 * no ambiente MakeCode (Microsoft).
 *
 * OBJETIVO:
 *   Ao pressionar o botão A, o micro:bit exibe o número 5.
 *   Ao pressionar o botão B, o micro:bit exibe o número 8.
 *
 * CONCEITOS ENSINADOS:
 *   - Funções (criação e chamada)
 *   - Eventos de botão (input.onButtonPressed)
 *   - Manipulação da matriz de LED (basic.clearScreen, basic.showNumber)
 *   - Variáveis e parâmetros
 *
 * Este código é um ponto de partida para entender como programar
 * respostas a interações do usuário com o micro:bit.
 * =====================================================================
 */

/**
 * ---------------------------------------------------------------------
 * FUNÇÃO: mostrarNumero
 * ---------------------------------------------------------------------
 * Esta função recebe um número (parâmetro 'n') e o exibe na matriz
 * de LEDs do micro:bit.
 *
 * Passos executados:
 *   1. Limpa a tela (apaga todos os LEDs acesos).
 *   2. Exibe o número passado como argumento, utilizando a função
 *      'basic.showNumber' que já faz a animação do dígito.
 *
 * Por que usar uma função?
 *   - Evita repetição de código (quando quisermos mostrar números
 *     em diferentes situações, chamamos apenas esta função).
 *   - Deixa o programa mais organizado e fácil de modificar.
 *
 * @param n - O número inteiro a ser exibido (ex: 5, 8, etc.)
 */
function mostrarNumero(n: number) {
  // Apaga todos os LEDs da matriz 5x5.
  basic.clearScreen()

  // Mostra o número 'n' na tela (com animação de rolagem se for
  // maior que 9, mas para 5 e 8 é exibido estaticamente).
  basic.showNumber(n)
}

/**
 * ---------------------------------------------------------------------
 * EVENTO: Pressionamento do Botão A
 * ---------------------------------------------------------------------
 * Quando o botão A (localizado à esquerda da matriz de LEDs) for
 * pressionado, esta função é executada automaticamente.
 *
 * Ação: Chama a função mostrarNumero passando o valor 5.
 *
 * Por que 5? É um número fixo definido para este exemplo didático.
 * Você pode alterar para qualquer outro número.
 */
input.onButtonPressed(Button.A, function () {
  // Chama a função que exibe o número na tela.
  mostrarNumero(5)
})

/**
 * ---------------------------------------------------------------------
 * EVENTO: Pressionamento do Botão B
 * ---------------------------------------------------------------------
 * Quando o botão B (localizado à direita da matriz de LEDs) for
 * pressionado, esta função é executada automaticamente.
 *
 * Ação: Chama a função mostrarNumero passando o valor 8.
 *
 * Dica: Você pode associar diferentes números a cada botão para
 *       criar um "teclado numérico" simples.
 */
input.onButtonPressed(Button.B, function () {
  // Chama a função que exibe o número na tela.
  mostrarNumero(8)
})

/**
 * ---------------------------------------------------------------------
 * OBSERVAÇÕES FINAIS:
 * ---------------------------------------------------------------------
 * - O micro:bit, ao ser ligado, executa o programa a partir do início.
 * - Como não há código fora das funções de evento, o micro:bit
 *   aguarda até que um botão seja pressionado (não faz nada
 *   inicialmente, pois a tela está limpa).
 * - Você pode adicionar mais botões (ex: A+B simultaneamente)
 *   para exibir outros números ou executar outras ações.
 * - A função 'basic.showNumber' também pode exibir números negativos
 *   e decimais (com algumas limitações).
 *
 * Desafio para o aluno:
 *   - Modifique o programa para que o botão A mostre o número 10
 *     e o botão B mostre o número 20.
 *   - Crie um terceiro evento para o pressionamento simultâneo
 *     (A+B) que mostre o número 0.
 * =====================================================================
 */

Código 2: Função com Múltiplos Parâmetros

/**
 * =====================================================================
 * PROGRAMA: Piscar LED com Botões A+B
 * =====================================================================
 * 
 * OBJETIVO:
 * Este programa foi desenvolvido para a placa micro:bit e demonstra
 * o controle da matriz de LEDs (5x5) de forma interativa.
 * 
 * Ao pressionar os botões A e B simultaneamente (AB), um LED localizado
 * no centro da matriz (coordenadas 2,2) irá piscar 3 vezes, com um
 * intervalo de 200 milissegundos entre cada mudança de estado.
 * 
 * CONCEITOS ENSINADOS:
 * - Funções com parâmetros (x, y, vezes)
 * - Laço de repetição (for)
 * - Controle de LEDs (ligar/desligar)
 * - Temporização com pausas (basic.pause)
 * - Eventos de botão (input.onButtonPressed)
 * - Coordenadas da matriz de LEDs do micro:bit (0 a 4 em ambos os eixos)
 * 
 * =====================================================================
 */

/**
 * Função que faz um LED piscar em uma posição específica da matriz,
 * repetindo o processo um número determinado de vezes.
 *
 * @param x     Coordenada horizontal (coluna) do LED, variando de 0 a 4.
 *              O valor 0 representa a coluna mais à esquerda e 4 a mais à direita.
 * @param y     Coordenada vertical (linha) do LED, variando de 0 a 4.
 *              O valor 0 representa a linha superior e 4 a inferior.
 * @param vezes Quantidade de vezes que o LED deve piscar (ciclos completos:
 *              ligado + desligado).
 *
 * @note A matriz de LEDs do micro:bit possui 5 colunas (x) e 5 linhas (y).
 *       O centro da matriz está em (2, 2).
 */
function piscarLED(x: number, y: number, vezes: number) {
  // Laço de repetição: será executado 'vezes' iterações.
  // A variável 'i' é o contador, começando em 0 e incrementando até
  // atingir 'vezes - 1'. Isso garante que o bloco interno seja
  // executado exatamente 'vezes' vezes.
  for (let i = 0; i < vezes; i++) {

    // led.plot(x, y) acende o LED na posição (x, y).
    // A matriz é endereçada por coordenadas: (0,0) no canto superior esquerdo
    // e (4,4) no canto inferior direito.
    led.plot(x, y)

    // basic.pause(200) faz o programa aguardar 200 milissegundos (0,2 segundos)
    // com o LED aceso, permitindo que o olho humano perceba o brilho.
    basic.pause(200)

    // led.unplot(x, y) apaga o LED na posição (x, y), ou seja, desliga-o.
    led.unplot(x, y)

    // Nova pausa de 200 ms com o LED apagado, para criar o efeito de "piscada"
    // completa. O tempo total de um ciclo é 200 ms ligado + 200 ms desligado = 400 ms.
    basic.pause(200)
  }
  // Após o término do laço, o LED permanece apagado, pois a última ação
  // executada dentro do loop foi unplot.
}

/**
 * Configuração do evento de pressionamento dos botões A e B simultaneamente.
 * 
 * input.onButtonPressed(Button.AB, function () { ... }) é uma função
 * do micro:bit que executa um bloco de código sempre que os botões
 * A e B forem pressionados ao mesmo tempo.
 * 
 * Quando isso ocorre, chamamos a função piscarLED passando:
 * - x = 2 (coluna central)
 * - y = 2 (linha central)
 * - vezes = 3 (o LED piscará três vezes)
 * 
 * Isso resulta em um LED central piscando três vezes de forma visível,
 * demonstrando o uso combinado de funções, laços e temporização.
 */
input.onButtonPressed(Button.AB, function () {
  piscarLED(2, 2, 3)
})

// =====================================================================
// FIM DO PROGRAMA
// =====================================================================
// Este código é autoexplicativo e foi comentado com fins educacionais.
// Qualquer dúvida, consulte a documentação oficial do micro:bit ou
// os tutoriais da plataforma MakeCode.

Código 3: Função com Parâmetro Textual (usando números como código)


                  /**
 * =====================================================================
 * FUNÇÃO: mostrarEmocao
 * =====================================================================
 * 
 * OBJETIVO:
 *   Exibir uma imagem (ícone) no display de LEDs do micro:bit para
 *   representar uma emoção, de acordo com um código numérico recebido.
 * 
 * PARÂMETRO:
 *   codigo : number  - Número inteiro que identifica qual emoção deve
 *                      ser mostrada. Neste exemplo, usamos:
 *                      1 -> feliz
 *                      2 -> triste
 * 
 * RETORNO:
 *   Nenhum (void). Apenas atualiza o display.
 * 
 * COMO FUNCIONA:
 *   1. Limpa todo o display (apaga qualquer imagem anterior).
 *   2. Verifica o valor do parâmetro 'codigo'.
 *   3. Se for 1, cria uma imagem para "feliz" e a exibe.
 *   4. Se for 2, cria uma imagem para "triste" e a exibe.
 *   5. Se for outro valor, nada é exibido (display permanece vazio).
 * 
 * OBSERVAÇÕES DIDÁTICAS:
 *   - As imagens são criadas usando a função images.createImage().
 *   - Aqui usamos template strings (crases) com quebras de linha reais.
 *     Cada linha tem 5 caracteres: '.' (LED apagado) e '#' (LED aceso).
 *     Os espaços entre os caracteres são opcionais e servem apenas para
 *     facilitar a leitura – o MakeCode os ignora.
 *   - O método showImage(0) exibe a imagem no display. O parâmetro '0'
 *     significa que a imagem ficará visível indefinidamente (até que
 *     outra imagem ou comando a substitua). Se você colocar um número
 *     positivo (em milissegundos), a imagem aparecerá por esse tempo
 *     e depois desaparecerá.
 *   - A função basic.clearScreen() apaga todos os LEDs, garantindo que
 *     não haja resquícios de exibições anteriores.
 * 
 * SUGESTÃO DE MELHORIA (sem alterar o código):
 *   - Use constantes com nomes significativos para os códigos, por
 *     exemplo: const FELIZ = 1; const TRISTE = 2; para tornar o
 *     código mais legível.
 *   - Você pode adicionar outras emoções (surpresa, raiva, etc.)
 *     usando novos else if.
 *   - As imagens podem ser pré-definidas fora da função para evitar
 *     recriá-las a cada chamada, economizando memória.
 * 
 * EXEMPLO DE IMAGEM PARA "FELIZ" (olhos e boca sorrindo):
 *   . # . # .
 *   . . . . .
 *   . . . . .
 *   # . . . #
 *   . # # # .
 * 
 * EXEMPLO DE IMAGEM PARA "TRISTE" (olhos e boca triste):
 *   . # . # .
 *   . . . . .
 *   . . . . .
 *   . # # # .
 *   # . . . #
 * 
 * =====================================================================
 */

function mostrarEmocao(codigo: number) {
    // Limpa o display de LEDs, apagando qualquer imagem que esteja
    // sendo mostrada no momento. Isso evita "fantasmas" ou sobreposição.
    basic.clearScreen()

    // Verifica se o código é igual a 1 (emoção feliz).
    if (codigo == 1) {
        // Cria uma imagem a partir de um template string com 5 linhas.
        // Cada linha tem 5 caracteres ('.' ou '#'), e os espaços são
        // apenas para organização visual – o MakeCode os desconsidera.
        let feliz = images.createImage(`
            . # . # .
            . . . . .
            . . . . .
            # . . . #
            . # # # .
        `)
        // Exibe a imagem criada. O argumento '0' faz com que a imagem
        // permaneça no display até que outra seja mostrada ou a tela
        // seja limpa.
        feliz.showImage(0)
    }
    // Caso o código seja 2 (emoção triste).
    else if (codigo == 2) {
        let triste = images.createImage(`
            . # . # .
            . . . . .
            . . . . .
            . # # # .
            # . . . #
        `)
        triste.showImage(0)
    }
    // Se o código não for 1 nem 2, nada é exibido – o display
    // permanece vazio (pois foi limpo no início da função).
}

// =====================================================================
// INTERAÇÃO COM OS BOTÕES DO MICRO:BIT
// =====================================================================
// O micro:bit possui apenas dois botões físicos: A e B.
// Associamos cada botão a uma emoção:
//   - Botão A → código 1 (feliz)
//   - Botão B → código 2 (triste)
// =====================================================================

input.onButtonPressed(Button.A, function () {
    mostrarEmocao(1)
})

input.onButtonPressed(Button.B, function () {
    mostrarEmocao(2)
})

// =====================================================================
// MENSAGEM INICIAL (OPCIONAL)
// =====================================================================
// Exibe uma instrução rápida ao ligar o micro:bit.
// =====================================================================

basic.showString("A=Feliz B=Triste")
⏱️ Detalhamento Minuto a Minuto (50 min)
0-5 min
Abertura - O Drive-Thru da Programação 🍔 — "Bem-vindos à LANCHONETE DO ROBÔ! Hoje a função vai receber INGREDIENTES! Parâmetro é igual ao pedido no drive-thru: 'Quero um sanduíche COM QUEIJO, SEM PICLES, COM BACON'." Dinâmica: Professor escolhe um aluno para ser o "robô cozinheiro". Dá um cartão com fazerSanduiche(2) (2 = queijo). O aluno executa a ação (pega queijo imaginário). Depois outro aluno com fazerSanduiche(3) (3 = bacon). Pergunta: "O que mudou?" (O parâmetro/ingrediente)
5-15 min
Jogo da Lanchonete Desplugada 🎮 — Em duplas: Aluno A = Cliente: dá um cartão com parâmetro (ex: mostrarNumero(7)). Aluno B = Robô: mostra o número com os dedos. Depois de 3 rodadas, trocam os papéis. Discussão: "O que acontece se o cliente pedir um número que não existe? (ex: mostrarNumero(15))" (Resposta: o robô fica confuso - erro de parâmetro)
15-25 min
Primeira Função com Parâmetro no MakeCode 💻 — Passo a passo (professor projeta): 1. Criar função mostrarNumero com parâmetro n (tipo número). 2. Dentro: basic.showNumber(n). 3. No programa principal: ao pressionar botão A → mostrarNumero(5). 4. Testar no simulador. 5. Adicionar ao pressionar botão B → mostrarNumero(8). Desafio: "O que acontece se você colocar mostrarNumero(10)?" (Mostra "10" na matriz - dois dígitos sequenciais)
25-35 min
Função com Múltiplos Parâmetros - Pisca-LED 💡 — Criar função piscarLED(x, y, vezes): 1. Criar função com 3 parâmetros: x (número), y (número), vezes (número). 2. Dentro: loop for de 0 até vezes - 1. 3. Dentro do loop: led.plot(x, y), pause(200), led.unplot(x, y), pause(200). 4. No programa principal: ao pressionar botão A+B → piscarLED(2, 2, 3). Desafio: Piscar um LED em uma posição diferente (ex: piscarLED(0, 0, 5))
35-45 min
Projeto - Emoticon com Parâmetro 😊 — Criar função mostrarEmocao(codigo): 1. Criar função com parâmetro codigo (número). 2. Usar if para escolher qual imagem mostrar. 3. Criar 3 imagens diferentes (feliz, triste, surpreso). 4. No programa principal: usar Math.randomRange(1, 3) para escolher aleatoriamente.
45-50 min
Diário de Bordo da Função 📝 — Cada aluno escreve: "A função que eu criei que tinha parâmetros se chamava ______." "Ela recebia os seguintes parâmetros: ______." "Quando eu mudei o parâmetro de ______ para ______, o resultado mudou porque ______." "Desenhe a função como uma máquina: entradas (parâmetros) → PROCESSO → saída."
♿ Orientações para Adaptações e Inclusão
  • TDAH: Âncora visual: seta apontando para o local onde se digita o parâmetro no MakeCode. Dividir a tela em duas partes: "Entrada (parâmetros)" e "Saída (ação)". Checklist: [ ] Criei função com parâmetro, [ ] Testei com 2 valores diferentes, [ ] Anotei resultado.
  • Deficiência visual: Parâmetros táteis: usar objetos pequenos (botões, moedas) para representar números. Feedback sonoro: cada parâmetro é "lido" pelo computador.
  • Altas habilidades: Criar função com dois parâmetros que desenha formas geométricas na matriz. Adicionar parâmetro de "velocidade" para controlar o tempo de pausa.
📊 Critérios Operacionais de Avaliação
Critério Evidência Pontuação
Compreensão de parâmetros Explica o que são parâmetros com exemplo 0-3
Criação de função com parâmetro Criou mostrarNumero com 1 parâmetro 0-3
Chamada com diferentes valores Usou a mesma função com argumentos diferentes 0-2
Registro no diário Completou as 4 seções do diário 0-2

Total: 10 pontos

Frase do dia: "Parâmetro é o ingrediente que a função cozinha. Mude o ingrediente, mude o resultado!"

🎯 Objetivos Operacionais
  • Compreender aninhamento de funções (uma função chamar outra).
  • Escrever programas com funções auxiliares que compõem uma função maior.
  • Identificar a ordem de execução (rastrear a pilha de chamadas).
  • Criar animações complexas usando funções aninhadas na micro:bit.
📚 Conteúdo Programático

Aninhamento de funções — Função que chama outra função — Rastreamento de pilha de chamadas — Criação de animações modulares — Estrutura hierárquica de código.

📋 Habilidades BNCC e RCP-PR

BNCC (Matemática): EF05MA10 - Concluir regularidades (a função maior é um padrão que chama outros padrões).
BNCC (Ciências): EF05CI01 - Construir protótipos (o robô tem subsistemas representados por funções).
BNCC (LP): EF05LP10 - Estruturação textual (aninhamento de informações).
RCP-pr (Programação): Estruturação de sistemas - Decomposição hierárquica.

🧰 Materiais
Computadores com MakeCode BBC micro:bit para cada dupla Boneca matrioska (real ou imagem) Cartões coloridos com partes do corpo "Mapa de Funções" (diagrama de bolhas impresso)
🔧 Explicação Detalhada da Montagem do Hardware

Configuração: Conecte a micro:bit ao computador. Acesse makecode.microbit.org e crie um novo projeto: AULA3_MATRIOSKA. A matriz de LEDs será usada para criar animações sequenciais. Vamos explorar como funções podem controlar diferentes "camadas" da animação.

Compreendendo a Matriz: A matriz 5×5 é perfeita para desenhar ícones simples. Cada função pode desenhar uma parte da animação. Funções aninhadas combinam essas partes em sequências complexas.

💻 Código a Ser Desenvolvido

Código 1: Funções Básicas para Animações

/**
 * =====================================================================
 * PROJETO DIDÁTICO - MICRO:BIT (MAKECODE)
 * =====================================================================
 *
 * Este código contém três funções que exibem formas geométricas no
 * display de LEDs do micro:bit (matriz 5x5).
 *
 * Cada função cria uma imagem personalizada, mostra-a no display e
 * mantém a imagem visível por um breve intervalo (500 ms).
 *
 * As funções podem ser chamadas em eventos, por exemplo:
 * - Ao iniciar o micro:bit (bloco "no iniciar")
 * - Ao pressionar um botão (bloco "ao pressionar botão A")
 * - Em um laço de repetição, para criar animações.
 *
 * =====================================================================
 * ESTRUTURA DO DISPLAY (MATRIZ 5x5)
 * =====================================================================
 * O micro:bit possui 25 LEDs organizados em 5 colunas e 5 linhas.
 * Cada LED pode estar aceso (representado por '#') ou apagado ('.').
 *
 * Exemplo de uma imagem simples (um ponto no centro):
 *   . . . . .
 *   . . . . .
 *   . . # . .
 *   . . . . .
 *   . . . . .
 *
 * Para criar uma imagem no código, usamos a função:
 *   images.createImage(`...`)
 *
 * A string entre crases deve conter EXATAMENTE 5 linhas, cada uma com
 * 5 caracteres (que podem ser '#' ou '.'). As quebras de linha são
 * importantes para separar as linhas.
 *
 * =====================================================================
 * FUNÇÕES DISPONÍVEIS
 * =====================================================================
 * 1. coracao()   - Exibe um coração.
 * 2. quadrado()  - Exibe um quadrado preenchido.
 * 3. flechaCima()- Exibe uma seta apontando para cima.
 *
 * Cada função executa três passos:
 *   a) Cria a imagem com images.createImage()
 *   b) Mostra a imagem no display com img.showImage(0)
 *   c) Aguarda 500 ms com basic.pause(500)
 *
 * O parâmetro '0' em showImage(0) significa que a imagem é exibida
 * imediatamente e permanece até que outra imagem seja mostrada ou que
 * o display seja limpo. O pause seguinte garante que o usuário tenha
 * tempo de visualizar a imagem.
 * =====================================================================
 */

/**
 * ----------------------------------------------------------------
 * FUNÇÃO: coracao()
 * ----------------------------------------------------------------
 * Exibe um desenho de coração no display.
 * A imagem foi construída com pontos (#) para formar o formato
 * típico de um coração.
 *
 * Padrão usado (linha a linha):
 *   . # # # .    ->  ".###."
 *   # # # # #    ->  "#####"
 *   # # # # #    ->  "#####"
 *   . # # # .    ->  ".###."
 *   . . # . .    ->  "..#.."
 *
 * Cada '#' representa um LED aceso.
 * Cada '.' representa um LED apagado.
 */
function coracao() {
    // Cria a imagem a partir de uma string com 5 linhas.
    // A sintaxe com crases (`) permite escrever a string em várias linhas.
    let img = images.createImage(`
        . # # # .
        # # # # #
        # # # # #
        . # # # .
        . . # . .
    `);

    // Exibe a imagem no display. O argumento 0 indica que a imagem
    // deve aparecer sem animação de rolagem.
    img.showImage(0);

    // Pausa a execução do programa por 500 milissegundos (meio segundo)
    // para que o usuário possa ver a imagem antes que outra ação ocorra.
    basic.pause(500);
}

/**
 * ----------------------------------------------------------------
 * FUNÇÃO: quadrado()
 * ----------------------------------------------------------------
 * Exibe um quadrado totalmente preenchido no display.
 * Todos os 25 LEDs são acesos, formando um bloco luminoso.
 *
 * Padrão usado (linha a linha):
 *   # # # # #    ->  "#####"
 *   # # # # #    ->  "#####"
 *   # # # # #    ->  "#####"
 *   # # # # #    ->  "#####"
 *   # # # # #    ->  "#####"
 *
 * Este é um exemplo simples de uma figura geométrica básica.
 */
function quadrado() {
    // Cria a imagem com todas as posições preenchidas ('#').
    let img = images.createImage(`
        #####
        #####
        #####
        #####
        #####
    `);

    // Mostra a imagem no display.
    img.showImage(0);

    // Aguarda 500 ms para visualização.
    basic.pause(500);
}

/**
 * ----------------------------------------------------------------
 * FUNÇÃO: flechaCima()
 * ----------------------------------------------------------------
 * Exibe uma seta apontando para cima.
 * O desenho simula uma flecha com ponta triangular e corpo central.
 *
 * Padrão usado (linha a linha):
 *   . . # . .    ->  "..#.."
 *   . # # # .    ->  ".###."
 *   # # # # #    ->  "#####"
 *   . # . # .    ->  ".#.#."
 *   . # . # .    ->  ".#.#."
 *
 * A ponta da seta está na linha superior (um LED central),
 * seguida por uma linha mais larga e depois o corpo vertical.
 */
function flechaCima() {
    // Cria a imagem da seta para cima.
    let img = images.createImage(`
        ..#..
        .###.
        #####
        .#.#.
        .#.#.
    `);

    // Exibe a imagem.
    img.showImage(0);

    // Pausa para visualização.
    basic.pause(500);
}

/**
 * =====================================================================
 * COMO UTILIZAR ESTAS FUNÇÕES NO MAKECODE
 * =====================================================================
 * Para testar, você pode chamar as funções em blocos de eventos,
 * por exemplo:
 *
 * 1) No bloco "no iniciar", chame uma das funções:
 *    coracao();
 *
 * 2) Ao pressionar o botão A, chame outra:
 *    input.onButtonPressed(Button.A, function () {
 *        quadrado();
 *    });
 *
 * 3) Ao pressionar o botão B, chame a terceira:
 *    input.onButtonPressed(Button.B, function () {
 *        flechaCima();
 *    });
 *
 * Lembre-se de que o MakeCode já possui blocos prontos para ícones,
 * mas este código mostra como criar imagens personalizadas pixel a pixel,
 * o que é essencial para projetos mais criativos.
 *
 * =====================================================================
 * OBSERVAÇÕES FINAIS
 * =====================================================================
 * - As imagens foram corrigidas para que apareçam corretamente no display.
 * - A estrutura original (funções separadas) foi mantida.
 * - Os comentários foram adicionados para explicar cada etapa,
 *   tornando o código adequado para fins didáticos.
 * =====================================================================
 */

Código 2: Função que Chama Funções

/**
 * ======================================================================
 * PROJETO DIDÁTICO PARA MICRO:BIT - SEQUÊNCIAS DE ANIMAÇÕES
 * ======================================================================
 * 
 * Este código foi desenvolvido para ser executado em um micro:bit,
 * uma placa educacional com uma matriz de 25 LEDs (5x5) que podem
 * exibir imagens, ícones e animações. O programa é escrito na
 * linguagem JavaScript (com a biblioteca do MakeCode) e contém duas
 * funções principais que organizam sequências de animações.
 * 
 * As funções auxiliares 'coracao()', 'quadrado()' e 'flechaCima()'
 * não estão definidas neste trecho – presume-se que estejam em outra
 * parte do código ou que sejam funções importadas. Elas são chamadas
 * para exibir imagens fixas na matriz de LEDs.
 * 
 * OBJETIVO: Demonstrar o uso de funções, loops, pausas e manipulação
 * de imagens para criar animações simples no micro:bit.
 * 
 * ======================================================================
 */

/**
 * Função que executa uma sequência básica de três animações,
 * uma após a outra, sem pausas entre elas (a menos que as funções
 * internas já contenham pausas).
 * 
 * Esta função é um exemplo de como organizar um roteiro de animações
 * de forma modular, chamando outras funções que realizam tarefas
 * específicas.
 */
function sequenciaBasica() {
  // Exibe um ícone de coração na matriz de LEDs.
  // Função definida externamente.
  coracao()
  
  // Exibe um quadrado (contorno ou preenchido) na matriz.
  // Função definida externamente.
  quadrado()
  
  // Exibe uma seta apontando para cima.
  // Função definida externamente.
  flechaCima()
}

/**
 * Função que executa uma "dança simples" composta por três repetições
 * de um mesmo padrão: exibir uma seta para cima, pausar, limpar a tela
 * e pausar novamente. O efeito visual é um piscar da seta.
 * 
 * Esta função demonstra o uso de:
 * - Estrutura de repetição 'for' para executar um bloco várias vezes.
 * - A função 'basic.pause()' para controlar o tempo entre os quadros.
 * - Criação e exibição de uma imagem vazia (todos os LEDs apagados)
 *   para simular a limpeza da tela.
 */
function dancaSimples() {
  // Repete o bloco abaixo exatamente 3 vezes (i = 0, 1, 2)
  for (let i = 0; i < 3; i++) {
    
    // Exibe a seta apontando para cima (função externa)
    flechaCima()
    
    // Aguarda 100 milissegundos (0,1 segundo) para que a imagem
    // fique visível por um breve período antes de apagar.
    basic.pause(100)
    
    // Cria uma imagem vazia: uma string com 25 pontos ('.') que
    // representa todos os LEDs apagados (intensidade 0).
    // A string é dividida em 5 linhas de 5 caracteres cada.
    let baixo = images.createImage(`
        . . . . .
        . . . . .
        . . . . .
        . . . . .
        . . . . .
    `)
    
    // Exibe a imagem vazia na matriz de LEDs.
    // O parâmetro '0' indica a duração em milissegundos; com 0,
    // a imagem é mostrada por um tempo mínimo (praticamente
    // instantâneo). Na prática, isso equivale a "limpar" a tela,
    // pois todos os LEDs são apagados.
    baixo.showImage(0)
    
    // Aguarda mais 100 ms para que a tela permaneça apagada antes
    // da próxima iteração, criando o efeito de pisca-pisca.
    basic.pause(100)
  }
}

/**
 * ======================================================================
 * OBSERVAÇÕES DIDÁTICAS E POSSÍVEIS MELHORIAS
 * ======================================================================
 * 
 * 1. As funções 'coracao()', 'quadrado()' e 'flechaCima()' precisam
 *    ser implementadas ou importadas para que o código funcione.
 *    Elas provavelmente usam 'basic.showLeds()' ou 'images.createImage()'
 *    para desenhar as formas na matriz.
 * 
 * 2. A função 'dancaSimples()' utiliza uma imagem vazia para apagar
 *    a tela. Uma alternativa mais direta seria usar 'basic.clearScreen()',
 *    que limpa todos os LEDs sem precisar criar uma imagem.
 * 
 * 3. A duração das pausas (100 ms) pode ser ajustada para tornar a
 *    animação mais rápida ou mais lenta, alterando o valor passado
 *    para 'basic.pause()'.
 * 
 * 4. O loop 'for' com 3 repetições pode ser modificado para um número
 *    diferente de itens ou até mesmo um loop infinito (com 'while(true)')
 *    para criar uma animação contínua.
 * 
 * 5. Este código é um excelente ponto de partida para explorar outras
 *    animações, como combinações de imagens, alterações de brilho e
 *    sincronização com eventos (como botões ou sensor de movimento).
 * 
 * ======================================================================
 */

Código 3: Função Principal (A MATRIOSKA MAIOR)

/**
 * ========================================================================
 * PROJETO: ESPETÁCULO NO MICRO:BIT
 * ========================================================================
 * Este código foi criado para ser executado em um micro:bit, utilizando
 * a plataforma MakeCode (programação em blocos ou JavaScript).
 * 
 * OBJETIVO:
 *   Ao pressionar o botão A, o micro:bit executa uma sequência de ações
 *   que formam um "espetáculo" com animações, mensagens e efeitos visuais.
 * 
 * ESTRUTURA PRINCIPAL:
 *   1. Função `espetaculoCompleto()`: orquestra todo o show.
 *   2. Função `input.onButtonPressed()`: captura o evento do botão A.
 * 
 * OBSERVAÇÕES IMPORTANTES:
 *   - As funções `sequenciaBasica()`, `dancaSimples()` e `coracao()` NÃO
 *     estão definidas neste código. Elas devem ser implementadas em outro
 *     local do projeto (ou em blocos equivalentes) para que o programa
 *     funcione completamente. Aqui, apenas chamamos essas funções,
 *     confiando que elas existem e contêm suas próprias instruções.
 *   - O código foi mantido exatamente como foi fornecido; apenas
 *     adicionamos comentários detalhados para fins didáticos.
 * ========================================================================
 */


/**
 * ----------------------------------------------------------------
 * FUNÇÃO: espetaculoCompleto()
 * ----------------------------------------------------------------
 * Esta é a função principal que organiza todo o espetáculo.
 * Ela é chamada quando o botão A é pressionado.
 * 
 * Passos executados:
 *   1. Exibe a letra "A" no display de LED do micro:bit.
 *   2. Chama a função `sequenciaBasica()` (definida em outro lugar).
 *   3. Exibe a letra "B".
 *   4. Chama a função `dancaSimples()` (definida em outro lugar).
 *   5. Exibe a letra "C".
 *   6. Executa um loop que repete 5 vezes um efeito de "coração piscante".
 * 
 * O uso de letras (A, B, C) ajuda a identificar cada etapa do espetáculo,
 * funcionando como um "indicador de progresso" no display.
 */
function espetaculoCompleto() {
    // --------------------------------------------------------------
    // PASSO 1: Exibe a letra "A" no display.
    // --------------------------------------------------------------
    // A função `basic.showString("A")` mostra o caractere "A" 
    // rapidamente no display de LED. Cada letra é exibida por um 
    // curto período (padrão: 150ms por caractere) e depois a tela 
    // é apagada automaticamente. Isso indica ao usuário que a 
    // primeira parte do espetáculo está começando.
    basic.showString("A")

    // --------------------------------------------------------------
    // PASSO 2: Executa uma sequência básica de animações.
    // --------------------------------------------------------------
    // A função `sequenciaBasica()` é chamada aqui. Ela provavelmente
    // contém uma série de animações simples (como piscar LEDs, 
    // desenhar formas geométricas ou mover um ponto). Como não
    // está definida neste arquivo, precisamos garantir que ela
    // exista no projeto para que o código funcione.
    sequenciaBasica()

    // --------------------------------------------------------------
    // PASSO 3: Exibe a letra "B".
    // --------------------------------------------------------------
    // Similar ao passo 1, mostramos a letra "B" para sinalizar o
    // início da segunda parte do espetáculo.
    basic.showString("B")

    // --------------------------------------------------------------
    // PASSO 4: Executa uma dança simples.
    // --------------------------------------------------------------
    // A função `dancaSimples()` é chamada. Provavelmente ela contém
    // movimentos rítmicos de LEDs ou padrões que simulam uma dança.
    dancaSimples()

    // --------------------------------------------------------------
    // PASSO 5: Exibe a letra "C".
    // --------------------------------------------------------------
    // Mostra a letra "C" para indicar o início da terceira e última
    // parte do espetáculo.
    basic.showString("C")

    // --------------------------------------------------------------
    // PASSO 6: Loop que repete 5 vezes um efeito de coração pulsante.
    // --------------------------------------------------------------
    // Usamos um laço `for` para repetir um bloco de instruções
    // um número determinado de vezes. A estrutura é:
    //   for (let i = 0; i < 5; i++) { ... }
    //   - `let i = 0` → cria uma variável `i` (contador) e inicia com 0.
    //   - `i < 5` → enquanto `i` for menor que 5, o loop continua.
    //   - `i++` → após cada execução, incrementa `i` em 1.
    // Isso faz com que o bloco dentro das chaves seja executado
    // exatamente 5 vezes (i = 0, 1, 2, 3, 4).
    for (let i = 0; i < 5; i++) {
        // ----------------------------------------------------------
        // CHAMADA DA FUNÇÃO coracao()
        // ----------------------------------------------------------
        // A função `coracao()` provavelmente desenha um ícone de
        // coração no display de LED. Ela não está definida aqui,
        // mas deve existir em outro lugar do projeto.
        coracao()

        // ----------------------------------------------------------
        // PAUSA DE 100 MILISSEGUNDOS (0,1 segundo)
        // ----------------------------------------------------------
        // A função `basic.pause(100)` faz o programa "dormir" por
        // 100 milissegundos. Isso cria um pequeno atraso entre as
        // ações, permitindo que o coração fique visível por um
        // instante antes de ser apagado.
        basic.pause(100)

        // ----------------------------------------------------------
        // LIMPAR A TELA (display)
        // ----------------------------------------------------------
        // A função `basic.clearScreen()` apaga todos os LEDs do
        // display, deixando a tela completamente escura.
        basic.clearScreen()

        // ----------------------------------------------------------
        // PAUSA DE 100 MILISSEGUNDOS NOVAMENTE
        // ----------------------------------------------------------
        // Após apagar a tela, esperamos mais 100 ms para que o
        // "piscamento" seja percebido pelo olho humano. Assim,
        // criamos um efeito de coração que pisca (liga e desliga)
        // repetidamente.
        basic.pause(100)
    }
    // Ao final do loop, o espetáculo termina. O display fica
    // apagado (pois a última ação foi `clearScreen` seguida de
    // uma pausa). 
}


/**
 * ----------------------------------------------------------------
 * EVENTO: Pressionar o botão A
 * ----------------------------------------------------------------
 * O micro:bit possui dois botões programáveis (A e B). 
 * A função `input.onButtonPressed()` configura uma ação que será
 * executada sempre que o botão especificado for pressionado.
 * 
 * Sintaxe:
 *   input.onButtonPressed(Button.A, function () { ... })
 * 
 *   - O primeiro parâmetro `Button.A` indica que queremos 
 *     monitorar o botão A.
 *   - O segundo parâmetro é uma função anônima (sem nome) que
 *     contém as instruções a serem executadas quando o botão for
 *     pressionado.
 * 
 * Neste projeto, quando o botão A for pressionado, chamamos a
 * função `espetaculoCompleto()`, que inicia todo o show.
 * 
 * IMPORTANTE: O micro:bit executa essa função apenas uma vez por
 * pressionamento. Se o usuário quiser repetir o espetáculo, deve
 * pressionar o botão A novamente.
 */
input.onButtonPressed(Button.A, function () {
    // Ao pressionar o botão A, executamos a função que contém
    // todo o espetáculo.
    espetaculoCompleto()
})


/**
 * ========================================================================
 * NOTAS FINAIS PARA O ESTUDANTE / PROFESSOR
 * ========================================================================
 * 1. Para que este código funcione completamente, você precisa 
 *    implementar as funções:
 *      - `sequenciaBasica()`
 *      - `dancaSimples()`
 *      - `coracao()`
 *    Elas podem ser criadas usando blocos ou JavaScript no MakeCode.
 * 
 * 2. Experimente modificar os valores de pausa (100 ms) para 
 *    acelerar ou desacelerar o efeito de piscamento.
 * 
 * 3. Altere o número de repetições no loop (atualmente 5) para 
 *    mais ou menos batidas do coração.
 * 
 * 4. Adicione novas mensagens ou animações para tornar o espetáculo
 *    ainda mais interessante!
 * 
 * DIVIRTA-SE PROGRAMANDO E APRENDENDO COM O MICRO:BIT!
 * ========================================================================
 */ 
⏱️ Detalhamento Minuto a Minuto (50 min)
0-5 min
Abertura - A Boneca Russa 🪆 — "Função que chama função é igual a isso (mostra a matrioska): a função espetaculo chama danca, que chama coracao, que chama led.plot. Cada uma é uma caixinha que contém outras caixinhas." Grito coletivo: "ANINHAMENTO É PODER!"
5-15 min
Dança Aninhada Desplugada 💃 — Dividir a turma em 4 grupos. Cada grupo é responsável por uma "subfunção": Grupo 1: moverBracoEsquerdo() - balança o braço esquerdo; Grupo 2: moverBracoDireito() - balança o braço direito; Grupo 3: moverPernaEsquerda() - balança a perna esquerda; Grupo 4: moverPernaDireita() - balança a perna direita. Função principal: dancar() = todas as 4 funções juntas. Desafio: dancarLoucamente() = dancar() 2x + gritar "ÔÔÔ" no meio. Discussão: "Quantas funções foram chamadas quando executamos dancarLoucamente()?" (Rastreamento: 1 + 2 + 8 = 11 chamadas)
15-25 min
Codificação - Funções Básicas na Micro:bit 💻 — 1. Criar função coracao() que desenha um coração na matriz. 2. Criar função quadrado() que desenha um quadrado. 3. Criar função flechaCima() que desenha uma flecha. Teste: Chamar cada função individualmente com botões diferentes.
25-35 min
Aninhamento - Funções que Chamam Funções 🔗 — 1. Criar função sequenciaBasica() que chama coracao(), quadrado(), flechaCima(). 2. Criar função dancaSimples() que alterna flecha cima/baixo 3 vezes. 3. No programa principal: ao pressionar A → dancaSimples(). Desafio: O que acontece se inverter a ordem dentro de sequenciaBasica()?
35-45 min
Projeto Integrado - O Espetáculo 🎪 — 1. Criar espetaculoCompleto() que: Mostra "A" (sequência básica); Mostra "B" (dança); Mostra "C" (corações pulsantes). 2. Usar basic.showString() entre os atos. 3. Programar o botão A para executar o espetáculo.
45-50 min
Mapa de Funções (Diagrama) 🗺️ — Cada aluno desenha um diagrama mostrando quais funções chamam quais: espetaculoCompleto → sequenciaBasica → coracao → quadrado → flechaCima → dancaSimples → flechaCima (3x) → coracao (5x). Autoavaliação: "Quantas funções minha história tem? Qual é a função 'mãe' que chama todas as outras?"
♿ Orientações para Adaptações e Inclusão
  • TEA: Usar blocos de montar físicos (tipo LEGO) para representar as funções. Sequenciamento visual: cores diferentes para cada nível de aninhamento. Exemplo: vermelho = função principal, azul = nível 2, verde = nível 3.
  • TDAH: Checklist de construção: [ ] Criei coração, [ ] Criei quadrado, [ ] Criei flecha, [ ] Criei sequência, [ ] Criei espetáculo. Timer para cada etapa (5 minutos por função).
  • Deficiência visual: Feedback sonoro diferente para cada função (tom diferente). Parâmetros táteis: usar objetos para representar cada função.
  • Altas habilidades: Criar função recursiva (que chama a si mesma) com condição de parada: contarRegressivamente(n). Exemplo: contarRegressivamente(5) → mostra 5, 4, 3, 2, 1, FOGUETE!
📊 Critérios Operacionais de Avaliação
Critério Evidência Pontuação
Compreensão de aninhamento Explica o que é uma função que chama outra 0-3
Criação de funções aninhadas Criou sequenciaBasica com 3 subfunções 0-3
Mapa de funções Desenhou diagrama correto 0-2
Ordem de execução Rastreou corretamente a pilha de chamadas 0-2

Total: 10 pontos

Frase do dia: "Aninhamento é poder: uma função dentro da outra, como caixas que se abrem e revelam mais código!"

🎯 Objetivos Operacionais
  • Revisar funções simples, com parâmetros e aninhadas de forma integrada.
  • Planejar e executar um miniprojeto completo com múltiplas funções na micro:bit.
  • Avaliar o próprio projeto e o dos colegas usando rubrica lúdica.
  • Criar um "cardápio" de animações que podem ser executadas sob demanda.
📚 Conteúdo Programático

Revisão integrada: funções, parâmetros, aninhamento — Criação de imagens na matriz de LEDs — Uso de múltiplos botões para diferentes funções — Planejamento de projeto modular.

📋 Habilidades BNCC e RCP-PR

BNCC (Língua Portuguesa): EF05LP10 - Produzir texto instrucional (o "cardápio" de funções).
BNCC (Matemática): EF05MA10 - Concluir regularidades (reutilização de funções).
BNCC (Ciências): EF05CI01 - Construir protótipo funcional (mesmo que simulado).
RCP-pr (Programação): Prototipagem - Criação de artefato tecnológico com funções modulares.

🧰 Materiais
Computadores com MakeCode BBC micro:bit para cada dupla "Cardápio de Funções" impresso (modelo de menu de restaurante) Rubrica de avaliação lúdica ("Estrelas Michelin do Código") Canetas coloridas para personalização
🔧 Explicação Detalhada da Montagem do Hardware

Configuração: Conecte a micro:bit ao computador via USB. Acesse makecode.microbit.org e crie um projeto chamado AULA4_CARDAPIO. A micro:bit será o "chef" que exibe diferentes "pratos" (animações). Os botões A, B e A+B serão os "clientes" fazendo pedidos.

Explorando a Matriz: A matriz 5×5 pode mostrar até 25 LEDs acesos simultaneamente. Imagens podem ser criadas usando images.createImage() com strings especiais. O símbolo # representa LED aceso, . representa LED apagado.

💻 Código a Ser Desenvolvido

Código 1: Cardápio de Animações

// ==========================================
// CARDÁPIO DE FUNÇÕES - RESTAURANTE MICRO:BIT
// ==========================================
//
// Este código foi desenvolvido para a placa micro:bit 
// e pode ser utilizado no ambiente MakeCode (Microsoft).
// O projeto simula um "restaurante" com um cardápio 
// interativo, onde cada botão (A, B, AB) aciona 
// diferentes "pratos" (animações no display de LEDs).
//
// O objetivo é ensinar conceitos de programação:
// - Funções (criação e chamada)
// - Parâmetros e argumentos
// - Estruturas de repetição (for)
// - Estruturas condicionais (if/else)
// - Variáveis locais e globais
// - Geração de números aleatórios
// - Animações com matriz de LEDs
// - Interação com botões físicos
// - Sequenciamento de ações (pausas)
//
// Todo o código está comentado linha a linha para 
// facilitar o entendimento de cada instrução.
// ==========================================


// ==========================================
// ENTRADAS - ANIMAÇÕES SIMPLES
// ==========================================

/**
 * Função 'entradaCoração':
 * Exibe uma animação de um coração no display.
 * É considerada uma "entrada" do cardápio,
 * pois é uma animação curta e simples.
 */
function entradaCoração() {
    // Limpa todos os LEDs do display, apagando qualquer imagem anterior.
    basic.clearScreen()

    // Cria uma imagem (matriz 5x5) a partir de uma string.
    // A string usa '#' para LEDs acesos e '.' para apagados.
    // CORREÇÃO: Agora a imagem representa um coração.
    // Linhas:
    // 0: . # . # .   (dois pontos laterais e dois centrais acesos)
    // 1: # # # # #   (toda a linha acesa)
    // 2: # # # # #   (toda a linha acesa)
    // 3: . # # # .   (borda inferior do coração)
    // 4: . . # . .   (ponta inferior do coração)
    let coracao = images.createImage(`
    . # . # .
    # # # # #
    # # # # #
    . # # # .
    . . # . .
  `)

    // Exibe a imagem criada no display, com atraso de 0 ms (imediato).
    // O parâmetro 0 indica que não há animação de rolagem.
    coracao.showImage(0)

    // Pausa a execução por 1000 milissegundos (1 segundo)
    // para que o usuário possa ver a imagem.
    basic.pause(1000)

    // Limpa o display novamente, apagando a imagem.
    basic.clearScreen()
}

/**
 * Função 'entradaFoguete':
 * Exibe uma animação de um foguete no display.
 * Similar à função anterior, mas com outra imagem.
 */
function entradaFoguete() {
    // Limpa o display.
    basic.clearScreen()

    // Cria uma imagem de foguete.
    // CORREÇÃO: Agora a imagem representa um foguete com chamas.
    // Linhas:
    // 0: . . # . .   (topo do foguete)
    // 1: . # # # .   (corpo superior)
    // 2: # # # # #   (parte mais larga)
    // 3: . # . # .   (janelas ou detalhes)
    // 4: . . # . .   (chama na base)
    let foguete = images.createImage(`
    . . # . .
    . # # # .
    # # # # #
    . # . # .
    . . # . .
  `)

    // Exibe a imagem.
    foguete.showImage(0)

    // Pausa de 1 segundo.
    basic.pause(1000)

    // Apaga o display.
    basic.clearScreen()
}


// ==========================================
// PRATO PRINCIPAL - ANIMAÇÕES COMPLEXAS (COM PARÂMETROS)
// ==========================================

/**
 * Função 'pratoAnimado':
 * Recebe um número (parâmetro 'numero') e executa uma animação:
 * - Mostra o número no display
 * - Pisca o LED central (2,2) repetidas vezes, conforme o valor de 'numero'
 *
 * @param numero - Quantidade de piscadas que o LED central dará.
 *                 O valor deve ser um número inteiro.
 */
function pratoAnimado(numero: number) {
    // Limpa o display para começar a animação.
    basic.clearScreen()

    // Mostra o número recebido como parâmetro no display de LEDs.
    // A função 'showNumber' exibe dígitos grandes (rolagem) no display.
    basic.showNumber(numero)

    // Pausa de 500 ms (meio segundo) para o número ser visualizado.
    basic.pause(500)

    // Loop 'for' que executa 'numero' vezes.
    // A variável 'i' começa em 0 e vai até 'numero - 1'.
    for (let i = 0; i < numero; i++) {
        // Acende o LED localizado na coluna 2, linha 2 (central).
        // Lembrando que as coordenadas vão de 0 a 4.
        led.plot(2, 2)

        // Pausa de 100 ms (0,1 segundo) para o LED ficar aceso.
        basic.pause(100)

        // Apaga o LED central (coluna 2, linha 2).
        led.unplot(2, 2)

        // Pausa de 100 ms para o LED ficar apagado.
        basic.pause(100)
    }
    // Após o loop, a função termina e o display fica com o LED apagado.
}

/**
 * Função 'pratoForma':
 * Desenha um quadrado (ou retângulo) no display,
 * cujo tamanho é definido pelo parâmetro 'tamanho'.
 * O quadrado é desenhado a partir do canto superior esquerdo (0,0).
 *
 * @param tamanho - Número de linhas e colunas do quadrado.
 *                  O valor máximo é 5, pois o display tem 5x5.
 *                  Se 'tamanho' for maior que 5, o loop limita a 5.
 */
function pratoForma(tamanho: number) {
    // Limpa o display.
    basic.clearScreen()

    // Loop externo: percorre as linhas (eixo Y).
    // A condição 'linha < tamanho && linha < 5' garante que
    // não ultrapassaremos os limites do display (máximo 5 linhas).
    for (let linha = 0; linha < tamanho && linha < 5; linha++) {
        // Loop interno: percorre as colunas (eixo X).
        // Da mesma forma, limita a 'tamanho' e a 5 colunas.
        for (let coluna = 0; coluna < tamanho && coluna < 5; coluna++) {
            // Acende o LED na posição (coluna, linha).
            // Isso desenha um quadrado preenchido.
            led.plot(coluna, linha)
        }
    }

    // Pausa de 1000 ms (1 segundo) para exibir a forma desenhada.
    basic.pause(1000)

    // Limpa o display após a pausa.
    basic.clearScreen()
}


// ==========================================
// SOBREMESA - ANIMAÇÕES ANINHADAS
// ==========================================

/**
 * Função 'sobremesaFelicidade':
 * Combina várias funções anteriores para criar
 * uma sequência de animações que transmitem felicidade.
 * É chamada de "sobremesa" por ser uma combinação mais elaborada.
 */
function sobremesaFelicidade() {
    // Chama a função que exibe o coração (entrada).
    entradaCoração()

    // Pausa de 200 ms entre as animações.
    basic.pause(200)

    // Chama a função 'pratoAnimado' com o argumento 3,
    // ou seja, o LED central piscará 3 vezes.
    pratoAnimado(3)

    // Pausa de 200 ms.
    basic.pause(200)

    // Chama a função que exibe o foguete (entrada).
    entradaFoguete()
}

/**
 * Função 'sobremesaFesta':
 * Cria uma animação mais longa e variada,
 * combinando repetições de entradas e pratos.
 * Simula uma "festa" com várias animações.
 */
function sobremesaFesta() {
    // Primeiro bloco: repete 3 vezes uma sequência:
    // coração -> pausa -> forma com tamanho crescente -> pausa
    for (let i = 0; i < 3; i++) {
        // Exibe coração.
        entradaCoração()

        // Pausa curta.
        basic.pause(100)

        // Chama 'pratoForma' com tamanho 'i+1'.
        // Na primeira iteração (i=0) desenha um quadrado 1x1,
        // na segunda (i=1) 2x2, e na terceira (i=2) 3x3.
        pratoForma(i + 1)

        // Pausa curta.
        basic.pause(100)
    }

    // Segundo bloco: repete 5 vezes alternando entre
    // exibir coração e limpar o display, criando um efeito de pisca.
    for (let i = 0; i < 5; i++) {
        // Verifica se o índice 'i' é par (resto da divisão por 2 é zero).
        if (i % 2 == 0) {
            // Se for par, exibe o coração.
            entradaCoração()
        } else {
            // Se for ímpar, limpa o display.
            basic.clearScreen()
        }
        // Pausa de 200 ms entre cada estado.
        basic.pause(200)
    }
}


// ==========================================
// PROGRAMA PRINCIPAL - O MENU INTERATIVO
// ==========================================

// A execução do programa começa aqui, após a definição de todas as funções.

// Exibe a palavra "MENU" no display, com rolagem de caracteres.
basic.showString("MENU")

// Pausa de 500 ms para dar tempo de ler o menu.
basic.pause(500)


// ------------------------------------------
// Evento associado ao botão A
// ------------------------------------------
// Quando o botão A for pressionado, executa a função anônima abaixo.
input.onButtonPressed(Button.A, function () {
    // Mostra a letra "A" no display para indicar que o botão A foi pressionado.
    basic.showString("A")

    // Pausa de 300 ms para visualizar a letra.
    basic.pause(300)

    // Chama a animação de coração.
    entradaCoração()

    // Pausa de 200 ms.
    basic.pause(200)

    // Chama a animação de foguete.
    entradaFoguete()
})

// ------------------------------------------
// Evento associado ao botão B
// ------------------------------------------
// Quando o botão B for pressionado, executa a função anônima abaixo.
input.onButtonPressed(Button.B, function () {
    // Mostra a letra "B" no display.
    basic.showString("B")

    // Pausa de 300 ms.
    basic.pause(300)

    // Gera um número aleatório entre 0 e 1 (inclusive) e armazena em 'escolha'.
    // Isso define aleatoriamente qual "prato principal" será executado.
    let escolha = Math.randomRange(0, 1)

    // Estrutura condicional: se 'escolha' for igual a 0,
    // executa o pratoAnimado com um número aleatório entre 1 e 9.
    if (escolha == 0) {
        // Gera um número aleatório entre 1 e 9 e passa como argumento.
        pratoAnimado(Math.randomRange(1, 9))
    } else {
        // Caso contrário (escolha == 1), executa pratoForma
        // com um tamanho aleatório entre 1 e 5.
        pratoForma(Math.randomRange(1, 5))
    }
    // Após a execução, a função termina e o display fica como a função o deixou.
})

// ------------------------------------------
// Evento associado aos botões A e B simultaneamente (AB)
// ------------------------------------------
// Quando os botões A e B forem pressionados juntos, executa a função abaixo.
input.onButtonPressed(Button.AB, function () {
    // Mostra a letra "C" no display (representando a combinação dos dois).
    basic.showString("C")

    // Pausa de 300 ms.
    basic.pause(300)

    // Gera um número aleatório entre 0 e 1 para escolher a sobremesa.
    let escolha = Math.randomRange(0, 1)

    // Se 'escolha' for 0, executa a sobremesaFelicidade.
    if (escolha == 0) {
        sobremesaFelicidade()
    } else {
        // Senão, executa a sobremesaFesta.
        sobremesaFesta()
    }
})

// ==========================================
// FIM DO PROGRAMA
// ==========================================
// Após a configuração dos eventos, o micro:bit fica "ouvindo"
// os botões. O programa principal termina, mas os eventos
// permanecem ativos aguardando interação do usuário.
// ==========================================
⏱️ Detalhamento Minuto a Minuto (50 min)
0-5 min
Anúncio do Desafio - O Chef Robô 👨‍🍳 — "Vocês já sabem fazer funções simples, com parâmetros e que chamam outras funções. Agora é hora de montar o CARDÁPIO DO RESTAURANTE MICRO:BIT! Em duplas, vocês vão criar um chef robô que serve animações. Quem fizer o sistema mais completo ganha o TROFÉU MICHELIN DO CÓDIGO!" Requisitos: Pelo menos 3 funções diferentes; Pelo menos uma função com parâmetro; Pelo menos um aninhamento; Uso de todos os botões (A, B, A+B).
5-15 min
Planejamento do Cardápio 📋 — Cada dupla recebe uma folha em formato de menu de restaurante: CARDÁPIO DO CHEF ROBÔ — ENTRADAS: Coração (____), Foguete (____) — PRATO PRINCIPAL: Animado (parâmetro: número), Forma (parâmetro: tamanho) — SOBREMESA: Felicidade (____), Festa (____). Professor circula, ajudando as duplas a definir seus cardápios.
15-30 min
Codificação - Mãos na Massa 💻 — Passo a passo: 1. Criar funções de entrada (coração, foguete). 2. Criar funções com parâmetros (animado, forma). 3. Criar funções aninhadas (felicidade, festa). 4. Configurar o menu principal com os botões. Dica do Chef: "Testem cada função individualmente antes de juntar tudo!"
30-40 min
Troca de Cardápios 🔄 — Duplas trocam de lugar e testam o robô da outra dupla. Ficha de avaliação (estrelas de 1 a 5): As funções são fáceis de entender? Os parâmetros funcionam? As animações são legais? O cardápio é completo?
40-45 min
Correções e Ajustes 🔧 — Baseado no feedback, as duplas ajustam seus projetos.
45-50 min
Autoavaliação e Entrega 📝 — Cada aluno preenche: "Meu cardápio tem: [ ] 3 funções ou mais [ ] Função com parâmetro [ ] Aninhamento (função que chama função). O que foi mais difícil? ______. O que eu mais gostei? ______. Estrelas que me dou: ⭐⭐⭐⭐⭐"
♿ Orientações para Adaptações e Inclusão
  • TEA: Fornecer um template de código já com as funções vazias (esqueletos). Usar cores fixas para cada tipo de função (azul = entrada, vermelho = principal, verde = sobremesa).
  • TDAH: Dividir o projeto em mini-metas: (1) criar entradas, (2) criar pratos principais, (3) criar sobremesas. Checklist visual para marcar progresso.
  • Deficiência física: Usar apenas dois botões (A e B) em vez de três. Simplificar as animações para menos passos.
  • Altas habilidades: Adicionar função que aceita dois parâmetros (forma e tamanho). Criar animações mais complexas usando toda a matriz.
📊 Critérios Operacionais de Avaliação
Critério Evidência Pontuação
Funções criadas Pelo menos 3 funções diferentes 0-3
Parâmetro Pelo menos uma função com parâmetro 0-2
Aninhamento Função que chama outra função 0-2
Funcionamento Todos os botões funcionam corretamente 0-3

Total: 10 pontos

Frase do dia: "No restaurante do código, o chef é a função e o cardápio é a criatividade. Bom apetite digital!"

🎯 Objetivos Operacionais
  • Compreender os operadores lógicos AND (E), OR (OU), NOT (NÃO) e suas tabelas verdade.
  • Aplicar esses operadores em condicionais do dia a dia e em código.
  • Construir tabelas verdade simples de forma lúdica na micro:bit.
  • Usar a matriz de LEDs para mostrar resultados de operações lógicas.
📚 Conteúdo Programático

Operadores lógicos: AND (E), OR (OU), NOT (NÃO) — Tabelas verdade — Condicionais com operadores lógicos — Uso de botões como entradas lógicas — Exibição de resultados na matriz de LEDs — RCP-PR (EF05CO03): Realizar operações de negação, conjunção e disjunção sobre sentenças lógicas e valores 'verdadeiro' e 'falso'.

📋 Habilidades BNCC e RCP-PR

BNCC (Ciências): EF05CI02 - Estímulos e respostas (o robô decide baseado em múltiplos sensores).
BNCC (Matemática): EF05MA18 - Representar trajetos com decisões.
RCP-pr (Computação): (EF05CO03) Realizar operações de negação, conjunção e disjunção sobre sentenças lógicas e valores 'verdadeiro' e 'falso'.

🧰 Materiais
Computadores com MakeCode BBC micro:bit para cada dupla Cartões "VERDADE" (verde) e "FALSO" (vermelho) Cópias de tabela verdade em branco Adesivos de estrela para premiação Cartolina para desenhar tabelas
🔧 Explicação Detalhada da Montagem do Hardware

Configuração: Conecte a micro:bit ao computador via USB. Acesse makecode.microbit.org e crie um projeto chamado AULA5_LOGICA. Vamos usar os botões como "entradas" (VERDADE ou FALSO). A matriz de LEDs será nossa "saída" (mostrando o resultado).

Mapeamento Lógico: Botão A pressionado = VERDADE (1); Botão A não pressionado = FALSO (0); Botão B pressionado = VERDADE (1); Botão B não pressionado = FALSO (0).

Tabela Verdade - AND (E): A E B = V (V,V), F (V,F), F (F,V), F (F,F).
Tabela Verdade - OR (OU): A OU B = V (V,V), V (V,F), V (F,V), F (F,F).
Tabela Verdade - NOT (NÃO): NÃO A = F (V), V (F).

💻 Código a Ser Desenvolvido

Código 1: Operador AND (E) - Os Dois Precisam Ser Verdade

// ============================================================
// PROJETO DIDÁTICO: SIMULADOR DE PORTA LÓGICA AND
// ============================================================
// Este programa usa dois botões (A e B) para representar duas
// entradas lógicas (A e B). Cada botão alterna o estado da sua
// respectiva entrada (ligado/desligado).
// A matriz de LEDs mostra visualmente:
//   - LED no canto superior esquerdo (0,0) → estado da entrada A
//   - LED no canto inferior esquerdo (0,4) → estado da entrada B
//   - LED no centro direito (4,2) → resultado da operação AND
// Quando ambas as entradas estão verdadeiras (true), o LED do
// centro direito acende, a palavra "AND" é exibida no display
// e, após uma pausa, a tela é restaurada com os LEDs das entradas.
// ============================================================

// Declaração das variáveis que armazenam o estado lógico de cada entrada.
// Inicialmente, ambas começam como "falso" (desligadas).
let estadoA = false
let estadoB = false

// ============================================================
// Evento: pressionamento do botão A
// ============================================================
// Quando o botão A é pressionado, alternamos o estado da entrada A
// (se estava falso, vira verdadeiro; se verdadeiro, vira falso).
// Em seguida, atualizamos o LED correspondente no display e
// verificamos se a condição AND agora é verdadeira.
input.onButtonPressed(Button.A, function () {
    // Inverte o valor booleano de estadoA (true ↔ false)
    estadoA = !estadoA

    // Se estadoA for verdadeiro, acende o LED na coluna 0, linha 0
    // (canto superior esquerdo) para indicar que a entrada A está ativa.
    if (estadoA) {
        led.plot(0, 0)
    } else {
        // Caso contrário, apaga esse LED.
        led.unplot(0, 0)
    }

    // Chama a função que verifica se ambas as entradas estão ativas
    // (operação lógica AND) e atualiza o display conforme o resultado.
    verificarAND()
})

// ============================================================
// Evento: pressionamento do botão B
// ============================================================
// Funciona de forma análoga ao botão A, mas para a entrada B.
// O LED da entrada B fica na coluna 0, linha 4 (canto inferior esquerdo).
input.onButtonPressed(Button.B, function () {
    // Inverte o estado da entrada B
    estadoB = !estadoB

    // Atualiza o LED que representa a entrada B
    if (estadoB) {
        led.plot(0, 4)
    } else {
        led.unplot(0, 4)
    }

    // Verifica novamente a condição AND, pois o estado B mudou.
    verificarAND()
})

// ============================================================
// Função que calcula e exibe o resultado da operação AND
// ============================================================
// Esta função é chamada sempre que um dos botões é pressionado.
// Ela apaga qualquer indicação anterior do resultado e, se
// ambas as entradas forem verdadeiras, acende o LED do resultado,
// mostra a palavra "AND" na tela, aguarda meio segundo e depois
// restaura a tela com os LEDs das entradas (para não perder a
// indicação visual).
function verificarAND() {
    // Primeiro, apaga o LED que representa o resultado AND
    // (coluna 4, linha 2 – centro direito da matriz 5x5).
    led.unplot(4, 2)

    // Testa se ambas as variáveis são verdadeiras (operação AND)
    if (estadoA && estadoB) {
        // Se a condição for verdadeira, acende o LED do resultado.
        led.plot(4, 2)

        // Exibe a palavra "AND" no display, rolando os caracteres.
        basic.showString("AND")

        // Faz uma pausa de 500 milissegundos (meio segundo) para que
        // o usuário possa ler a mensagem.
        basic.pause(500)

        // Apaga todo o conteúdo da matriz de LEDs para preparar a
        // restauração dos LEDs das entradas.
        basic.clearScreen()

        // Restaura os LEDs das entradas, caso estejam ativas.
        // Isso é necessário porque o showString e o clearScreen
        // apagaram tudo. Reacendemos cada entrada se ela estiver ativa.
        if (estadoA) {
            led.plot(0, 0)   // acende entrada A novamente
        }
        if (estadoB) {
            led.plot(0, 4)   // acende entrada B novamente
        }
    }
    // Se a condição AND não for satisfeita, o LED do resultado
    // permanece apagado (já foi apagado no início da função) e
    // nada mais é feito.
}

Código 2: Operador OR (OU) - Basta Um Ser Verdade

// ================================================================
// FUNÇÃO: mostrarOR
// ================================================================
// Objetivo: Esta função implementa a visualização do resultado de
// uma operação lógica OR (OU) entre duas variáveis booleanas,
// chamadas estadoA e estadoB. Ela é projetada para ser executada
// no micro:bit, utilizando a matriz de 5x5 LEDs para fornecer
// feedback visual.
//
// Quando chamada, a função:
//   1. Apaga o LED central (posição 4,2) para começar com a tela limpa.
//   2. Verifica se estadoA OU estadoB é verdadeiro (operação OR).
//   3. Se verdadeiro:
//      - Acende o LED central (4,2) para indicar saída ativa.
//      - Exibe a palavra "OR" rolando na matriz.
//      - Pausa por 0,5 segundo para leitura.
//      - Limpa a tela.
//      - Acende LEDs nos cantos superiores/inferiores esquerdos
//        para indicar quais entradas (A e/ou B) estão ativas.
//   4. Se falso (ambas as entradas são 0), nada é exibido.
//
// As variáveis estadoA e estadoB devem ser definidas globalmente
// ou em escopo superior, representando os valores das entradas
// da porta lógica (normalmente 0 ou 1, true ou false).
// ================================================================

function mostrarOR() {
  // --------------------------------------------------------------
  // led.unplot(x, y) apaga (desliga) o LED na coluna x e linha y.
  // Coordenadas: x (0 a 4) e y (0 a 4), onde (0,0) é o canto
  // superior esquerdo e (4,4) o canto inferior direito.
  // A posição (4,2) está na coluna mais à direita, linha central.
  // Apagamos este LED para garantir que ele comece desligado,
  // independentemente do estado anterior.
  // --------------------------------------------------------------
  led.unplot(4, 2)

  // --------------------------------------------------------------
  // Estrutura condicional if: testa a expressão (estadoA || estadoB).
  // O operador || (OU lógico) retorna true se pelo menos uma das
  // variáveis for verdadeira (true). Se ambas forem false, retorna false.
  // Este é o comportamento da porta lógica OR: saída = A + B.
  // --------------------------------------------------------------
  if (estadoA || estadoB) {

    // ------------------------------------------------------------
    // led.plot(x, y) acende o LED na posição especificada.
    // Aqui acendemos o LED central (4,2) para sinalizar que a
    // saída da porta OR é 1 (ativa). Isso fornece um indicador
    // visual claro no centro da matriz.
    // ------------------------------------------------------------
    led.plot(4, 2)

    // ------------------------------------------------------------
    // basic.showString("OR") exibe a string "OR" na matriz de LEDs,
    // fazendo os caracteres rolarem da direita para a esquerda.
    // Isso reforça o significado da operação que está sendo mostrada.
    // ------------------------------------------------------------
    basic.showString("OR")

    // ------------------------------------------------------------
    // basic.pause(500) interrompe a execução do programa por
    // 500 milissegundos (0,5 segundos). Isso dá tempo suficiente
    // para o usuário ler a mensagem "OR" antes que a tela seja limpa.
    // ------------------------------------------------------------
    basic.pause(500)

    // ------------------------------------------------------------
    // basic.clearScreen() apaga todos os LEDs da matriz, deixando
    // a tela completamente escura. Isso prepara a matriz para
    // exibir os indicadores das entradas ativas.
    // ------------------------------------------------------------
    basic.clearScreen()

    // ------------------------------------------------------------
    // Se estadoA for verdadeiro, acende o LED na posição (0,0) –
    // canto superior esquerdo. Isso indica visualmente que a
    // entrada A está em nível lógico 1 (ativa).
    // ------------------------------------------------------------
    if (estadoA) { led.plot(0, 0) }

    // ------------------------------------------------------------
    // Se estadoB for verdadeiro, acende o LED na posição (0,4) –
    // canto inferior esquerdo. Isso indica que a entrada B está
    // em nível lógico 1 (ativa).
    // ------------------------------------------------------------
    if (estadoB) { led.plot(0, 4) }

    // Nota: Se ambas as entradas forem verdadeiras, ambos os LEDs
    // (0,0) e (0,4) ficarão acesos simultaneamente, representando
    // a situação A=1 e B=1.
  }
  // --------------------------------------------------------------
  // Se a condição if for falsa (ou seja, estadoA == false E
  // estadoB == false), o bloco interno não é executado.
  // O LED central permanece apagado (pois foi desligado no início),
  // nenhuma mensagem é exibida e a função termina silenciosamente.
  // Isso representa o caso em que a saída OR é 0.
  // --------------------------------------------------------------
}

Código 3: Operador NOT (NÃO) - O Vira-Lata da Lógica

/**
 * =====================================================================
 * FUNÇÃO: mostrarNOT()
 * =====================================================================
 * 
 * OBJETIVO DIDÁTICO:
 *   Esta função foi criada para demonstrar, na prática, o funcionamento
 *   de uma porta lógica NOT (inversor) utilizando o micro:bit.
 * 
 *   Para isso, ela exibe no display da matriz de LEDs o valor invertido
 *   de duas variáveis globais chamadas 'estadoA' e 'estadoB'.
 * 
 *   A porta NOT pega um valor de entrada (0 ou 1) e produz na saída o
 *   valor oposto (1 ou 0). Ou seja:
 *      - Se a entrada for 1 (verdadeiro), a saída é 0 (falso).
 *      - Se a entrada for 0 (falso), a saída é 1 (verdadeiro).
 * 
 *   Este código é parte de um projeto educacional para ensinar lógica
 *   binária e programação em blocos/texto no ambiente MakeCode.
 * 
 * PRÉ-REQUISITOS:
 *   - As variáveis 'estadoA' e 'estadoB' devem ser declaradas em escopo
 *     global (fora desta função) e devem ser do tipo booleano (true/false)
 *     ou numérico (1/0). Elas representam os estados de entrada que podem
 *     ser controlados, por exemplo, por botões, sensores ou valores
 *     pré-definidos.
 * 
 * ESTRUTURA DA FUNÇÃO:
 *   1. Limpa a tela para começar com o display vazio.
 *   2. Exibe uma mensagem indicando que vamos mostrar o resultado da
 *      porta NOT para a entrada A.
 *   3. Pausa para que o usuário possa ler a mensagem.
 *   4. Verifica o valor de 'estadoA' e exibe '0' se for verdadeiro
 *      (entrada 1 → saída 0) ou '1' se for falso (entrada 0 → saída 1).
 *   5. Pausa para visualização.
 *   6. Repete o processo para a entrada B.
 *   7. Pausa final antes de encerrar.
 * 
 * =====================================================================
 */

function mostrarNOT() {
  // -------------------- INÍCIO DA EXECUÇÃO --------------------

  // 1. Limpa completamente a matriz de LEDs do micro:bit,
  //    apagando qualquer desenho ou texto que estiver sendo exibido.
  basic.clearScreen()

  // 2. Exibe, rolando no display, a mensagem "NOT A".
  //    Isso informa ao usuário que o próximo valor mostrado será o
  //    resultado da operação NOT aplicada à variável 'estadoA'.
  basic.showString("NOT A")

  // 3. Faz uma pausa de 500 milissegundos (meio segundo).
  //    Isso dá tempo para que a mensagem "NOT A" seja lida antes
  //    de mostrarmos o resultado propriamente dito.
  basic.pause(500)

  // 4. Estrutura condicional que verifica o valor de 'estadoA'.
  //    Se 'estadoA' for verdadeiro (true ou 1), significa que a
  //    entrada é 1. A porta NOT inverte esse valor, então a saída
  //    deve ser 0. Portanto, exibimos o caractere "0".
  if (estadoA) {
    basic.showString("0")
  } else {
    //    Caso contrário, se 'estadoA' for falso (false ou 0),
    //    a entrada é 0 e a saída da porta NOT é 1.
    //    Então exibimos o caractere "1".
    basic.showString("1")
  }

  // 5. Nova pausa de 500 ms para que o valor exibido (0 ou 1) possa
  //    ser visualizado com calma antes de prosseguirmos.
  basic.pause(500)

  // 6. Agora vamos repetir o mesmo processo para a segunda variável,
  //    'estadoB'. Primeiro, exibimos a mensagem "NOT B" para indicar
  //    que o próximo resultado é referente à entrada B.
  basic.showString("NOT B")

  // 7. Pausa para leitura da mensagem.
  basic.pause(500)

  // 8. Verificamos o valor de 'estadoB' e aplicamos a inversão lógica.
  //    Se 'estadoB' for verdadeiro, exibimos "0" (pois NOT 1 = 0).
  //    Se for falso, exibimos "1" (pois NOT 0 = 1).
  if (estadoB) {
    basic.showString("0")
  } else {
    basic.showString("1")
  }

  // 9. Pausa final de 500 ms para que o último resultado fique visível
  //    antes de a função terminar. Após esse tempo, o display pode ser
  //    limpo novamente por outra parte do programa ou permanecer com
  //    o último caractere exibido.
  basic.pause(500)

  // -------------------- FIM DA FUNÇÃO --------------------
  // Após a execução, o micro:bit terá mostrado, sequencialmente:
  //    "NOT A" → (inverso de estadoA) → "NOT B" → (inverso de estadoB)
  // Isso permite comparar visualmente os dois resultados.
}

// =====================================================================
// OBSERVAÇÕES FINAIS PARA O USUÁRIO:
//   - Certifique-se de que as variáveis 'estadoA' e 'estadoB' estejam
//     definidas em algum lugar do seu programa (por exemplo, no início
//     do código ou em um bloco "on start").
//   - Exemplo de definição:
//        let estadoA = true   // ou false / 1 / 0
//        let estadoB = false
//   - Você pode alterar esses valores dinamicamente, por exemplo,
//     lendo o estado de um botão (input.buttonIsPressed()) ou de um
//     pino digital (pins.digitalReadPin()).
//   - Execute esta função chamando 'mostrarNOT()' em algum ponto do
//     seu programa (ex: no laço 'forever' ou ao pressionar um botão).
// =====================================================================
⏱️ Detalhamento Minuto a Minuto (50 min)
0-5 min
Grito de Guerra Lógico 📣 — "AND é chato - as duas condições precisam ser verdade. OR é legal - uma verdade basta. NOT é o vira-lata - ele inverte tudo!" Dinâmica Rápida: Professor fala afirmações, alunos levantam cartão VERDE (verdade) ou VERMELHO (falso). Exemplos: "Hoje é dia de semana" (verde), "Estamos na aula de robótica E é segunda-feira" (depende).
5-15 min
Jogo "Juiz Lógico" ⚖️ — Cada aluno recebe dois cartões (VERDADE e FALSO). Professor projeta uma tabela verdade vazia para AND. Definir: A = "Está chovendo", B = "Está frio". Fazer o mesmo para OR e NOT.
15-25 min
Codificação - AND na Micro:bit 💻 — 1. Criar variáveis estadoA e estadoB. 2. Programar o botão A para alternar estadoA. 3. Programar o botão B para alternar estadoB. 4. Criar função verificarAND() que acende LED se ambos forem verdade. Teste: Pressionar A, B, A+B e observar o resultado.
25-35 min
Adicionando OR 🔀 — 1. Copiar o código do AND e adaptar para OR. 2. Adicionar um segundo LED para mostrar OR (posição diferente). 3. Testar todas as combinações. Desafio: O que acontece se você pressionar A E B ao mesmo tempo?
35-45 min
Explorando NOT 🔄 — 1. Criar função mostrarNOT() que mostra o inverso de cada estado. 2. Usar basic.showString() para mostrar os resultados.
45-50 min
História em Quadrinhos Lógica 🎨 — Cada aluno desenha um quadrinho de 3 painéis explicando AND, OR e NOT: Painel 1: "Para ir ao cinema, você precisa de dinheiro E tempo livre." (AND). Painel 2: "Para comer sobremesa, basta ter sobremesa OU ganhar um prêmio." (OR). Painel 3: "Se você NÃO estudou, então não vai brincar." (NOT).
♿ Orientações para Adaptações e Inclusão
  • TEA: Usar objetos concretos para representar VERDADE (luz acesa) e FALSO (luz apagada). Tabelas verdade impressas em papel com cores fixas.
  • TDAH: Jogo de "verdade ou mentira" em pé: um lado da sala é verdade, outro é falso. Timer para cada rodada (10 segundos por combinação).
  • Deficiência visual: Feedback sonoro diferente para verdade (bip alto) e falso (bip baixo).
  • Altas habilidades: Construir tabela verdade de 3 variáveis: (A E B) OU (C). Criar uma expressão lógica que representa um problema real.
📊 Critérios Operacionais de Avaliação
Critério Evidência Pontuação
Compreensão de operadores Explica AND, OR e NOT com exemplos 0-3
Tabela verdade Preencheu corretamente a tabela AND 0-3
Codificação Criou condicional com AND no MakeCode 0-2
Quadrinho Desenhou os 3 painéis explicativos 0-2

Total: 10 pontos

Frase do dia: "AND é exigente, OR é compreensivo, NOT é o rebelde que inverte tudo. A lógica é a arte de decidir!"

🎯 Objetivos Operacionais
  • Usar variáveis numéricas e lógicas em expressões complexas com AND/OR.
  • Construir um jogo de tabuleiro físico onde as decisões usam operadores lógicos.
  • Implementar um mini-jogo na micro:bit com pontuação e condições de vitória.
  • Compreender o conceito de coordenadas na matriz de LEDs (plano cartesiano).
📚 Conteúdo Programático

Variáveis numéricas e lógicas — Expressões com AND/OR — Coordenadas na matriz de LEDs (x, y) — Jogo como sistema de regras — Estruturas de decisão — RCP-PR (EF04CO01): Matrizes como estrutura de dados com posições definidas por coordenadas.

📋 Habilidades BNCC e RCP-PR

BNCC (Matemática): EF05MA02 - Ler e escrever números (variáveis de pontuação). EF05MA23 - Coordenadas para movimentação no tabuleiro.
BNCC (Ciências): EF05CI02 - Estímulos e respostas (o jogador decide baseado em condições).
RCP-pr (Computação): (EF04CO01) Reconhecer objetos do mundo real e/ou digital que podem ser representados através de matrizes. (EF05CO04) Criar algoritmos com seleções condicionais.

🧰 Materiais
Computadores com MakeCode BBC micro:bit para cada dupla Tabuleiro impresso 5×5 com coordenadas (0 a 4) Fichas coloridas para marcar posições Dados (ou roleta) Cartões de eventos com condicionais
🔧 Explicação Detalhada da Montagem do Hardware

Configuração: Conecte a micro:bit ao computador via USB. Acesse makecode.microbit.org e crie um projeto chamado AULA6_TABULEIRO. A matriz de LEDs 5×5 será nosso tabuleiro de jogo. Cada LED representa uma posição (coordenada x, y).

Compreendendo o Plano Cartesiano da Matriz: A matriz tem 5 colunas (x = 0 a 4) e 5 linhas (y = 0 a 4). O canto superior esquerdo é (0,0). O canto inferior direito é (4,4). led.plot(x, y) acende o LED na posição (x, y). Analogia: "É igual ao jogo da batalha naval! Cada posição tem um endereço (coordenada)."

Movimentação: Botão A = move para cima (diminui y); Botão B = move para baixo (aumenta y); Botão A+B = move para esquerda (diminui x); Logotipo = move para direita (aumenta x).

💻 Código a Ser Desenvolvido

Código 1: Jogo de Tabuleiro com Coordenadas

/*
 * ============================================================
 * PROJETO: JOGO DE EXPLORAÇÃO NO MICRO:BIT
 * ============================================================
 * 
 * Este é um jogo educativo para o micro:bit, onde você controla
 * um personagem em uma matriz 5x5 de LEDs (de 0 a 4 em X e Y).
 * O objetivo é coletar pontos, encontrar o tesouro e evitar
 * armadilhas, até alcançar a vitória!
 * 
 * Controles:
 *   - Botão A       → mover para CIMA
 *   - Botão B       → mover para BAIXO
 *   - Botões A+B    → mover para ESQUERDA
 *   - Logotipo      → mover para DIREITA (toque no logo)
 * 
 * Eventos especiais (posições fixas):
 *   - (4,4) → Tesouro: +5 pontos (uma vez)
 *   - (0,4) → Armadilha: -2 pontos se tiver mais de 3 pontos
 *   - (2,2) → Dado mágico: ganha de 1 a 3 pontos aleatórios
 * 
 * Vitória: quando pontos >= 10 E o tesouro já foi encontrado.
 * 
 * Tudo isso é feito usando apenas a matriz de LED e os botões
 * do micro:bit. Vamos entender cada parte do código!
 * ============================================================
 */

// ============================================================
// 1. DECLARAÇÃO DAS VARIÁVEIS GLOBAIS
// ============================================================
// Cada variável guarda um dado importante para o estado do jogo.

// Posição atual do jogador no eixo X (horizontal, coluna).
// Começa no centro da matriz: coluna 2 (0 a 4).
let posicaoJogadorX = 2

// Posição atual do jogador no eixo Y (vertical, linha).
// Começa no centro: linha 2.
let posicaoJogadorY = 2

// Pontuação acumulada pelo jogador. Inicia em zero.
let pontos = 0

// Indica se o tesouro já foi encontrado (true) ou não (false).
// Começa como false, pois ainda não foi encontrado.
let tesouroEncontrado = false

// Indica se a armadilha já foi ativada (true) ou não (false).
// Isso evita que o jogador perca pontos várias vezes na mesma armadilha.
let armadilhaAtivada = false

// Contador de quantas casas (posições) o jogador já visitou.
// Pode ser usado para estatísticas, embora não seja usado na lógica principal.
let casasVisitadas = 0

// ============================================================
// 2. FUNÇÃO: mostrarPosicao()
// ============================================================
// Objetivo: atualizar a matriz de LEDs para mostrar apenas o
// ponto onde o jogador está.
// Ela limpa a tela e acende o LED na posição (X, Y) atual.
function mostrarPosicao() {
    // Apaga todos os LEDs da matriz (limpa a tela).
    basic.clearScreen()
    // Acende o LED na coordenada (posicaoJogadorX, posicaoJogadorY).
    // O micro:bit usa coordenadas (0,0) no canto superior esquerdo.
    led.plot(posicaoJogadorX, posicaoJogadorY)
}

// ============================================================
// 3. FUNÇÕES DE MOVIMENTO
// ============================================================
// Cada função tenta mover o jogador em uma direção, mas apenas
// se o movimento não ultrapassar os limites da matriz (0 a 4).
// Após mover, incrementa o contador de casas visitadas,
// atualiza a tela e verifica se algum evento especial ocorreu.

// --- moverCima() ---
// Move o jogador para cima (diminui Y) se Y > 0.
function moverCima() {
    // Verifica se a posição atual ainda permite subir (Y > 0).
    if (posicaoJogadorY > 0) {
        // Decrementa Y (sobe uma linha).
        posicaoJogadorY = posicaoJogadorY - 1
        // Incrementa o contador de casas visitadas.
        casasVisitadas = casasVisitadas + 1
        // Atualiza a matriz com a nova posição.
        mostrarPosicao()
        // Verifica se a nova posição dispara algum evento (tesouro, armadilha, etc.)
        verificarEvento()
    }
}

// --- moverBaixo() ---
// Move o jogador para baixo (aumenta Y) se Y < 4.
function moverBaixo() {
    // Verifica se ainda há espaço abaixo (Y < 4).
    if (posicaoJogadorY < 4) {
        posicaoJogadorY = posicaoJogadorY + 1
        casasVisitadas = casasVisitadas + 1
        mostrarPosicao()
        verificarEvento()
    }
}

// --- moverEsquerda() ---
// Move o jogador para esquerda (diminui X) se X > 0.
function moverEsquerda() {
    if (posicaoJogadorX > 0) {
        posicaoJogadorX = posicaoJogadorX - 1
        casasVisitadas = casasVisitadas + 1
        mostrarPosicao()
        verificarEvento()
    }
}

// --- moverDireita() ---
// Move o jogador para direita (aumenta X) se X < 4.
function moverDireita() {
    if (posicaoJogadorX < 4) {
        posicaoJogadorX = posicaoJogadorX + 1
        casasVisitadas = casasVisitadas + 1
        mostrarPosicao()
        verificarEvento()
    }
}

// ============================================================
// 4. FUNÇÃO: verificarEvento()
// ============================================================
// Esta é a função mais importante do jogo. Ela checa se a
// posição atual do jogador corresponde a algum evento especial
// e executa a ação correspondente (ganhar/perder pontos, etc.).
function verificarEvento() {
    // Cria variáveis locais X e Y para facilitar a leitura.
    let x = posicaoJogadorX
    let y = posicaoJogadorY

    // ------------------------------------------------------------
    // EVENTO 1: Tesouro na posição (4, 4) - canto inferior direito
    // ------------------------------------------------------------
    // Se o jogador está em (4,4) e o tesouro ainda não foi encontrado,
    // ele ganha 5 pontos, marca o tesouro como encontrado,
    // exibe um ícone de "sim" (✔) e volta a mostrar a posição.
    if (x == 4 && y == 4) {
        // Verifica se o tesouro ainda não foi pego.
        if (!tesouroEncontrado) {
            pontos = pontos + 5          // Adiciona 5 pontos.
            tesouroEncontrado = true     // Marca como encontrado para não repetir.
            basic.showIcon(IconNames.Yes) // Mostra um check (✔) na matriz.
            basic.pause(500)             // Pausa de 500 ms para o jogador ver.
            mostrarPosicao()             // Volta a mostrar a posição do jogador.
        }
    }

    // ------------------------------------------------------------
    // EVENTO 2: Armadilha na posição (0, 4) - canto inferior esquerdo
    // ------------------------------------------------------------
    // Se o jogador está em (0,4), a armadilha ainda não foi ativada
    // E ele tem mais de 3 pontos, então perde 2 pontos.
    // A armadilha é ativada (não pode mais ser acionada) e mostra
    // um ícone de "não" (✘).
    if (x == 0 && y == 4) {
        // Verifica se a armadilha ainda não foi ativada e se o jogador
        // tem pontos suficientes (mais de 3) para não ficar com pontos negativos.
        if (!armadilhaAtivada && pontos > 3) {
            pontos = pontos - 2          // Perde 2 pontos.
            armadilhaAtivada = true      // Marca a armadilha como ativada.
            basic.showIcon(IconNames.No)  // Mostra um "X" (✘) na matriz.
            basic.pause(500)             // Pausa para visualização.
            mostrarPosicao()             // Retorna à posição do jogador.
        }
    }

    // ------------------------------------------------------------
    // EVENTO 3: Dado mágico no centro (2, 2)
    // ------------------------------------------------------------
    // Se o jogador está no centro, ele ganha um bônus aleatório
    // de 1 a 3 pontos. O número sorteado é exibido brevemente.
    if (x == 2 && y == 2) {
        // Gera um número inteiro aleatório entre 1 e 3 (inclusive).
        let bonus = Math.randomRange(1, 3)
        pontos = pontos + bonus           // Adiciona o bônus aos pontos.
        basic.showNumber(bonus)           // Mostra o número ganho na matriz.
        basic.pause(500)                 // Pausa para o jogador ver o número.
        mostrarPosicao()                 // Volta a mostrar a posição.
    }

    // ------------------------------------------------------------
    // EVENTO 4: Condição de vitória
    // ------------------------------------------------------------
    // Se o jogador acumulou 10 ou mais pontos E já encontrou o tesouro,
    // então ele vence o jogo! A função vitoria() é chamada.
    if (pontos >= 10 && tesouroEncontrado) {
        vitoria()
    }
}

// ============================================================
// 5. FUNÇÃO: vitoria()
// ============================================================
// Exibe uma animação de comemoração (pisca um coração) e mostra
// a mensagem "GANHOU!" seguida da pontuação final.
function vitoria() {
    // Limpa a tela antes da animação.
    basic.clearScreen()

    // Laço que repete 5 vezes para piscar um coração.
    // OBS: a imagem do coração está vazia (todos pontos ".") no código original.
    // Provavelmente isso é um placeholder; você pode substituir por um desenho
    // de coração, mas mantivemos o código original.
    for (let i = 0; i < 5; i++) {
        // Cria uma imagem 5x5 vazia (todos os LEDs apagados).
        let coracao = images.createImage(`. . . . . . . . . . . . . . . . . . . . . . . . .`)
        // Exibe a imagem (que está vazia, portanto nada aparece).
        coracao.showImage(0)
        // Pausa de 200 ms.
        basic.pause(200)
        // Limpa a tela (apaga tudo).
        basic.clearScreen()
        // Pausa de 200 ms.
        basic.pause(200)
    }

    // Após a animação, exibe a mensagem "GANHOU!" na tela.
    basic.showString("GANHOU!")
    // Pausa de 1 segundo.
    basic.pause(1000)
    // Mostra a palavra "PTS" (abreviação de pontos).
    basic.showString("PTS")
    // Mostra o valor final dos pontos.
    basic.showNumber(pontos)
}

// ============================================================
// 6. PROGRAMA PRINCIPAL (inicialização e eventos)
// ============================================================
// Quando o micro:bit liga, o código é executado de cima para baixo.
// Aqui, inicializamos a tela mostrando a posição inicial do jogador.
mostrarPosicao()

// ============================================================
// Mapeamento dos botões para as funções de movimento
// ============================================================
// O micro:bit possui dois botões (A e B) e um logotipo (logo)
// que pode ser tocado. Associamos cada ação a um desses controles.

// Botão A → mover para cima.
input.onButtonPressed(Button.A, function () {
    moverCima()
})

// Botão B → mover para baixo.
input.onButtonPressed(Button.B, function () {
    moverBaixo()
})

// Botões A e B pressionados simultaneamente → mover para esquerda.
input.onButtonPressed(Button.AB, function () {
    moverEsquerda()
})

// Toque no logotipo (área dourada) → mover para direita.
// O evento TouchButtonEvent.Pressed é disparado quando o logo é tocado.
input.onLogoEvent(TouchButtonEvent.Pressed, function () {
    moverDireita()
})

// ============================================================
// FIM DO CÓDIGO
// ============================================================
// Agora você já sabe como cada parte funciona!
// Divirta-se explorando o micro:bit com este joguinho.
// ============================================================
⏱️ Detalhamento Minuto a Minuto (50 min)
0-5 min
Aquecimento - O Tabuleiro Lógico 🎲 — "Hoje vamos jogar um jogo de tabuleiro em que as decisões não dependem só da sorte, mas de LÓGICA! Cada um de vocês será um peão na matriz de LEDs da micro:bit!" Regras Básicas: O jogador começa no centro (2,2). Cada movimento é controlado pelos botões. Cada casa tem eventos diferentes. Para ganhar, precisa de 10 pontos E encontrar o tesouro.
5-15 min
Jogo do Tabuleiro Humano (Desplugado) 🧍 — Desenhe um tabuleiro 5×5 no chão com fita crepe. Cada aluno é um peão. Cartões de Evento: Casa (4,4): "Tesouro! +5 pontos" (precisa ter encontrado). Casa (0,4): "Armadilha! -2 pontos se tiver mais de 3 pontos". Casa (2,2): "Dado mágico! Ganhe 1-3 pontos". Desafio Lógico: "Se você tem mais de 3 pontos E encontrou o tesouro, pule para a casa (4,4) e vença!"
15-25 min
Introdução às Coordenadas na Matriz 📐 — Professor explica: "A matriz 5×5 da micro:bit é igual a um tabuleiro. Cada posição tem um endereço: (x, y)." Atividade: 1. led.plot(0, 0) - acende o canto superior esquerdo. 2. led.plot(4, 4) - acende o canto inferior direito. 3. led.plot(2, 2) - acende o centro. Desafio: "Como acender todos os LEDs da borda?"
25-35 min
Codificação do Tabuleiro 💻 — Passo a passo: 1. Criar variáveis: posicaoX, posicaoY, pontos, tesouroEncontrado. 2. Criar função mostrarPosicao() que plota o jogador. 3. Criar funções de movimento com limites (0 a 4). 4. No programa principal: mostrarPosicao(). Teste: "Use os botões para andar pelo tabuleiro. O LED mostra onde você está."
35-45 min
Adicionando Eventos e Lógica 🎯 — 1. Criar função verificarEvento() que checa a posição atual. 2. Adicionar evento do tesouro em (4,4) - usa AND. 3. Adicionar evento da armadilha em (0,4) - usa AND e OR. 4. Adicionar evento do dado mágico em (2,2). Desafio: "O que acontece se você chegar em (4,4) antes de ter 10 pontos?"
45-50 min
Discussão e Registro 💬 — Professor conduz rodada de conversa: "Qual foi a condição mais difícil de avaliar no tabuleiro?" "Como vocês representaram no código a ideia de 'E' e 'OU'?" "O que acontece se a gente troca AND por OR no critério de vitória?" Alunos escrevem no diário: "Uma condição que usei AND foi ______. Uma condição que usei OR foi ______."
♿ Orientações para Adaptações e Inclusão
  • TEA: Tabuleiro com menos casas (3×3) com cartões visuais com ícones. Instruções passo a passo impressas.
  • TDAH: Tabuleiro com poucas casas e cartões visuais com ícones. Checklist de blocos necessários no MakeCode.
  • Deficiência visual: Feedback sonoro para cada evento (som diferente para tesouro, armadilha, vitória). Instruções em áudio.
  • Altas habilidades: Criar jogo com condicionais envolvendo 3 variáveis (pontos, vida, inventário). Adicionar "modo de segurança" com timer.
📊 Critérios Operacionais de Avaliação
Critério Evidência Pontuação
Compreensão de coordenadas Identifica posições na matriz 5×5 0-3
Expressões lógicas Criou condicional com AND/OR 0-3
Jogo na micro:bit Implementou tabuleiro com eventos 0-2
Participação Avaliou corretamente os cartões do tabuleiro 0-2

Total: 10 pontos

Frase do dia: "No tabuleiro da programação, cada coordenada é um passo. Cada condição é uma escolha. Jogue com lógica!"

🎯 Objetivos Operacionais
  • Integrar sensor de toque (logotipo) real da micro:bit.
  • Usar condicionais com AND/OR para controlar ações do robô.
  • Compreender o conceito de entrada (input) e saída (output).
  • Criar um sistema de reação a estímulos usando o sensor de luz ambiente.
  • RCP-PR (EF05CO03): Realizar operações de negação, conjunção e disjunção sobre sentenças lógicas.
📚 Conteúdo Programático

Sensor de toque da micro:bit (logotipo e pinos) — Sensor de luz ambiente da micro:bit — Leitura de sensores (entradas) — Condicionais com sensores — Relação estímulo-resposta — RCP-PR: Sensores e atuadores - Leitura e decisão baseada em dados.

📋 Habilidades BNCC e RCP-PR

BNCC (Ciências): EF05CI01 - Construir protótipos com sensores. EF05CI02 - Relação estímulo-resposta.
BNCC (Matemática): EF05MA10 - Regularidades (valores do sensor repetem padrões).
RCP-pr (Computação): (EF05CO03) Realizar operações de negação, conjunção e disjunção sobre sentenças lógicas e valores 'verdadeiro' e 'falso'.

🧰 Materiais
Computadores com MakeCode BBC micro:bit para cada dupla Cabos com jacaré (opcional) Objetos condutores (papel alumínio, moedas) Cartolina para diagrama Lanterna para testar o sensor de luz Caixa de papelão para fazer um "corpo de robô"
🔧 Explicação Detalhada da Montagem do Hardware

Configuração: Conecte a micro:bit ao computador via USB. Acesse makecode.microbit.org e crie um projeto chamado AULA7_MEDROSO. A micro:bit possui sensores integrados que vamos explorar:

Sensores Integrados da micro:bit: Botão A e B: entrada digital (pressionado/não pressionado). Logotipo dourado: sensor de toque capacitivo (detecta quando você toca). Sensor de luz: mede a intensidade de luz ambiente (0 = escuro total, 255 = muito claro).

Explorando o Sensor de Toque do Logotipo: O logotipo dourado na frente da micro:bit é um sensor de toque! input.onLogoEvent(TouchButtonEvent.Pressed, function() {}) detecta toque. É como um botão invisível que responde ao toque do dedo.

Explorando o Sensor de Luz: O sensor de luz fica na parte superior da placa (próximo aos LEDs). input.lightLevel() retorna um valor de 0 a 255. Valores baixos = escuro, valores altos = claro.

💻 Código a Ser Desenvolvido

Código 1: O Robô Medroso com Sensor de Toque

// ==========================================
// O ROBÔ MEDROSO - SENSOR DE TOQUE + LUZ
// ==========================================
// Este programa simula um robô que reage a estímulos de toque (logo do micro:bit)
// e à intensidade da luz ambiente. Ele possui quatro comportamentos possíveis:
// CORRE, MEDO, PARADO e DANÇA, dependendo das condições.
// Além disso, inclui botões para controlar um "modo medo" e exibir informações.

// Variáveis globais (estado do robô)
let toqueDetectado = false   // Indica se o logo (logotipo) está sendo tocado no momento
let luzAmbiente = 0          // Armazena o último valor de luz lido (não é realmente usado, pois a função lerLuz() é chamada a cada reação)
let passosDados = 0          // Contador de quantos passos (ciclos de animação) o robô já executou
let modoMedo = false         // Estado de um "modo medo" ativado/desativado pelo botão A (não influencia diretamente as reações, apenas mostra "LUZ ON/OFF")

// ------------------------------------------------------------
// Função que lê o nível de luz atual do sensor ambiente do micro:bit
// Retorna um número entre 0 (escuro total) e 255 (muito claro)
function lerLuz() {
    let nivelLuz = input.lightLevel()   // Obtém o valor do sensor de luz embutido
    return nivelLuz                     // Retorna esse valor para quem chamou
}

// ------------------------------------------------------------
// Função que anima o robô andando (simula passos)
// Parâmetro: passos - número de passos a serem executados
function moverRobo(passos: number) {
    // Loop que repete a quantidade de passos solicitada
    for (let i = 0; i < passos; i++) {
        led.plot(2, i % 5)                // Acende um LED na coluna 2, linha variando de 0 a 4 (ciclo)
        basic.pause(100)                  // Espera 100 ms para dar efeito visual
        led.unplot(2, i % 5)              // Apaga o mesmo LED
        passosDados = passosDados + 1     // Incrementa o contador global de passos dados
    }
}

// ------------------------------------------------------------
// Função que decide a reação do robô com base no toque e na luz
// É chamada sempre que o estado de toque muda ou quando os botões são pressionados
function reagir() {
    basic.clearScreen()                 // Limpa a tela de LED para começar uma nova animação
    let luz = lerLuz()                 // Lê o nível de luz atual
    let toque = toqueDetectado         // Pega o estado atual do toque (true/false)

    // 1. SE (for tocado) E (estiver escuro) → CORRE!
    // Condição: toque verdadeiro E luz menor que 50 (escuro)
    if (toque && luz < 50) {
        basic.showString("CORRE")         // Mostra a palavra "CORRE" na tela
        basic.pause(500)                  // Pausa 500 ms para visualização
        moverRobo(5)                      // Executa 5 passos (animação)
        let medo = images.createImage(`. . . . . . . . . . . . . . . . . . . . . . . . .`)  // Cria uma imagem vazia (não mostra nada)
        medo.showImage(0)                 // Exibe essa imagem (instantaneamente, sem efeito)
    }
    // 2. SE (for tocado) OU (estiver MUITO escuro) → VAI COM MEDO
    // Condição: toque verdadeiro OU luz menor que 20 (muito escuro)
    else if (toque || luz < 20) {
        basic.showString("MEDO")          // Mostra "MEDO"
        basic.pause(500)
        moverRobo(3)                      // Executa apenas 3 passos (menos que CORRE)
        let preocupado = images.createImage(`. . . . . . . . . . . . . . . . . . . . . . . . .`)
        preocupado.showImage(0)
    }
    // 3. SE (NÃO for tocado) E (luz normal) → FICA PARADO
    // Condição: toque falso E luz maior ou igual a 50
    else if (!toque && luz >= 50) {
        basic.showString("PARADO")        // Mostra "PARADO"
        basic.pause(500)
        let feliz = images.createImage(`. . . . . . . . . . . . . . . . . . . . . . . . .`)
        feliz.showImage(0)
    }
    // 4. SE (NÃO estiver escuro) E (NÃO for tocado) → DANÇA!
    // Condição: luz NÃO menor que 50 (ou seja, >=50) E toque falso
    // Esta condição é equivalente à anterior? Vamos analisar:
    // A condição 3 é (!toque && luz >= 50) e a 4 é (!(luz < 50) && !toque) que é o mesmo que (luz >= 50 && !toque).
    // Portanto, a condição 3 e a 4 são idênticas! Isso faz com que a condição 4 nunca seja alcançada,
    // porque a 3 captura exatamente o mesmo caso. Provavelmente o programador queria uma ordem diferente.
    // Mas não vamos alterar o código, apenas comentar.
    else if (!(luz < 50) && !toque) {
        basic.showString("DANCA")         // Mostra "DANCA"
        basic.pause(500)
        dancar()                          // Chama a função de dança
    }
}

// ------------------------------------------------------------
// Função que faz o robô "dançar" (pisca a tela 3 vezes)
function dancar() {
    // Repete 3 vezes
    for (let i = 0; i < 3; i++) {
        let feliz = images.createImage(`. . . . . . . . . . . . . . . . . . . . . . . . .`)  // Imagem vazia
        feliz.showImage(0)                // Mostra (não aparece nada)
        basic.pause(200)                  // Espera 200 ms
        basic.clearScreen()               // Limpa a tela
        basic.pause(200)                  // Espera mais 200 ms
    }
}

// ------------------------------------------------------------
// Evento disparado quando o logo (logotipo) do micro:bit é pressionado (toque)
input.onLogoEvent(TouchButtonEvent.Pressed, function () {
    toqueDetectado = true               // Marca que o toque está ativo
    reagir()                            // Chama a reação imediatamente
})

// Evento disparado quando o logo é solto (fim do toque)
input.onLogoEvent(TouchButtonEvent.Released, function () {
    toqueDetectado = false              // Marca que não está mais tocando
    basic.clearScreen()                 // Limpa a tela (preparação)
    reagir()                            // Reage novamente (agora sem toque)
})

// ------------------------------------------------------------
// Evento do botão A: alterna o "modo medo" (apenas exibe uma mensagem)
// Não afeta diretamente as reações, mas mostra "LUZ ON" ou "LUZ OFF"
input.onButtonPressed(Button.A, function () {
    modoMedo = !modoMedo                // Inverte o estado do modo medo (true<->false)
    if (modoMedo) {
        basic.showString("LUZ ON")        // Se ativado, mostra "LUZ ON"
    } else {
        basic.showString("LUZ OFF")       // Se desativado, mostra "LUZ OFF"
    }
    basic.pause(500)                    // Pausa para leitura
    reagir()                            // Reage novamente (atualiza o comportamento)
})

// ------------------------------------------------------------
// Evento do botão B: exibe informações de depuração (toque e luz)
input.onButtonPressed(Button.B, function () {
    basic.clearScreen()                 // Limpa a tela
    basic.showString("T:" + toqueDetectado)  // Mostra "T:true" ou "T:false" (estado do toque)
    basic.pause(500)                    // Pausa
    basic.showString("L:" + lerLuz())   // Mostra "L:valor" (nível de luz atual)
    basic.pause(500)
    reagir()                            // Volta ao comportamento normal
})

// ------------------------------------------------------------
// Inicialização do programa: exibe "ROBO" e começa a reagir
basic.showString("ROBO")              // Mostra a palavra "ROBO" na inicialização
basic.pause(500)                      // Pequena pausa
reagir()                              // Chama a primeira reação (com base nas condições iniciais: sem toque, luz ambiente)

Código 2: Desafio - O Robô da Senha Tátil (Versão Medrosa)

/*
 * =================================================================
 * PROJETO: Cofre Secreto com Sensor de Luz e Logotipo Touch
 * =================================================================
 * 
 * OBJETIVO DIDÁTICO:
 * Este código ensina como usar:
 * 1. O sensor de luz ambiente (input.lightLevel())
 * 2. O evento de toque no logotipo (input.onLogoEvent)
 * 3. O evento de pressionar botões combinados (Button.AB)
 * 4. Variáveis globais para controle de estado (contagem, senha e modo)
 * 5. Exibição de números, textos e imagens na matriz de LEDs
 * 6. Lógica condicional (if/else) para tomar decisões
 * 7. Pequenos delays (basic.pause) para tornar a interação visível
 *
 * COMO FUNCIONA:
 * - A "senha correta" é 3 toques no logotipo.
 * - Porém, para proteger o cofre, só é permitido tentar a senha se 
 *   o ambiente estiver ESCURO (luz < 50). Se estiver CLARO, o 
 *   micro:bit exibe "MEDO" e reseta sua contagem (como se tivesse 
 *   sido pego no flagra!).
 * - Ao acertar a senha no escuro, o display mostra "SENHA OK", 
 *   apaga todos os LEDs e ativa o "modoSecreto".
 * - Pressionar A+B a qualquer momento reseta tudo (conta, modo e tela).
 * =================================================================
 */

// -----------------------------------------------------------------
// 1. DECLARAÇÃO DAS VARIÁVEIS GLOBAIS (ficam disponíveis o tempo todo)
// -----------------------------------------------------------------

// Variável que armazena quantas vezes o usuário tocou no logotipo 
// (funciona como a "tentativa" atual de digitar a senha).
let sequencia = 0

// Variável que guarda o valor da senha correta. Neste projeto, a 
// senha é o número 3 (três toques no logotipo). Você pode alterar 
// este valor para mudar a dificuldade.
let senhaCorreta = 3

// Variável do tipo "booleano" (verdadeiro ou falso) que indica se 
// o modo secreto foi ativado. Neste código, ela é usada apenas 
// como uma "bandeira" (flag) para sinalizar que o cofre foi aberto.
// Mesmo que não façamos nada com ela depois, ela serve como exemplo 
// de estado global que pode ser usado em outras partes do código.
let modoSecreto = false

// -----------------------------------------------------------------
// 2. EVENTO: TOQUE NO LOGOTIPO (parte dourada do micro:bit)
// -----------------------------------------------------------------
// Esta função é executada automaticamente SEMPRE que o usuário 
// tocar (e soltar) o logotipo dourado na frente da placa.
input.onLogoEvent(TouchButtonEvent.Pressed, function () {

    // Lê o nível de luz ambiente atual usando o sensor frontal do 
    // micro:bit. O valor retornado varia de 0 (escuro total) a 255 
    // (claridade intensa).
    let luz = input.lightLevel()

    // ---------------------------------------------------------------
    // VERIFICA SE ESTÁ ESCURO (CONDIÇÃO PARA DIGITAR A SENHA)
    // ---------------------------------------------------------------
    // Se a luz medida for MENOR que 50, significa que está escuro o 
    // bastante. O micro:bit "permite" que você tente a senha.
    if (luz < 50) {

        // INCREMENTA A SEQUÊNCIA: cada toque válido (no escuro) aumenta 
        // a contagem em 1. Isso representa a "digitação" da senha.
        sequencia = sequencia + 1

        // Mostra na matriz de LEDs o número atual da sequência (1, 2, 3...).
        // Isso dá um feedback visual imediato para o usuário.
        basic.showNumber(sequencia)

        // Faz uma pausa de 300 milissegundos (0,3 segundos). Isso é 
        // essencial para que o usuário consiga ENXERGAR o número exibido 
        // antes da próxima ação, tornando a experiência interativa.
        basic.pause(300)

        // -------------------------------------------------------------
        // VERIFICA SE A SENHA FOI COMPLETADA
        // -------------------------------------------------------------
        // Se a contagem atual for IGUAL ao valor da senha correta (3), 
        // significa que o usuário acertou a senha!
        if (sequencia == senhaCorreta) {

            // Exibe a mensagem "SENHA OK" rolando na matriz de LEDs. 
            // Isso confirma ao usuário que a senha está correta.
            basic.showString("SENHA OK")

            // Pausa por 1 segundo (1000 ms) para dar tempo de ler a 
            // mensagem antes da tela ser limpa.
            basic.pause(1000)

            // ZERA a variável "sequencia" imediatamente após acertar a 
            // senha. Isso prepara o sistema para uma nova tentativa futura, 
            // evitando que a contagem fique acumulada.
            sequencia = 0

            // Cria uma imagem vazia (todos os pontos são "." que significa 
            // LED apagado). Esta imagem tem 5x5 pixels, exatamente do 
            // tamanho da matriz do micro:bit.
            let tesouro = images.createImage(`. . . . . . . . . . . . . . . . . . . . . . . . .`)

            // Exibe a imagem criada (que é totalmente vazia) no índice 0 
            // (único quadro). Na prática, isso APAGA TODOS OS LEDS da tela, 
            // simulando que o "tesouro" foi revelado ou que a tela entrou 
            // em modo de espera.
            tesouro.showImage(0)

            // Ativa o "modoSecreto" (coloca como verdadeiro). Isso pode 
            // ser usado futuramente para, por exemplo, acender outros 
            // acessórios, tocar uma música, ou desbloquear uma nova etapa 
            // do jogo. Aqui, apenas marcamos que o cofre foi aberto.
            modoSecreto = true
        }

        // ---------------------------------------------------------------
        // SENÃO (se NÃO estiver escuro, ou seja, luz >= 50)
        // ---------------------------------------------------------------
        // Se a luz for maior ou igual a 50, significa que está claro. 
        // Neste projeto, o micro:bit "não permite" tentar a senha quando 
        // está claro, pois alguém poderia estar observando.
    } else {

        // Exibe a palavra "MEDO" na tela. Isso dá o feedback de que o 
        // dispositivo está com "medo" de ser descoberto na luz e, 
        // portanto, não permite a tentativa.
        basic.showString("MEDO")

        // Pausa por 500 ms (meio segundo) para a mensagem "MEDO" ser 
        // lida pelo usuário antes da tela ser limpa.
        basic.pause(500)

        // ZERA a sequência! Isso é muito importante: se alguém tentou 
        // digitar a senha na claridade, a contagem é resetada. Assim, 
        // a pessoa perde o progresso e precisa começar do zero quando 
        // estiver escuro novamente.
        sequencia = 0
    }
})

// -----------------------------------------------------------------
// 3. EVENTO: BOTÕES A+B PRESSIONADOS SIMULTANEAMENTE
// -----------------------------------------------------------------
// Esta função é executada quando o usuário pressiona os botões 
// A e B ao mesmo tempo. Funciona como um "reset" de emergência.
input.onButtonPressed(Button.AB, function () {

    // Reseta a contagem da sequência para 0, interrompendo qualquer 
    // tentativa de senha que estiver em andamento.
    sequencia = 0

    // Desativa o modo secreto (volta para falso). Isso garante que 
    // o sistema retorne ao estado inicial padrão.
    modoSecreto = false

    // Limpa completamente a tela (matriz de LEDs), apagando qualquer 
    // número, texto ou imagem que esteja sendo exibido no momento.
    basic.clearScreen()

    // Mostra a palavra "RESET" na tela para confirmar visualmente ao 
    // usuário que o comando de reinicialização foi executado com 
    // sucesso.
    basic.showString("RESET")

    // Pausa por 500 ms para dar tempo de visualizar a mensagem "RESET" 
    // antes que o programa prossiga (a tela ficará limpa após a pausa, 
    // pois não há mais instruções após ela).
    basic.pause(500)
})

// -----------------------------------------------------------------
// FIM DO CÓDIGO
// -----------------------------------------------------------------
// RESULTADO FINAL: 
// - Toque 3 vezes no logotipo NO ESCURO -> "SENHA OK" e tela apaga.
// - Toque no logotipo NA LUZ -> "MEDO" e contagem resetada.
// - Pressione A+B -> "RESET" e tudo é reiniciado.
// 
// DESAFIO PARA O ALUNO: 
// Tente modificar a variável "senhaCorreta" para 5, ou altere o 
// limite de luz de 50 para 100, e veja como o comportamento muda!
// =================================================================
⏱️ Detalhamento Minuto a Minuto (50 min)
0-5 min
Apresentação do Desafio - O Robô que Tem Medo do Escuro 👻 — "Temos um robô que só sai da base se for tocado E se a luz ambiente for baixa (noturno). OU se alguém gritar 'VAI' (simular com botão). Vamos programar essa lógica!" Mostrar: A micro:bit reagindo ao toque no logotipo e à luz ambiente.
5-15 min
Explorando os Sensores da Micro:bit 🔍 — Atividade 1: Testar o sensor do logotipo: ao tocar o logotipo → mostrar ícone coração; ao soltar o logotipo → limpar tela. Atividade 2: Explorar o sensor de luz: sempre → mostrar número nível de luz; Observar como muda quando cobre a micro:bit; Observar como muda quando usa uma lanterna. Discussão: "Quando o sensor de luz detecta o quê? O que é uma 'entrada'?"
15-25 min
Construindo o Sensor de Toque com o Logotipo 🖐️ — Passo a passo: 1. Criar variável toqueDetectado (verdadeiro/falso). 2. No toque do logotipo: toqueDetectado = verdadeiro. 3. Ao soltar: toqueDetectado = falso. Teste: "O LED acende quando você toca no logotipo e apaga quando solta."
25-35 min
Programando a Lógica do Robô Medroso 🧠 — Passo a passo da função reagir(): 1. Cenário 1: SE (toque == verdadeiro) E (luz < 50) → CORRE! 2. Cenário 2: SE (toque == verdadeiro) OU (luz < 20) → VAI COM MEDO! 3. Cenário 3: SE (toque == falso) E (luz >= 50) → FICA PARADO! 4. Cenário 4: SE NÃO (luz < 50) E NÃO (toque == verdadeiro) → DANÇA! Desafio: "O que acontece se você tocar no logotipo e cobrir a micro:bit ao mesmo tempo?"
35-45 min
Desafio - O Robô da Senha Tátil 🔐 — Enunciado: "Construa um robô que só executa uma ação secreta se o usuário tocar o sensor em uma sequência específica E estiver escuro!" Exemplo simples: 3 toques em sequência (só funciona no escuro).
45-50 min
Diário de Bordo 📝 — Escrever: "Meu sensor de toque funcionou porque ______." "Usei a lógica (AND/OR) para decidir quando o robô deve se mover: ______." "Se eu quisesse que o robô só se movesse quando NÃO tivesse toque, eu mudaria para: ______."
♿ Orientações para Adaptações e Inclusão
  • TEA: Usar um botão grande e colorido (estímulo tátil claro). Programar apenas uma condição de cada vez. Rotina visual: entrada → processamento → saída.
  • TDAH: Dividir a atividade em minidesafios: (1) sensor, (2) AND, (3) OR, (4) NOT. Checklist: [ ] Sensor funciona, [ ] AND implementado, [ ] OR implementado.
  • Deficiência física: Substituir o toque no logotipo pelo botão A (mais fácil de pressionar). Usar teclas grandes externas (Makey Makey).
  • Altas habilidades: Integrar dois sensores (toque e luz) e criar máquina de estados. Construir sensor de toque capacitivo com moeda e resistor.
📊 Critérios Operacionais de Avaliação
Critério Evidência Pontuação
Compreensão de entrada/saída Explica o que é um sensor 0-3
Programação do robô Condicional com AND/OR implementada 0-3
Desafio da senha Implementou sequência de toques 0-2
Diário de bordo Respondeu às 3 perguntas 0-2

Total: 10 pontos

Frase do dia: "Robô que tem medo do escuro é como programador que tem medo de bug: os dois aprendem com a experiência!"

🎯 Objetivos Operacionais
  • Aplicar funções, operadores lógicos e sensor de toque em um miniprojeto completo.
  • Planejar o projeto em etapas (entrada, processamento, saída).
  • Testar e depurar colaborativamente.
  • Compreender o conceito de "lista" como estrutura de dados para armazenar a senha.
  • RCP-PR (EF05CO04): Criar algoritmos com seleções condicionais.
📚 Conteúdo Programático

Projeto integrado: funções + lógica + sensores — Planejamento por etapas — Listas como estrutura de dados — Operadores lógicos (AND, OR, NOT) aplicados — Teste e depuração colaborativa — Algoritmos com seleção condicional — RCP-PR (EF05CO04): Criar algoritmos com seleções condicionais.

📋 Habilidades BNCC e RCP-PR

BNCC (Língua Portuguesa): EF05LP17 - Planejar roteiro de teste.
BNCC (Ciências): EF05CI01 - Protótipo funcional.
BNCC (Matemática): EF05MA10 - Regularidades (sequência de toques).
RCP-pr (Computação): (EF05CO04) Criar algoritmos com seleções condicionais. Resolução de problemas - Projeto completo.

🧰 Materiais
Computadores com MakeCode BBC micro:bit para cada dupla Cabo USB Cartolina para diagrama de blocos Cronômetro Caixa de sapato decorada (cofre) Servo motor (opcional)
🔧 Explicação Detalhada da Montagem do Hardware

Configuração: Conecte a micro:bit ao computador via USB. Acesse makecode.microbit.org e crie um projeto chamado AULA8_COFRE. Usaremos o logotipo da micro:bit como sensor de toque (entrada). A matriz de LEDs será nosso display mostrando feedback. Os botões A e B servirão para confirmar e reiniciar.

Cofre Físico (Opcional - Projeto Maker): Decore uma caixa de sapato como um cofre. Cole a micro:bit na parte frontal. Use um servo motor para trancar/destrancar a porta. Faça uma "porta" que se abre quando a senha for correta.

💻 Código a Ser Desenvolvido

Código 1: Estrutura do Cofre - Variáveis e Listas

// ==========================================
// COFRE ROBÔ - A SENHA TÁTIL DOS ESPIÕES
// ==========================================
// 
// Este programa simula um cofre que só abre quando o usuário digita uma
// sequência correta de toques (curtos e longos) em um pino de entrada do micro:bit.
// A senha é definida por uma lista de números: 1 = toque curto, 2 = toque longo,
// 0 = pausa (separador entre dígitos, mas aqui usamos 0 para indicar pausa, porém
// a lógica atual não usa o 0 na detecção; ele está na senhaCorreta apenas como referência).
// 
// O código está preparado para ser usado com o MakeCode (blocos ou JavaScript).
// Para funcionar, a função 'detectarToque' deve ser associada a um evento de toque
// no pino (ex: input.onPinPressed(TouchPin.P0, () => { detectarToque() })).
// 
// O cofre permite até 3 tentativas erradas; após isso, bloqueia permanentemente.
// Quando a senha é digitada corretamente, o cofre é aberto (representado por um
// ícone ou mensagem) e novas tentativas são ignoradas.
//
// Estrutura do código:
//   - Variáveis globais para controle do estado.
//   - Função detectarToque() que é chamada a cada toque.
//   - (A função verificarSenha() não está definida neste trecho, mas deve existir
//     para completar a lógica; ela compara a senha digitada com a correta).

// ========== DECLARAÇÃO DE VARIÁVEIS GLOBAIS ==========

// 1 = toque curto, 2 = toque longo, 0 = pausa (não usado na detecção atual)
let senhaCorreta: number[] = [1, 1, 0, 1]  // Define a senha secreta: curto, curto, pausa, curto.
                                            // A pausa (0) serve apenas como separador conceitual; na prática,
                                            // o código ignora o 0 e considera apenas os toques 1 e 2.
                                            // A senha efetiva é [1,1,1] se desconsiderarmos o 0, mas o
                                            // comprimento da senha (len=4) inclui o 0, o que pode causar
                                            // comportamento inesperado. Isso é proposital para fins didáticos.

let senhaUsuario: number[] = []             // Array que armazena os toques digitados pelo usuário.
                                            // Cada novo toque é adicionado ao final.

let indiceSenha = 0                         // Contador que indica quantos toques já foram registrados
                                            // na tentativa atual. Também serve como índice para acessar
                                            // a posição atual na senhaUsuario.

let tentativasErradas = 0                   // Número de tentativas falhas consecutivas (ou totais).
                                            // Quando atinge MAX_TENTATIVAS, o cofre bloqueia.

const MAX_TENTATIVAS = 3                    // Número máximo de tentativas erradas permitidas.
                                            // Após esse limite, o sistema bloqueia permanentemente.

let cofreAberto = false                     // Flag booleana: true se a senha foi acertada e o cofre está aberto.
                                            // Impede novas interações quando aberto.

let bloqueado = false                       // Flag booleana: true se o cofre foi bloqueado por excesso de erros.
                                            // Impede completamente novas tentativas.

let tempoUltimoToque = 0                    // Armazena o tempo (em milissegundos) do último toque registrado.
                                            // Usado para calcular a diferença entre toques e definir curto/longo.

// ========== FUNÇÃO PRINCIPAL DE DETECÇÃO DE TOQUE ==========

function detectarToque() {
  // Verifica se o cofre está bloqueado. Se sim, exibe "BLOQ" na matriz de LEDs e sai.
  if (bloqueado) {
    basic.showString("BLOQ")   // Mostra a palavra "BLOQ" rolando no display.
    return                     // Encerra a função, não processa o toque.
  }

  // Verifica se o cofre já foi aberto. Se sim, simplesmente ignora o toque (não faz nada).
  if (cofreAberto) {
    return
  }

  // Obtém o tempo atual de execução do micro:bit em milissegundos desde o início.
  let agora = input.runningTime()
  // Calcula a diferença entre o tempo atual e o tempo do último toque.
  let diferenca = agora - tempoUltimoToque
  // Atualiza o tempo do último toque com o tempo atual para a próxima comparação.
  tempoUltimoToque = agora

  // Define o tipo de toque como 1 (curto) por padrão.
  let tipoToque = 1
  // Se a diferença de tempo for maior que 500 ms, considera-se um toque longo (2).
  // Isso permite distinguir entre toques rápidos (curtos) e toques sustentados (longos).
  if (diferenca > 500) {
    tipoToque = 2
  }

  // Adiciona o tipo de toque detectado ao array da senha do usuário.
  senhaUsuario.push(tipoToque)
  // Incrementa o contador de toques registrados na tentativa atual.
  indiceSenha = indiceSenha + 1

  // ===== FEEDBACK VISUAL NO DISPLAY =====
  // Acende o LED na posição (2,2) – centro da matriz – para indicar que um toque foi detectado.
  led.plot(2, 2)
  // Aguarda 100 ms para que o LED fique aceso e seja visível.
  basic.pause(100)
  // Apaga o LED central.
  led.unplot(2, 2)
  // Mostra no display o número de toques já registrados na tentativa atual (indiceSenha).
  // Isso dá um feedback claro ao usuário de quantos dígitos já foram inseridos.
  basic.showNumber(indiceSenha)
  // Aguarda 200 ms para que o número seja visualizado.
  basic.pause(200)
  // Limpa a tela (apaga todos os LEDs) para deixar o display pronto para a próxima ação.
  basic.clearScreen()
  // ===== FIM DO FEEDBACK =====

  // Se o número de toques registrados for igual ou superior ao comprimento da senha correta,
  // significa que o usuário terminou de digitar a sequência. Então chamamos a função
  // que irá verificar se a senha está correta.
  if (indiceSenha >= senhaCorreta.length) {
    verificarSenha()   // ATENÇÃO: Esta função não está definida neste código.
                       // Espera-se que ela exista em outra parte do programa.
                       // Ela deve comparar senhaUsuario com senhaCorreta,
                       // reiniciar variáveis se errada, ou abrir o cofre se correta.
  }
}

// ========== OBSERVAÇÕES FINAIS ==========
//
// Para que o programa funcione completamente, é necessário:
// 1. Definir a função 'verificarSenha()' que realiza a comparação e atualiza
//    as variáveis 'cofreAberto', 'tentativasErradas' e 'bloqueado'.
// 2. Associar a função 'detectarToque()' a um evento de toque, por exemplo:
//    input.onPinPressed(TouchPin.P0, () => { detectarToque() })
//    Isso deve ser feito no bloco 'on start' ou em uma função de inicialização.
//
// Exemplo de implementação da função verificarSenha (não incluso, mas sugerido):
//
// function verificarSenha() {
//   // Compara cada elemento da senha digitada com a correta
//   let correta = true
//   for (let i = 0; i < senhaCorreta.length; i++) {
//     if (senhaUsuario[i] != senhaCorreta[i]) {
//       correta = false
//       break
//     }
//   }
//   if (correta) {
//     cofreAberto = true
//     basic.showIcon(IconNames.Yes)   // mostra um ícone de confirmação
//   } else {
//     tentativasErradas += 1
//     if (tentativasErradas >= MAX_TENTATIVAS) {
//       bloqueado = true
//       basic.showString("ERR")       // ou "BLOQ"
//     } else {
//       basic.showIcon(IconNames.No)  // indica erro
//     }
//   }
//   // Reinicia as variáveis para a próxima tentativa
//   senhaUsuario = []
//   indiceSenha = 0
// }
//
// Este código didático exemplifica conceitos como:
// - Uso de arrays para armazenar sequências.
// - Controle de estado com flags (cofreAberto, bloqueado).
// - Leitura de tempo para diferenciar eventos (toque curto/longo).
// - Feedback visual com matriz de LEDs.
// - Limitação de tentativas e bloqueio de segurança.
//
// Divirta-se programando seu cofre espião!

Código 2: Função de Verificação da Senha

/**
 * =====================================================================
 * FUNÇÃO: verificarSenha()
 * =====================================================================
 * 
 * OBJETIVO:
 *   Esta função é responsável por verificar se a senha digitada pelo
 *   usuário (armazenada no vetor 'senhaUsuario') corresponde à senha
 *   correta (armazenada em 'senhaCorreta'). Ela também controla o
 *   número de tentativas e bloqueia o cofre após um número máximo de
 *   erros.
 * 
 * CONTEXTO (Projeto didático – Micro:bit):
 *   - O micro:bit simula um cofre eletrônico.
 *   - O usuário digita uma senha usando os botões ou outro mecanismo
 *     (não mostrado aqui) e os dígitos são armazenados em 'senhaUsuario'.
 *   - A senha correta é pré-definida em 'senhaCorreta'.
 *   - O cofre pode estar aberto ('cofreAberto') ou bloqueado ('bloqueado').
 *   - O número de tentativas erradas é contado em 'tentativasErradas'.
 *   - 'MAX_TENTATIVAS' é uma constante que define o limite de erros.
 * 
 * DEPENDÊNCIAS (variáveis e funções globais):
 *   - senhaCorreta      : vetor (array) com os dígitos da senha correta.
 *   - senhaUsuario      : vetor (array) com os dígitos que o usuário
 *                         digitou até o momento.
 *   - cofreAberto       : booleano (true/false) indicando se o cofre
 *                         está aberto.
 *   - bloqueado         : booleano indicando se o cofre está bloqueado
 *                         (após muitas tentativas erradas).
 *   - tentativasErradas : número inteiro com a contagem de tentativas
 *                         incorretas.
 *   - MAX_TENTATIVAS    : constante (ex.: 3) que define o limite de
 *                         tentativas antes do bloqueio.
 *   - abrirCofre()      : função que executa as ações para abrir o cofre
 *                         (ex.: mostrar ícone de aberto, acionar servo, etc.).
 *   - bloquearCofre()   : função que bloqueia o cofre permanentemente
 *                         (ex.: mostrar ícone de cadeado, desabilitar
 *                         botões, etc.).
 *   - reiniciarDigitacao(): função que limpa a senha digitada e prepara
 *                         o micro:bit para uma nova tentativa.
 * 
 * FLUXO DE EXECUÇÃO:
 *   1. Limpa a tela do micro:bit.
 *   2. Assume que a senha está correta (senhaOK = true).
 *   3. Compara cada dígito da senha digitada com a senha correta.
 *      - Se algum dígito for diferente, marca senhaOK como false.
 *   4. Se a senha estiver correta E o cofre estiver fechado E não
 *      estiver bloqueado, chama 'abrirCofre()'.
 *   5. Caso contrário (senha incorreta):
 *      a) Incrementa o contador de tentativas erradas.
 *      b) Mostra um ícone de "não" (X) no display.
 *      c) Aguarda 500 ms.
 *      d) Se o número de tentativas erradas atingiu o máximo,
 *         chama 'bloquearCofre()'.
 *      e) Senão, mostra quantas tentativas restam (T: X),
 *         aguarda 500 ms e chama 'reiniciarDigitacao()' para
 *         permitir nova tentativa.
 * 
 * =====================================================================
 */

function verificarSenha() {
  // Limpa completamente a tela do micro:bit (todos os LEDs apagados)
  // Isso garante que não haja resíduos visuais de operações anteriores.
  basic.clearScreen()

  // Cria uma variável local 'senhaOK' e a inicializa como verdadeira.
  // Ela será usada para armazenar o resultado da comparação entre a
  // senha digitada e a senha correta.
  let senhaOK = true

  // Laço 'for' que percorre cada posição (índice) do vetor 'senhaCorreta'.
  // A variável 'i' começa em 0 e vai até o comprimento (length) da
  // senha correta - 1 (pois a condição é i < tamanho).
  // Isso garante que compararemos todos os dígitos.
  for (let i = 0; i < senhaCorreta.length; i++) {
    // Verifica se o dígito na posição 'i' da senha digitada pelo
    // usuário é DIFERENTE do dígito correspondente na senha correta.
    // O operador '!=' significa "diferente de".
    if (senhaUsuario[i] != senhaCorreta[i]) {
      // Se encontrou uma diferença, a senha não está correta.
      // Atribuímos 'false' à variável 'senhaOK'.
      senhaOK = false
      // Obs.: poderíamos usar 'break' para sair do laço mais cedo,
      // mas aqui ele continua comparando todos os dígitos (não há
      // problema, apenas um pouco menos eficiente).
    }
  }

  // Agora, após a comparação, decidimos o que fazer.
  // Verificamos três condições:
  //   1. senhaOK é verdadeira (a senha digitada está correta).
  //   2. !cofreAberto (o cofre NÃO está aberto, ou seja, está fechado).
  //   3. !bloqueado (o cofre NÃO está bloqueado).
  // Se todas forem verdadeiras, chamamos a função 'abrirCofre()'.
  if (senhaOK && !cofreAberto && !bloqueado) {
    abrirCofre()
  } else {
    // Caso contrário (senha incorreta OU cofre já aberto OU bloqueado):

    // Incrementa (aumenta em 1) o contador de tentativas erradas.
    // Isso é feito para controlar quantas vezes o usuário errou.
    tentativasErradas = tentativasErradas + 1

    // Exibe no display do micro:bit um ícone de "não" (um X grande).
    // Isso fornece um feedback visual imediato de que a senha está
    // incorreta.
    basic.showIcon(IconNames.No)

    // Faz uma pausa de 500 milissegundos (meio segundo) para que o
    // usuário possa visualizar o ícone antes da próxima ação.
    basic.pause(500)

    // Verifica se o número de tentativas erradas já atingiu ou
    // ultrapassou o limite máximo permitido (MAX_TENTATIVAS).
    if (tentativasErradas >= MAX_TENTATIVAS) {
      // Se atingiu o limite, chama a função que bloqueia o cofre
      // permanentemente.
      bloquearCofre()
    } else {
      // Se ainda não atingiu o limite, o usuário tem mais tentativas.
      // Vamos mostrar quantas tentativas ainda restam.

      // Exibe a string "T:" no display (provavelmente "T" de "Tentativas").
      basic.showString("T:")

      // Exibe o número de tentativas restantes, calculado como
      // MAX_TENTATIVAS - tentativasErradas.
      // Por exemplo, se MAX_TENTATIVAS = 3 e já errou 1 vez, restam 2.
      basic.showNumber(MAX_TENTATIVAS - tentativasErradas)

      // Pausa de 500 ms para que o usuário possa ler quantas tentativas
      // ainda tem.
      basic.pause(500)

      // Chama a função que reinicia o processo de digitação.
      // Geralmente, isso limpa o vetor 'senhaUsuario' e volta ao estado
      // inicial para que o usuário possa digitar novamente.
      reiniciarDigitacao()
    }
  }
}

Código 3: Funções de Ação (Saídas)

/*
 * ========================================================================
 * PROJETO: COFRE DIGITAL PARA MICRO:BIT
 * ========================================================================
 * Este código implementa as funções principais para um sistema de cofre
 * eletrônico controlado pelo micro:bit. Ele faz parte de um projeto
 * didático para ensinar programação, lógica e interação com hardware.
 *
 * FUNÇÕES:
 *   - abrirCofre(): executa uma sequência visual e sonora para indicar
 *     que o cofre foi aberto com sucesso.
 *   - bloquearCofre(): executa uma sequência de alerta para indicar
 *     que o cofre foi bloqueado.
 *   - reiniciarDigitacao(): prepara as variáveis para uma nova tentativa
 *     de digitação da senha e exibe uma mensagem na matriz de LEDs.
 *
 * VARIÁVEIS GLOBAIS (definidas em outro local do programa):
 *   - cofreAberto: booleano que indica se o cofre está aberto.
 *   - bloqueado: booleano que indica se o cofre está bloqueado.
 *   - senhaUsuario: array que armazena os dígitos digitados pelo usuário.
 *   - indiceSenha: número que controla a posição atual no array senhaUsuario.
 * ========================================================================
 */

/**
 * Função chamada quando a senha correta é digitada.
 * Ela fornece feedback visual (pisca a tela) e sonoro (melodia)
 * para confirmar a abertura do cofre.
 */
function abrirCofre() {
  // Altera a variável global que indica o estado do cofre para "aberto"
  cofreAberto = true
  // Apaga todos os LEDs da matriz para iniciar com a tela limpa
  basic.clearScreen()

  // Loop que repete 5 vezes para criar um efeito de "pisca-pisca"
  for (let i = 0; i < 5; i++) {
    // Cria uma imagem vazia (todos os pontos "." representam LEDs apagados)
    // A string contém 25 pontos separados por espaços, formando uma matriz 5x5
    let coracao = images.createImage(`. . . . . . . . . . . . . . . . . . . . . . . . .`)
    // Exibe a imagem vazia na matriz de LEDs com atraso 0 (exibição imediata)
    coracao.showImage(0)
    // Mantém a imagem visível por 200 milissegundos
    basic.pause(200)
    // Limpa a tela (apaga todos os LEDs)
    basic.clearScreen()
    // Pausa por mais 200 ms para completar o ciclo do pisca-pisca
    basic.pause(200)
  }

  // Exibe a mensagem "ACESSO OK" rolando caracteres na matriz de LEDs
  basic.showString("ACESSO OK")
  // Dá um tempo para o usuário ler a mensagem
  basic.pause(500)

  // Reproduz uma pequena melodia de confirmação (3 repetições)
  for (let i = 0; i < 3; i++) {
    // Toca a nota Lá (440 Hz) por 200 ms
    music.playTone(440, 200)
    // Pausa entre as notas (100 ms)
    basic.pause(100)
    // Toca a nota Dó sustenido (554 Hz) por 200 ms
    music.playTone(554, 200)
    // Pausa de 100 ms antes da próxima repetição
    basic.pause(100)
  }
}

/**
 * Função chamada quando o cofre é bloqueado (por exemplo, após
 * várias tentativas de senha incorreta). Ela gera um alerta
 * visual intermitente e um som pulsante para indicar o bloqueio.
 */
function bloquearCofre() {
  // Marca a variável global de bloqueio como verdadeira
  bloqueado = true
  // Limpa a tela para iniciar o efeito
  basic.clearScreen()

  // Loop que executa 10 vezes para um efeito de alerta
  for (let i = 0; i < 10; i++) {
    // Verifica se o valor de i é par (resto da divisão por 2 == 0)
    if (i % 2 == 0) {
      // Se for par, cria e exibe uma imagem vazia (todos os LEDs apagados)
      let x = images.createImage(`. . . . . . . . . . . . . . . . . . . . . . . . .`)
      x.showImage(0)
    } else {
      // Se for ímpar, simplesmente limpa a tela (apaga todos os LEDs)
      basic.clearScreen()
    }
    // Toca um tom agudo (800 Hz) por 100 ms
    music.playTone(800, 100)
    basic.pause(100)
    // Toca um tom mais grave (600 Hz) por 100 ms
    music.playTone(600, 100)
    basic.pause(100)
  }
  // Após o loop, exibe a mensagem "BLOQUEADO" na matriz
  basic.showString("BLOQUEADO")
}

/**
 * Função que reinicia o processo de digitação da senha.
 * Ela zera as variáveis de controle e exibe uma mensagem
 * convidando o usuário a digitar novamente.
 */
function reiniciarDigitacao() {
  // Limpa o array que armazena os dígitos da senha digitada
  senhaUsuario = []
  // Reinicia o índice que indica quantos dígitos já foram digitados
  indiceSenha = 0
  // Limpa a tela
  basic.clearScreen()
  // Exibe a mensagem "DIGITE" para orientar o usuário
  basic.showString("DIGITE")
}

Código 4: Programa Principal e Interface

// =====================================================================
// PROJETO: Cofre Digital com Micro:bit
// Descrição: Este programa implementa um sistema de cofre eletrônico
// que utiliza os botões A e B, além do logotipo (logo) touch do micro:bit
// para entrada de senha e controle de acesso.
// 
// O código pressupõe que existem variáveis e funções globais definidas
// em outras partes do programa (como senhaCorreta, indiceSenha, bloqueado,
// reiniciarDigitacao(), verificarSenha() e detectarToque()).
// 
// Abaixo, cada linha é comentada detalhadamente para fins didáticos.
// =====================================================================

// Função que inicializa o cofre, exibindo uma mensagem de boas-vindas
// e preparando o sistema para receber a senha.
function iniciarCofre() {
  // Limpa completamente a matriz de LEDs (tela) do micro:bit.
  basic.clearScreen()
  
  // Exibe o texto "COFRE" rolando na tela (um caractere por vez).
  basic.showString("COFRE")
  
  // Pausa a execução por 500 milissegundos (meio segundo) para dar
  // tempo de o usuário ler a mensagem antes de prosseguir.
  basic.pause(500)
  
  // Chama a função que reinicia o processo de digitação da senha,
  // zerando o índice atual e limpando tentativas anteriores.
  reiniciarDigitacao()
}

// Registra um manipulador de evento para quando o botão A for pressionado.
// O botão A é usado para confirmar a senha ou para indicar quantos
// caracteres faltam para completar a senha (dependendo do estado).
input.onButtonPressed(Button.A, function () {
  // Verifica se o índice atual da senha já atingiu ou ultrapassou
  // o comprimento da senha correta (ou seja, se todos os dígitos
  // já foram inseridos).
  if (indiceSenha >= senhaCorreta.length) {
    // Se a senha está completa, chama a função que verifica se a
    // combinação digitada confere com a senha armazenada.
    verificarSenha()
  } else {
    // Caso contrário (ainda faltam dígitos), exibe uma mensagem
    // indicando quantos caracteres ainda precisam ser digitados.
    // Mostra a letra "F:" (de "faltam") na tela.
    basic.showString("F:")
    // Em seguida, exibe o número de caracteres restantes, calculado
    // como a diferença entre o comprimento total da senha e o
    // índice atual (que representa quantos já foram inseridos).
    basic.showNumber(senhaCorreta.length - indiceSenha)
    // Pausa por 500 ms para que o usuário possa visualizar a informação.
    basic.pause(500)
    // Reinicia o processo de digitação (por exemplo, para permitir
    // uma nova tentativa após o aviso).
    reiniciarDigitacao()
  }
})

// Registra um manipulador para o botão B, que serve como botão de
// reset (reinicialização da senha) apenas se o cofre não estiver
// bloqueado (ou seja, se ainda não houve falha crítica).
input.onButtonPressed(Button.B, function () {
  // Verifica se a variável global "bloqueado" é falsa (cofre não
  // bloqueado). Se estiver bloqueado, o botão B não terá efeito,
  // impedindo tentativas de reset em estado de bloqueio.
  if (!bloqueado) {
    // Reinicia a digitação (limpa a entrada atual).
    reiniciarDigitacao()
    // Exibe a mensagem "RESET" na tela para confirmar a ação.
    basic.showString("RESET")
    // Pausa por 500 ms para o usuário ver a mensagem.
    basic.pause(500)
    // Chama novamente reiniciarDigitacao() para garantir que o
    // sistema fique pronto para nova entrada (redundância).
    reiniciarDigitacao()
  }
})

// Registra um manipulador de evento para quando o logotipo (logo)
// do micro:bit for tocado (TouchButtonEvent.Pressed). Esse evento
// provavelmente é usado para inserir um dígito da senha, um por vez.
input.onLogoEvent(TouchButtonEvent.Pressed, function () {
  // Chama a função que detecta o toque no logo e processa a entrada
  // do usuário, adicionando o caractere correspondente à senha atual.
  detectarToque()
})

// Chama a função iniciarCofre() para dar início ao programa assim
// que o micro:bit for ligado ou reiniciado. Esta é a linha que
// realmente coloca o sistema em funcionamento.
iniciarCofre()
⏱️ Detalhamento Minuto a Minuto (50 min)
0-5 min
Apresentação do Desafio - Missão: Cofre Robô 🕵️ — "Vocês vão construir um COFRE ROBÔ. A missão de vocês: criar um sistema de segurança que só abre se o usuário acertar a sequência secreta de toques! Quem errar muitas vezes... BLOQUEIO!" Requisitos da Missão: A senha é uma sequência de toques (curto/longo); Usar o logotipo da micro:bit como sensor; 3 tentativas erradas = bloqueio; Feedback visual e sonoro; Botão A para confirmar, B para reiniciar.
5-10 min
Planejamento - Diagrama de Blocos 📐 — Cada dupla desenha em uma cartolina: ENTRADA (Logotipo/toque, Botão A/confirmar, Botão B/reset) → PROCESSAMENTO (Verificar Senha com AND/OR) → SAÍDA (Matriz LEDs, Som).
10-20 min
Construção do Código - Parte 1 (Estrutura) 💻 — Passo a passo: 1. Criar variáveis: senhaCorreta, senhaUsuario, tentativasErradas. 2. Criar lista com a senha: [1, 1, 0, 1] (1=curto, 2=longo, 0=pausa). 3. Criar função detectarToque() que lê o toque do logotipo. 4. Criar função reiniciarDigitacao(). Teste: "Toque no logotipo e veja se o LED pisca!"
20-30 min
Construção do Código - Parte 2 (Verificação) 🔍 — Passo a passo: 1. Criar função verificarSenha() que compara as listas. 2. Usar for para percorrer todos os elementos. 3. Usar AND para verificar se todos são iguais. 4. Incrementar tentativasErradas se falhar. Desafio: "O que acontece se a lista tem 3 elementos? E se tem 5?"
30-40 min
Construção do Código - Parte 3 (Feedback) 🎵 — Passo a passo: 1. Criar função abrirCofre() com animação de coração. 2. Criar função bloquearCofre() com alarme. 3. Adicionar sons usando music.playTone(). 4. Conectar os botões A (confirmar) e B (reiniciar). Teste: "Digite a senha correta [toque, toque, pausa, toque]!"
40-45 min
Teste e Depuração entre Duplas 🐛 — Uma dupla testa o cofre da outra. Ficha de teste: A senha correta funciona? A senha errada aciona o alarme? O cofre bloqueia após 3 tentativas? O botão A confirma e o B reinicia? Anotar bugs encontrados.
45-50 min
Correção e Apresentação Final 🎉 — Duplas corrigem os bugs apontados. Demonstração rápida: cada dupla mostra seu cofre funcionando.
♿ Orientações para Adaptações e Inclusão
  • TEA: Usar um botão grande e colorido para o sensor de toque. Programar apenas uma condição de cada vez. Checklist visual: [ ] Sensor funciona, [ ] Senha capturada, [ ] Comparação ok.
  • TDAH: Checklist de etapas em papel: [ ] Sensor funciona, [ ] Função capturarSequência ok, [ ] Comparação com AND ok, [ ] Alarme ok. Dividir os 50 min em 5 blocos de 10 min com sinal sonoro.
  • Deficiência auditiva: Alarme deve ser visual (LED piscante) além do som. Música de acesso = sequência de luzes coloridas.
  • Altas habilidades: Adicionar "modo de segurança": se errar 3 vezes, o robô se bloqueia por 10 segundos. Integrar sensor de luz real (LDR) para condição extra. Construir cofre físico com servo motor.
📊 Critérios Operacionais de Avaliação
Critério Evidência Pontuação
Planejamento Diagrama de blocos completo 0-3
Codificação Todas as funções implementadas 0-3
Teste Encontrou e corrigiu bugs 0-2
Apresentação Demonstrou funcionamento 0-2

Total: 10 pontos

Frase do dia: "Cofre robô é como segurança digital: se errar a senha, o sistema te bloqueia. Cuidado com os toques!"

🎯 Objetivos Operacionais
  • Identificar erros comuns em funções (esquecer de chamar, parâmetros errados, nome errado).
  • Praticar leitura de código e correção colaborativa.
  • Desenvolver a habilidade de "debugar" (caçar bugs) de forma sistemática.
  • Aplicar os conceitos de abstração e generalização na resolução de problemas.
  • RCP-PR (EF05CO07): Testar e depurar programas.
📚 Conteúdo Programático

Erros comuns em funções — Técnicas de depuração — Leitura crítica de código — Correção colaborativa — Conceitos do Pensamento Computacional: abstração, generalização — RCP-PR (EF05CO07): Testar e depurar programas.

📋 Habilidades BNCC e RCP-PR

BNCC (Língua Portuguesa): EF05LP10 - Relatar experimentos (descrever o bug e a solução).
BNCC (Matemática): EF05MA10 - Regularidades (bugs típicos se repetem).
RCP-pr (Computação): (EF05CO07) Testar e depurar programas. Depuração - Técnicas de teste e correção.

🧰 Materiais
Códigos com bugs impressos (3 versões diferentes) Computadores com MakeCode para testar correções Cartolina para "Relatório do Caçador" Adesivos de barata (bug) para premiação "Lupas" de papel para apontar erros Cartazes com "Bugs Mais Procurados"
🔧 Explicação Detalhada da Montagem do Hardware

Configuração: Conecte a micro:bit ao computador via USB. Acesse makecode.microbit.org - vamos testar e corrigir códigos. Teremos códigos com bugs impressos que serão analisados antes de testar.

Modo Detetive: Hoje não vamos criar código do zero. Vamos ser DETETIVES DE CÓDIGO. Cada bug encontrado = uma barata capturada. Quem pegar mais bugs vira "EXTERMINADOR-MOR".

🐛 Códigos com Bugs (Material Impresso)

Bug 1: Esqueceu de chamar a função (Falta de Parênteses) 🐛

function piscar() {
  led.plot(2, 2)
  basic.pause(200)
  led.unplot(2, 2)
  basic.pause(200)
}

input.onButtonPressed(Button.A, function () {
  piscar // ❌ BUG 1: faltam os parênteses ()
  // O certo seria: piscar()
})

Bug 2: Parâmetro Errado (Tipo Incorreto) 🐛

function mostrarNumero(n: number) {
  basic.showNumber(n)
}

input.onButtonPressed(Button.A, function () {
  mostrarNumero("5") // ❌ BUG 2: passou texto, mas espera número
  // O certo seria: mostrarNumero(5)
})

Bug 3: Nome da Função Errado 🐛

function animarCoração() {
  let coracao = images.createImage(`. . . . . . . . . . . . . . . . . . . . . . . . .`)
  coracao.showImage(0)
}

input.onButtonPressed(Button.A, function () {
  animarCoracao() // ❌ BUG 3: nome errado (coracao vs coração)
  // O certo seria: animarCoração()
})

Bug 4: Loop Infinito (esqueceu de incrementar) 🐛

function piscarVariasVezes(n: number) {
  let i = 0
  while (i < n) {
    led.plot(2, 2)
    basic.pause(100)
    led.unplot(2, 2)
    basic.pause(100)
    // ❌ BUG 4: esqueceu de incrementar i
    // O certo seria: i = i + 1
  }
}

Bug 5: Condicional com Operador Errado 🐛

let numeroSecreto = 42

function adivinhar(numero: number) {
  // ❌ BUG 5: usando OR (||) em vez de AND (&&)
  if (numero > 40 || numero < 50) {
    basic.showString("QUASE!")
  } else {
    basic.showString("ERRADO")
  }
  // O certo seria: if (numero > 40 && numero < 50)
}
⏱️ Detalhamento Minuto a Minuto (50 min)
0-5 min
Abertura - O Inseto Bug Aparece! 🪳 — "Hoje vamos caçar o Inseto Bug! Ele adora se esconder no código. Cada erro que vocês encontrarem, vocês ganham um adesivo de barata. Quem pegar mais bugs vira EXTERMINADOR DE BUGS!" Dinâmica: Mostrar um código com bug óbvio no projetor e pedir que identifiquem.
5-15 min
Caça ao Bug Impresso 🔍 — Cada dupla recebe uma folha com 3 códigos contendo bugs (Versões 1, 2 e 3). Tarefas: 1. Circular o bug com a "lupa" de papel. 2. Escrever a correção ao lado. 3. Testar mentalmente (ou no computador). Tipos de Bugs: "Bug Zé Esquecido" (faltou parênteses), "Bug Parâmetro Trocado" (tipo errado), "Bug Nome Diferente" (nome incorreto).
15-25 min
Codificação - Injetando Bugs de Propósito 💉 — Cada dupla escreve um código curto (com 2-3 funções) que funciona. Depois, intencionalmente, insere 2 bugs. Trocar o código com outra dupla. A dupla adversária deve encontrar os dois bugs e corrigir. Regra: Não podem inserir bugs "idiotas". Devem ser realistas e comuns.
25-35 min
Defenda Seu Bug (Debate) 🗣️ — Professor sorteia um bug de uma dupla e pede que a dupla que o inseriu explique: "Por que esse bug é fácil ou difícil de encontrar?" A dupla que encontrou explica como descobriu. Prêmio: Dupla que criou o bug mais "enganador" (mas justo) e a que encontrou mais rápido.
35-45 min
Laboratório de Depuração no MakeCode 🧪 — Professor projeta um código bugado na tela (Versão 4 ou 5). Alunos devem encontrar e corrigir em tempo real. Exemplo: for (let i = 0; i < 3; i++); { // ❌ BUG - ponto e vírgula errado! }
45-50 min
Relatório do Caçador 📝 — Cada aluno escreve: "O bug mais estranho que encontrei hoje foi ______." "Aprendi que para evitar esquecer de chamar funções, devo ______." "Se eu fosse ensinar um colega a depurar, eu diria ______."
♿ Orientações para Adaptações e Inclusão
  • TEA: Lista de verificação de bugs comuns: [ ] Parênteses? [ ] Nome igual? [ ] Parâmetros corretos? [ ] Função chamada? "Detector de bugs" físico: lupa de brinquedo para apontar o erro.
  • TDAH: Cada bug tem um nome engraçado: "Bug Zé Esquecido", "Bug Parâmetro Trocado". Dividir a atividade em minidesafios de 5 minutos com sinal sonoro.
  • Deficiência visual: Códigos em braille ou fonte ampliada. Feedback sonoro para cada bug encontrado.
  • Altas habilidades: Criar bug intencional com recursão infinita. Escrever "guia de depuração" para alunos mais novos.
📊 Critérios Operacionais de Avaliação
Critério Evidência Pontuação
Identificação de bugs Encontrou bugs em códigos impressos 0-3
Correção de bugs Corrigiu corretamente os bugs 0-3
Criação de bugs Inseriu 2 bugs realistas 0-2
Relatório Completou as 3 seções do relatório 0-2

Total: 10 pontos

Frase do dia: "Bug é o professor disfarçado de erro. Depurar é aprender com o robô onde você errou!"

🎯 Objetivos Operacionais
  • Avaliar de forma lúdica e prática as habilidades do bimestre.
  • Permitir que os alunos demonstrem seu conhecimento em diferentes formatos.
  • Promover a autoavaliação e a reflexão sobre o aprendizado.
  • Consolidar todos os conceitos em um desafio integrado na micro:bit.
📚 Conteúdo Programático

Avaliação prática de todas as habilidades do bimestre — Estações de aprendizado com micro:bit — Desafios integrados: funções, parâmetros, aninhamento, operadores lógicos, sensores — Autoavaliação e reflexão.

📋 Habilidades BNCC e RCP-PR

Todas as habilidades do 1º bimestre: EF05MA01, EF05MA02, EF05MA10, EF05MA18, EF05MA23; EF05CI01, EF05CI02; EF05LP10, EF05LP17; Competência Geral 5 - Pensamento computacional; RCP-pr: Programação de Sistemas, Pensamento Algébrico.

🧰 Materiais
Computadores com MakeCode BBC micro:bit para cada dupla 5 estações montadas pela sala Cartões de instruções para cada estação Carimbos ou adesivos para cada estação "Passaporte da Função" impresso para cada aluno Cronômetro visível Certificados
🔧 Explicação Detalhada da Montagem do Hardware

Configuração Geral: As 5 estações devem estar pré-configuradas com computadores e micro:bits. Cada estação deve ter um cartão com instruções claras. As micro:bits devem estar conectadas e prontas para uso. Um cronômetro visível para controle do tempo.

Estações Físicas: Estação 1: Função Construtora; Estação 2: Mestre dos Parâmetros; Estação 3: Detetive Lógico; Estação 4: Mestre do Sensor; Estação 5: Caçador de Bugs.

🎯 Desafios das 5 Estações

Estação 1: "Função Construtora" 🛠️

Enunciado: "Crie uma função chamada festejar() que faz a micro:bit mostrar uma animação de festa (coração pulsante) ao pressionar o botão A."

// ============================================================
// PROJETO DIDÁTICO PARA MICRO:BIT - MAKECODE (BLOCO JAVASCRIPT)
// ============================================================
// Este programa demonstra o uso de funções, laços de repetição,
// exibição de imagens, pausas e eventos de botão.
// Ao pressionar o botão A, a função "festejar()" é executada,
// fazendo a tela piscar (mostrando uma imagem vazia) três vezes.
// O efeito visual é um "pisca-pisca" que pode ser usado para
// comemorar ou sinalizar algo.
// ============================================================

/**
 * Função que executa uma sequência de piscadas na tela do micro:bit.
 * Ela não recebe parâmetros e não retorna valores.
 * O efeito é repetido 3 vezes (laço for).
 */
function festejar() {
  // Laço de repetição: executa o bloco interno 3 vezes.
  // i começa em 0, vai até 2 (i < 3), incrementando 1 a cada iteração.
  for (let i = 0; i < 3; i++) {
    // Cria uma imagem de 5x5 pixels (matriz de LEDs).
    // A string com pontos (.) indica que todos os LEDs estão apagados.
    // ATENÇÃO: Esta é uma imagem VAZIA. Se quiséssemos um coração,
    // deveríamos usar uma matriz com # (aceso) e . (apagado)
    // formando o desenho. Por exemplo:
    // . # # # .
    // # # # # #
    // # # # # #
    // . # # # .
    // . . # . .
    // Mas aqui a imagem está totalmente apagada, então o efeito
    // será apenas "tela apagada" seguida de "tela limpa".
    let coracao = images.createImage(`
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
`);
    // Exibe a imagem criada na matriz de LEDs do micro:bit.
    // O parâmetro 0 indica que a imagem deve ser exibida imediatamente
    // (sem animação de deslocamento, pois é uma imagem única).
    coracao.showImage(0);

    // Pausa a execução do programa por 200 milissegundos (0,2 segundos)
    // para que a imagem fique visível na tela.
    basic.pause(200);

    // Limpa completamente a tela do micro:bit, apagando todos os LEDs.
    // Isso faz a tela ficar toda apagada.
    basic.clearScreen();

    // Pausa novamente por 200 ms para que o "apagado" seja percebido.
    basic.pause(200);
    // Ao final do laço, a próxima iteração recria e exibe a imagem vazia,
    // causando um efeito de pisca-pisca (tela apagada -> tela limpa -> ...).
  }
  // Após as 3 repetições, a função termina e o controle retorna
  // para onde foi chamada.
}

// ============================================================
// EVENTO DE BOTÃO - AÇÃO QUANDO O BOTÃO A FOR PRESSIONADO
// ============================================================
// O micro:bit possui dois botões: A e B.
// Quando o botão A for pressionado (evento "onButtonPressed"),
// a função anônima (callback) será executada.
// Neste caso, chamamos a função "festejar()" que criamos acima.
// Isso faz com que, ao pressionar o botão A, a tela pisque 3 vezes.
// ============================================================
input.onButtonPressed(Button.A, function () {
  // Chama a função festejar, que contém o efeito de piscar.
  festejar();
});

// ============================================================
// FIM DO PROGRAMA
// ============================================================
// Possíveis melhorias (sem alterar o código original):
// - Trocar a imagem vazia por um coração (substituir os pontos por #).
// - Adicionar efeitos sonoros (usando pins ou música).
// - Fazer o botão B tocar uma melodia ou mostrar outro símbolo.
// - Aumentar o número de repetições ou variar a duração das pausas.
// ============================================================

Critério: A função existe, é chamada, e executa a animação. Carimbo: 🛠️ "Função Construtora"

Estação 2: "Mestre dos Parâmetros" 📊

Enunciado: "Crie uma função piscar(n) que pisca o LED central n vezes. Ao pressionar o botão A, pisca 3 vezes. Ao pressionar o botão B, pisca 5 vezes."

/*
 * ============================================================================
 * PROJETO DIDÁTICO – MICRO:BIT
 * ============================================================================
 * Este programa faz o LED central (coordenadas 2,2) piscar um número
 * determinado de vezes quando os botões A ou B são pressionados.
 *
 * - Botão A → pisca 3 vezes.
 * - Botão B → pisca 5 vezes.
 *
 * O objetivo é ensinar conceitos básicos de:
 *   • Funções (com parâmetros)
 *   • Laços de repetição (for)
 *   • Entrada digital (botões)
 *   • Saída visual (matriz de LEDs)
 *   • Temporização (pausas)
 *
 * Todo o código foi mantido exatamente como fornecido, acrescentando-se
 * apenas comentários extremamente detalhados para fins educacionais.
 * ============================================================================
 */

/**
 * Função que faz o LED central (coluna 2, linha 2) piscar 'n' vezes.
 * @param n Número de piscadas desejadas (deve ser um inteiro positivo)
 */
function piscar(n: number) {
  // Laço 'for' – repete o bloco interno exatamente 'n' vezes.
  // A variável 'i' é o contador: inicia em 0, incrementa de 1 em 1,
  // e executa enquanto i < n.
  for (let i = 0; i < n; i++) {

    // Acende o LED na posição (2, 2) – que é exatamente o centro da matriz
    // 5x5 do micro:bit (coordenadas variam de 0 a 4).
    led.plot(2, 2)

    // Pausa a execução por 200 milissegundos (0,2 segundos).
    // O LED permanece aceso durante esse intervalo, produzindo o efeito
    // visual de "ligado".
    basic.pause(200)

    // Apaga o LED na posição (2,2) – desliga o ponto central.
    led.unplot(2, 2)

    // Nova pausa de 200 ms com o LED apagado.
    // Isso completa um ciclo completo de piscada (liga + desliga),
    // totalizando 400 ms por piscada.
    basic.pause(200)

    // Ao final da iteração, o contador 'i' é incrementado e o laço
    // repete até que i atinja o valor de 'n'.
  }
  // Quando o laço termina, a função encerra e o controle retorna
  // para o ponto onde foi chamada.
}

// ============================================================================
// EVENTOS DE BOTÃO – O micro:bit fica "ouvindo" as pressões dos botões.
// ============================================================================

/**
 * Configura uma reação para quando o botão A for pressionado.
 * A função anônima (callback) é executada automaticamente pelo sistema
 * sempre que o botão A for pressionado.
 */
input.onButtonPressed(Button.A, function () {
  // Chama a função 'piscar' passando o argumento 3.
  // Portanto, o LED central piscará exatamente 3 vezes.
  piscar(3)
})

/**
 * Configura uma reação para quando o botão B for pressionado.
 * Similar ao botão A, mas com o argumento 5, resultando em 5 piscadas.
 */
input.onButtonPressed(Button.B, function () {
  piscar(5)
})

// ============================================================================
// FIM DO PROGRAMA – Após essas configurações, o micro:bit entra em um loop
// infinito interno (gerenciado pelo sistema) aguardando eventos.
// ============================================================================

Critério: A função funciona com diferentes valores de parâmetro. Carimbo: 📊 "Mestre dos Parâmetros"

Estação 3: "Detetive Lógico" 🔍

Enunciado: "Use os botões A e B como entradas. O LED central deve acender APENAS quando AMBOS os botões estiverem pressionados (AND). O LED (0,0) deve acender quando PELO MENOS UM botão estiver pressionado (OR)."

// ============================================================
// PROGRAMA: Alternância de LEDs com os botões A e B
// ============================================================
// Este programa foi desenvolvido para o micro:bit e utiliza
// a plataforma MakeCode (linguagem JavaScript/TypeScript).
//
// Objetivo: Demonstrar o uso de variáveis booleanas, eventos
// de botão e controle da matriz de LEDs 5x5.
//
// Funcionamento:
// - Duas variáveis (estadoA e estadoB) armazenam valores lógicos
//   (true/false) que representam se cada botão foi pressionado
//   um número ímpar de vezes (alternando a cada pressão).
// - Ao pressionar o botão A, o estadoA é invertido.
// - Ao pressionar o botão B, o estadoB é invertido.
// - Após cada inversão, a função atualizarLEDs() é chamada para
//   redesenhar a tela conforme as regras:
//     1. Se ambos os estados forem verdadeiros (true), acende
//        o LED central (coordenada 2,2) e também o LED em (0,0).
//     2. Se apenas um dos estados for verdadeiro, acende apenas
//        o LED em (0,0).
//     3. Se nenhum for verdadeiro, todos os LEDs ficam apagados.
// ============================================================

// Declaração das variáveis globais que guardam o estado de cada botão.
// Inicialmente, ambas são falsas (nenhum botão foi pressionado ainda).
let estadoA = false  // Estado do botão A: false = desligado, true = ligado
let estadoB = false  // Estado do botão B: false = desligado, true = ligado

// ------------------------------------------------------------
// Evento disparado quando o botão A é pressionado.
// A função anônima (callback) é executada automaticamente pelo
// sistema sempre que o botão A for pressionado.
// ------------------------------------------------------------
input.onButtonPressed(Button.A, function () {
  // Inverte o valor booleano de estadoA:
  // - Se era false, passa a true.
  // - Se era true, passa a false.
  // Isso cria um efeito de "alternância" (toggle) a cada pressionamento.
  estadoA = !estadoA

  // Após alterar o estado, atualiza a matriz de LEDs para refletir
  // a nova combinação de estados.
  atualizarLEDs()
})

// ------------------------------------------------------------
// Evento disparado quando o botão B é pressionado.
// Funciona de maneira análoga ao botão A, mas atua sobre estadoB.
// ------------------------------------------------------------
input.onButtonPressed(Button.B, function () {
  // Inverte o estado do botão B.
  estadoB = !estadoB

  // Atualiza a tela de LEDs com os novos estados.
  atualizarLEDs()
})

// ------------------------------------------------------------
// Função que atualiza a matriz de LEDs com base nos valores
// atuais de estadoA e estadoB.
// Esta função é chamada sempre que um botão é pressionado.
// ------------------------------------------------------------
function atualizarLEDs() {
  // Apaga todos os LEDs da matriz 5x5. Isso garante que a tela
  // comece completamente limpa antes de desenhar os novos pontos.
  basic.clearScreen()

  // Estrutura condicional: verifica se AMBOS os estados são verdadeiros.
  // O operador && (E lógico) retorna true apenas se as duas condições
  // forem verdadeiras.
  if (estadoA && estadoB) {
    // Acende o LED localizado no centro da matriz.
    // A matriz de LED do micro:bit possui 5 colunas (x: 0 a 4) e
    // 5 linhas (y: 0 a 4). O centro é exatamente a coordenada (2,2).
    // A função led.plot(x, y) acende o LED na posição especificada.
    led.plot(2, 2)
  }

  // Estrutura condicional: verifica se PELO MENOS UM dos estados é verdadeiro.
  // O operador || (OU lógico) retorna true se uma ou ambas as condições
  // forem verdadeiras.
  if (estadoA || estadoB) {
    // Acende o LED no canto superior esquerdo da matriz.
    // Coordenada (0,0) corresponde ao primeiro LED da primeira coluna
    // e primeira linha.
    led.plot(0, 0)
  }

  // Obs.: Se ambos os estados forem verdadeiros, as duas condições
  // são satisfeitas, portanto ambos os LEDs (central e canto) acendem.
  // Se apenas um for verdadeiro, apenas o LED do canto acende.
  // Se nenhum for verdadeiro, a tela permanece totalmente apagada.
}
// ============================================================
// FIM DO PROGRAMA
// ============================================================

Critério: Os LEDs acendem conforme a lógica AND/OR. Carimbo: 🔍 "Detetive Lógico"

Estação 4: "Mestre do Sensor" 🎵

Enunciado: "Programe a micro:bit para tocar uma música quando o logotipo for tocado. A música deve ter pelo menos 3 notas diferentes."

/*
 * ============================================================================
 * PROGRAMA: Melodia no micro:bit ao tocar o logotipo
 * ============================================================================
 * 
 * Objetivo didático:
 *   - Demonstrar o uso de funções (organização do código).
 *   - Demonstrar eventos de entrada (toque no logotipo).
 *   - Demonstrar saída de áudio (geração de tons) e temporização.
 * 
 * Funcionamento:
 *   Ao pressionar o logotipo (área dourada na placa), o micro:bit executa
 *   a função 'tocarMusica', que reproduz uma pequena melodia com 4 notas:
 *   Dó (262 Hz), Mi (330 Hz), Sol (392 Hz) e Dó agudo (523 Hz).
 * 
 * Observações:
 *   - A variável 'nota' cria uma imagem vazia apenas para ilustrar o uso
 *     da API de display, mas não afeta a melodia.
 *   - O projeto é compatível com o ambiente MakeCode (JavaScript).
 * ============================================================================
 */

// --------------------------------------------
// DEFINIÇÃO DA FUNÇÃO QUE TOCA A MELODIA
// --------------------------------------------

function tocarMusica() {
  // 1. Cria uma imagem de 5x5 pixels totalmente apagada (todos os pontos ' . ')
  //    A string entre crases define uma matriz 5x5; cada '.' representa um LED apagado.
  //    Esta variável não é essencial para a melodia, mas serve como exemplo
  //    de como criar e manipular imagens no micro:bit.
  let nota = images.createImage(`. . . . . . . . . . . . . . . . . . . . . . . . .`)

  // 2. Exibe a imagem criada no display de LEDs por 0 milissegundos.
  //    Como o tempo é 0, a imagem aparece e desaparece instantaneamente,
  //    ou seja, não é visível na prática. Isso mostra que a função showImage
  //    aceita um valor de duração (em ms) e, neste caso, não causa efeito visual.
  nota.showImage(0)

  // 3. Primeira nota: Dó central (frequência 262 Hz) com duração de 200 ms.
  //    A frequência está em Hertz (ciclos por segundo) e a duração em milissegundos.
  music.playTone(262, 200)

  // 4. Pausa de 100 ms entre as notas para criar um pequeno silêncio,
  //    dando um efeito mais musical (separação entre os sons).
  basic.pause(100)

  // 5. Segunda nota: Mi (frequência 330 Hz) por 200 ms.
  music.playTone(330, 200)

  // 6. Pausa de 100 ms.
  basic.pause(100)

  // 7. Terceira nota: Sol (frequência 392 Hz) por 200 ms.
  music.playTone(392, 200)

  // 8. Pausa de 100 ms.
  basic.pause(100)

  // 9. Quarta e última nota: Dó agudo (frequência 523 Hz) com duração de 300 ms,
  //    um pouco mais longa para dar um final mais enfático à melodia.
  music.playTone(523, 300)
}

// --------------------------------------------
// CONFIGURAÇÃO DO EVENTO DE TOQUE NO LOGOTIPO
// --------------------------------------------

// 10. A função 'onLogoEvent' registra um manipulador para eventos no logotipo
//     (a área dourada na face superior da placa, que é um sensor capacitivo).
//     O parâmetro 'TouchButtonEvent.Pressed' indica que o evento será disparado
//     quando o logotipo for pressionado (toque com o dedo).
input.onLogoEvent(TouchButtonEvent.Pressed, function () {
  // 11. Quando o evento ocorrer, a função anônima (callback) será executada.
  //     Ela simplesmente chama a função 'tocarMusica' definida acima,
  //     fazendo com que a melodia seja reproduzida a cada toque no logotipo.
  tocarMusica()
})

// ============================================================================
// FIM DO PROGRAMA
// ============================================================================

Critério: A micro:bit reage ao toque com som e animação. Carimbo: 🎵 "Mestre do Sensor"

Estação 5: "Caçador de Bugs" 🐛

Enunciado: "Encontre os 2 bugs no código abaixo. Corrija-os para que a função saudacao() funcione corretamente."

/**
 * =====================================================================
 * PROJETO DIDÁTICO: MICRO:BIT COM BUGS INTENCIONAIS
 * =====================================================================
 *
 * Este código foi especialmente preparado para demonstrar dois erros
 * comuns na programação do micro:bit via MakeCode (JavaScript/TypeScript).
 * 
 * OBJETIVO:
 *   - Mostrar, na prática, como erros de sintaxe e de lógica podem
 *     impedir o funcionamento do programa.
 *   - Servir como material de apoio para aulas de introdução à
 *     programação em dispositivos físicos.
 *
 * INSTRUÇÕES:
 *   1. Copie este código integralmente para o editor JavaScript do
 *      MakeCode (https://makecode.microbit.org).
 *   2. Observe os erros apontados nos comentários.
 *   3. Corrija os bugs seguindo as dicas e veja o programa funcionar.
 *
 * ATENÇÃO:
 *   - O código NÃO FOI MODIFICADO – apenas foram acrescentados
 *     comentários explicativos.
 *   - Ele contém erros de sintaxe que impedem a compilação.
 *   - Para executar, é necessário corrigir os trechos destacados.
 * =====================================================================
 */

// =====================================================================
// BUG 1: Parênteses faltando na definição da função
// =====================================================================
//
// Em JavaScript, toda função deve ser declarada com a sintaxe:
//   function nomeDaFuncao(parametros) { ... }
//
// No trecho abaixo, os parênteses que deveriam envolver a lista de
// parâmetros (mesmo vazia) foram omitidos.
//
// Isso gera um erro de sintaxe (SyntaxError) e impede que o programa
// seja carregado no micro:bit. O compilador não reconhece a definição
// e interrompe a execução.
//
// CORREÇÃO SUGERIDA:
//   function saudacao() { ... }   ← adicionar "()" após o nome
// =====================================================================
function saudacao {   // ❌ ERRO: faltam os parênteses "()"
  // Cria uma imagem 5x5 totalmente apagada (todos os pontos desligados).
  // A string com 25 pontos (`. . . . . . . . . . . . . . . . . . . . . . . . .`)
  // representa uma matriz 5x5 vazia.
  let ola = images.createImage(`. . . . . . . . . . . . . . . . . . . . . . . . .`)
  
  // Exibe a imagem no LED por 0 milissegundos (na prática, mostra e
  // imediatamente apaga, a menos que haja uma pausa posterior).
  ola.showImage(0)
  
  // Aguarda 500 ms para que o usuário possa ver a imagem (se ela fosse
  // mostrada por tempo suficiente, mas como o tempo é 0, a imagem
  // mal é visível – isso é outro ponto de discussão didática).
  basic.pause(500)
  
  // Exibe a mensagem "OLA" (sem acento) na matriz de LEDs, rolamento
  // caractere por caractere.
  basic.showString("OLA")
}

// =====================================================================
// BUG 2: Nome da função errado na chamada (ou aparentemente correto?)
// =====================================================================
//
// O comentário original indica "Nome da função errado na chamada",
// porém, analisando o código, a definição é `saudacao` (sem acento) e
// a chamada também é `saudacao()`. Portanto, **neste código** os nomes
// coincidem.
//
// No entanto, o propósito didático é alertar para o erro comum de
// digitar o nome da função de forma diferente (ex.: com acento, ou
// com letras trocadas). Para efeitos de demonstração, mantivemos o
// código exatamente como foi fornecido.
//
// Se a intenção fosse realmente chamar uma função de nome diferente,
// bastaria alterar a chamada para, por exemplo, `saudacao()` (com
// acento) e a definição estaria sem acento – gerando um erro de
// referência (ReferenceError).
//
// Como o código não pode ser modificado (apenas comentado), deixamos
// a chamada como está, mas destacamos que, em situações reais, a
// digitação incorreta do nome é uma fonte frequente de bugs.
//
// CORREÇÃO SUGERIDA (se houvesse erro de nome):
//   Verifique se o nome na chamada é exatamente igual ao da definição,
//   incluindo maiúsculas/minúsculas e acentos.
// =====================================================================
input.onButtonPressed(Button.A, function () {
  // Chamada da função. Se a definição estivesse correta (com parênteses)
  // e o nome coincidisse, esta linha executaria a saudação.
  // Porém, devido ao BUG 1, a função nem chega a ser definida, então
  // este evento nunca será executado.
  saudacao()   // ⚠️ Nome aparentemente correto, mas a definição falha
})

// =====================================================================
// COMENTÁRIOS ADICIONAIS SOBRE O COMPORTAMENTO ESPERADO
// =====================================================================
//
// Após corrigir os dois bugs, o programa deveria:
//   1. Ao pressionar o botão A do micro:bit, executar a função `saudacao`.
//   2. A função exibe uma imagem vazia (todos os LEDs apagados) por um
//      instante, aguarda 0,5 segundo e depois mostra a palavra "OLA"
//      rolando na tela.
//
// Possível melhoria: Para que a imagem vazia seja visível, o tempo de
// exibição poderia ser aumentado (ex.: `showImage(500)`) ou usar
// `showImage(0)` seguido de `basic.pause(500)` já daria um efeito de
// "limpar a tela" antes da mensagem.
//
// DIVIRTA-SE APRENDENDO COM OS ERROS! 😉
// =====================================================================

Correção:

/*
 * ============================================================
 * PROJETO DIDÁTICO PARA MICRO:BIT - MAKECODE
 * ============================================================
 *
 * Este programa demonstra o uso básico de funções, imagens, 
 * exibição no display e interação com botões no micro:bit.
 *
 * FLUXO DO PROGRAMA:
 * 1. Quando o botão A for pressionado, a função 'saudacao()' é chamada.
 * 2. A função cria uma imagem vazia (todos os LEDs apagados) e a exibe.
 * 3. Aguarda 500 milissegundos (meio segundo) para que o usuário perceba
 *    que a tela foi limpa.
 * 4. Em seguida, exibe o texto "OLA" (em português, "Olá") de forma rolante
 *    no display de 5x5 LEDs.
 *
 * OBSERVAÇÃO: A imagem vazia é usada para apagar qualquer conteúdo anterior
 * na tela antes de mostrar a mensagem, garantindo uma apresentação limpa.
 *
 * AUTOR: [Nome do autor]
 * DATA: [Data]
 * ============================================================
 */

// ============================================================
// FUNÇÃO: saudacao()
// ============================================================
// Objetivo: Executar uma sequência de ações para cumprimentar o usuário.
// Não recebe parâmetros e não retorna nenhum valor.
// ============================================================
function saudacao() {
    // Cria uma imagem vazia de 5x5 LEDs.
    // A string com 25 caracteres (pontos ".") representa cada LED apagado.
    // Cada linha tem 5 pontos, totalizando 5 linhas.
    // O resultado é uma imagem onde nenhum LED está aceso.
    let ola = images.createImage(`
        . . . . .
        . . . . .
        . . . . .
        . . . . .
        . . . . .
    `);

    // Exibe a imagem criada no display do micro:bit.
    // O parâmetro '0' indica que a imagem deve permanecer visível até
    // que outra imagem ou texto seja mostrado (não há duração fixa).
    // Neste caso, a imagem vazia apaga todos os LEDs da matriz.
    ola.showImage(0);

    // Pausa a execução do programa por 500 milissegundos (meio segundo).
    // Isso mantém a tela limpa por um breve instante, permitindo que o
    // usuário perceba a transição antes da mensagem aparecer.
    basic.pause(500);

    // Exibe a string "OLA" no display de LEDs.
    // O micro:bit percorre os caracteres da esquerda para a direita,
    // criando um efeito de rolagem (scroll) até que a mensagem completa
    // seja exibida. Após a exibição, a tela permanece com o último caractere
    // ou volta ao estado anterior, dependendo da implementação.
    basic.showString("OLA");
}

// ============================================================
// EVENTO: Pressionar o botão A
// ============================================================
// Quando o botão A (localizado na parte frontal do micro:bit,
// à esquerda) for pressionado e solto, a função 'saudacao()'
// será executada.
// ============================================================
input.onButtonPressed(Button.A, function () {
    // Chama a função que executa a saudação.
    // Isso inclui: limpar a tela, pausar e mostrar "OLA".
    saudacao();
});

// ============================================================
// FIM DO PROGRAMA
// ============================================================
// Após a inicialização, o micro:bit fica em espera (loop infinito)
// aguardando eventos, como o pressionamento do botão A.
// ============================================================

Critério: Encontrar os 2 bugs e propor a correção. Carimbo: 🐛 "Caçador de Bugs"

⏱️ Detalhamento Minuto a Minuto (50 min)
0-5 min
Explicação das Regras e Distribuição dos Passaportes 📋 — Professor explica: "Cada estação tem 8 minutos. Ao final, os grupos rotacionam. Cada aluno tem um passaporte para carimbar. Só carimba quem completar a tarefa corretamente!" Distribuição: Dividir a turma em 5 grupos (ou 10, se tiver mais estações). Cada grupo começa em uma estação diferente. Rotação no sentido horário.
5-45 min
Rotação pelas 5 Estações (8 min cada + 1 min de transição) 🔄 — Estrutura da Estação: 1. Aluno lê o cartão de instruções; 2. Programa a solução no MakeCode; 3. Testa na micro:bit; 4. Chama o professor para verificar; 5. Recebe o carimbo no passaporte; 6. Limpa o código para o próximo grupo. Durante as Rotações: Professor circula entre as estações, verificando e carimbando. Cada estação deve ter um monitor (aluno que já completou) para ajudar.
45-50 min
Autoavaliação e Fechamento 📝 — Alunos sentam e preenchem o verso do passaporte: "A estação mais fácil foi: ______. Porque: ______. A estação mais difícil foi: ______. Porque: ______. O que eu ainda preciso praticar? ______. De 0 a 5, quanto eu aprendi neste bimestre? ⭐⭐⭐⭐⭐. O que eu mais gostei nas aulas de robótica? ______."
♿ Orientações para Adaptações e Inclusão
  • TEA: Passaporte visual com ícones para cada estação. Instruções em cartões coloridos. Rotina clara: entrada → tarefa → verificação → carimbo.
  • TDAH: Timer visível com contagem regressiva. Checklist para cada estação. Sinal sonoro a cada 6 minutos para lembrar de terminar.
  • Deficiência física: Interface adaptada (comandos de voz, botões grandes). Avaliar raciocínio, não velocidade de digitação. Permitir que um colega digite o código conforme o aluno dita.
  • Deficiência visual: Instruções em áudio (professor grava previamente). Aluno responde oralmente para o monitor. Códigos em braille ou fonte ampliada.
  • Deficiência auditiva: Feedback visual (LEDs piscando) em vez de som. Instruções escritas em cartões grandes.
  • Altas habilidades: Estação 6 bônus: criar função recursiva para calcular fatorial. Adicionar mais funcionalidades ao código da estação.
📊 Critérios Operacionais de Avaliação
Quantidade de Estações Descrição Conceito
5 estações com sucesso Completou todos os desafios com autonomia Excelente (A)
4 estações com sucesso Completou a maioria com mínima ajuda Bom (B)
3 estações com sucesso Completou com ajuda significativa Regular (C)
Menos de 3 estações Precisa de suporte intenso Em desenvolvimento (D)

Total: 10 pontos (média das estações)

Frase do dia (Última!): "Função é poder! Parâmetro é personalização! Lógica é decisão! E vocês são Mestres da Programação!"

🏆 CERTIFICADO DE CONCLUSÃO - 5º ANO

"MESTRE DOS PARAFUSOS PENSANTES"

🤖 CERTIFICADO ROBÔMESTRES

Certificamos que

[NOME DO ALUNO]

concluiu com êxito o 5º ANO - ROBÓTICA EDUCACIONAL
Dominando os conceitos de:
🔁 FUNÇÕES (blocos de código reutilizáveis)
📦 PARÂMETROS (personalização de funções)
🪆 ANINHAMENTO (funções que chamam funções)
🔀 OPERADORES LÓGICOS (AND, OR, NOT)
🖐️ SENSORES (toque, luz)
🐛 DEPURAÇÃO (caça aos bugs)


RobôMestres do Paraná • 2026

"Agora você já pode chamar a função `SALVAR_O_MUNDO()`!"

🔧 Ass: Robô Zé 3.0

Visualização ao selecionar aluno

Cadastro de Alunos

📋 Lista de Programadores 0
♿ ADAPTAÇÕES ESPECÍFICAS BIMESTRE 1 (Caos Acessível para Todos)
📌 Para TEA (Transtorno do Espectro Autista)
  • Use checklist visual com etapas (1. Definir função, 2. Chamar função, 3. Testar, 4. Anotar).
  • Cores fixas por tipo de bloco: azul para definição de função, vermelho para chamada, verde para condicional.
  • Evite estímulos sensoriais intensos: substitua "gritos" por gestos combinados.
  • Forneça um "esqueleto" do código já com a estrutura da função.
  • Permita que o aluno use abafador de ruído se necessário.
📌 Para TDAH (Déficit de Atenção)
  • Timer visível: projetar contagem regressiva para cada atividade.
  • Checklist visual para marcar progresso com checkboxes.
  • Âncoras visuais: setas, cores, ícones para chamar atenção.
  • Divida as atividades em partes curtas com recompensas imediatas (adesivo a cada etapa concluída).
📌 Para Deficiência Física
  • Interfaces alternativas: Makey Makey com botões grandes, comandos de voz.
  • Simplificação de interações: reduzir número de cliques necessários.
  • Tempo estendido: permitir mais tempo para tarefas motoras.
  • Suporte de pares: permitir que um colega digite conforme o aluno dita.
📌 Para Deficiência Visual
  • Feedback sonoro diferente para cada ação (som para verdade, som para falso).
  • Materiais táteis: blocos em relevo, objetos para representar valores.
  • Instruções em áudio: professor grava previamente.
  • Avaliação oral: aluno responde falando para o monitor.
📌 Para Deficiência Auditiva
  • Feedback visual: mudança de cores, LED piscando.
  • Instruções escritas: texto na tela ou impresso.
  • Código visual: cores e formas para representar conceitos.
  • Alarme visual em vez de sonoro.
📌 Para Altas Habilidades
  • Aprofundamento: introduzir conceitos avançados (recursão, máquinas de estados).
  • Complexidade: projetos com mais variáveis, mais sensores.
  • Prototipagem física: construir além do código (eletrônica real).
  • Liderança: aluno atua como monitor ou tutor dos colegas.

“SE o robô não andar, ENTÃO a gente declara Dia do Bug; SENÃO a gente dança.”

📚 REFERÊNCIAS BIBLIOGRÁFICAS (ABNT)

BRASIL. Ministério da Educação. Base Nacional Comum Curricular (BNCC): Educação Infantil e Ensino Fundamental. Brasília: MEC, 2018. Disponível em: http://basenacionalcomum.mec.gov.br/. Acesso em: 20 out. 2023.

BRASIL. Ministério da Educação. Base Nacional Comum Curricular (BNCC): Matemática no Ensino Fundamental. Brasília: MEC, 2018.

BRENNAN, Karen; RESNICK, Mitchel. "New Frameworks for Studying and Assessing the Development of Computational Thinking." Proceedings of the 2012 Annual Meeting of the American Educational Research Association, 2012.

MICROSOFT. MakeCode for micro:bit. Disponível em: https://makecode.microbit.org/. Acesso em: 20 out. 2023.

PAPERT, Seymour. Logo: Computadores e Educação. São Paulo: Brasiliense, 1985.

PARANÁ. Secretaria de Estado da Educação. Referencial Curricular do Paraná (RCP-PR): Ensino Fundamental Anos Iniciais. Curitiba: SEED, 2018.

PARANÁ. Secretaria de Estado da Educação. Referencial Curricular do Paraná (RCP-PR): Programação e Robótica. Curitiba: SEED, 2019.

PIRES, Nirlene Samorano. Adaptação Curricular: Como Tornar o Ensino Acessível para Todos?. International Integralize Scientific, v. 5, n. 45, mar. 2025. Disponível em: doi.org/10.63391/6B67C2. Acesso em: 20 out. 2023.

RESNICK, Mitchel. "Scratch: Programming for All." Communications of the ACM, v. 52, n. 11, p. 60-67, 2009.

WING, Jeannette M. "Computational Thinking." Communications of the ACM, v. 49, n. 3, p. 33-35, 2006.