Teach Lições com laboratórios remotos

Lição do Teach

STM32 com a API do Arduino (2/4): sequência e botões

Os estudantes ampliam um sketch STM32 Arduino com vários LEDs e uma entrada de botão, depois explicam como o tempo da sequência e o estado do botão afetam a saída.

  • STM32 Nucleo (Arduino)
  • 55 min
  • Ensino médio / formação técnica introdutória em eletrônica
  • Português (Brasil)
  • Sistemas embarcados

Entre com uma conta de professor para preparar uma sessão. Os estudantes entram com um código da turma.

Caminho do sinal do botão B1 em PC5 até digitalRead no início do loop, seleção de waitTime para delay e saídas RGB em PA8, PA9 e PA10.
STM32 Nucleo (Arduino)

Objetivos de aprendizagem

  • Criar uma sequência de saída usando uma lista de pinos.

  • Ler um botão ativo em LOW e usá-lo para mudar o comportamento.

  • Registrar dois estados de teste e explicar a decisão do programa.

Visualização da atividade do estudante

Conteúdo da atividade

Apenas visualização. Em uma sessão de aula, os estudantes podem preencher respostas e entregar o trabalho ao professor.

1

Um botão ativo em LOW

8 min

Nesta configuração, o botão que usaremos está conectado ao pino PC5. É um botão ativo em LOW: quando pressionado, digitalRead(PC5) retorna LOW; quando não é pressionado, retorna HIGH.

Na interface do laboratório, use o controle denominado Botão 1 ou B1. Pressione e segure-o enquanto observa pelo menos uma sequência completa e solte-o antes do teste com o botão solto. Um clique rápido pode terminar antes que o programa o leia.

Quando o botão 1 é pressionado, qual comparação representa essa entrada ativa em LOW?

2

Sequência com modo rápido

27 min

O programa usa três saídas RGB já conectadas na montagem remota. setup() configura o botão como uma entrada e cada pino RGB como uma saída. loop() lê o botão uma vez no início de cada ciclo de três cores, seleciona um tempo de espera em milissegundos e liga cada canal em ordem. Um pressionamento durante o ciclo só produz efeito no ciclo seguinte; por isso, mantenha B1 pressionado até o novo ciclo começar. O auxiliar turnOffAll() agrupa três ações repetidas sob um nome claro.

O botão define o tempo do próximo ciclo RGB

Caminho do sinal do botão B1 em PC5 até digitalRead no início do loop, seleção de waitTime para delay e saídas RGB em PA8, PA9 e PA10.

O programa lê B1 no início de loop(), escolhe um waitTime e usa esse valor para os três canais RGB nesse ciclo.

  1. Inicie o laboratório STM32 Arduino por este bloco e abra a guia do editor main.ino no CodeIDE.

  2. Cole o programa inicial abaixo. Substitua TODO 1 pelo nível de comparação que significa “pressionado” e TODO 2 por um tempo de espera visivelmente mais rápido, entre 100 ms e 300 ms. O tempo normal é 500 ms.

  3. Procure TODO no arquivo; substitua todos os TODOs antes de compilar. Salve, compile e aguarde a confirmação de sucesso. Depois, faça upload e aguarde a confirmação.

  4. Teste 1 — B1 solto: observe uma sequência completa de três cores e preencha a linha não pressionada.

  5. Teste 2 — B1 mantido pressionado: segure B1 durante uma sequência completa, depois solte-o e preencha a linha pressionada. Registre os valores de espera reais em ms.

  6. Não edite a sequência até completar as duas linhas iniciais e responder à pergunta logo abaixo da tabela.

#include <Arduino.h>

const int RGB_RED = PA8;
const int RGB_GREEN = PA9;
const int RGB_BLUE = PA10;
const int BUTTON_1 = PC5;  // LOW ativo: pressionado == LOW

void turnOffAll() {
  analogWrite(RGB_RED, 0);
  analogWrite(RGB_GREEN, 0);
  analogWrite(RGB_BLUE, 0);
}

void setup() {
  pinMode(BUTTON_1, INPUT);
  pinMode(RGB_RED, OUTPUT);
  pinMode(RGB_GREEN, OUTPUT);
  pinMode(RGB_BLUE, OUTPUT);
}

void loop() {
  bool pressed = digitalRead(BUTTON_1) == TODO_PRESSED_LEVEL;  // TODO 1: nível de comparação para um botão ativo-LOW pressionado
  int waitTime = 500;
  if (pressed) {
    waitTime = TODO_FAST_WAIT_MS;  // TODO 2: intervalo rápido visível, em ms
  }

  turnOffAll();
  analogWrite(RGB_RED, 180);
  delay(waitTime);
  turnOffAll();
  analogWrite(RGB_GREEN, 180);
  delay(waitTime);
  turnOffAll();
  analogWrite(RGB_BLUE, 180);
  delay(waitTime);
}

Preencha a tabela após fazer upload do programa e testar o botão. Use apenas duas linhas e deixe as outras em branco se o TEACH mostrar mais:

  • Linha 1: botão não pressionado.
  • Linha 2: botão pressionado.
  • Em Valor esperado de digitalRead, escreva HIGH ou LOW de acordo com a lógica ativa em LOW.
  • Em Tempo de espera usado, registre o valor em ms aplicado pelo programa.
  • Em Breve explicação, conecte o estado do botão com a velocidade observada.
Estado do botão Valor esperado de digitalRead Tempo de espera usado ms Sequência observada Breve explicação

Explique como você sabe que o botão mudou o comportamento do programa. Use as duas linhas da tabela como evidência.

3

Modifique a sequência após os testes iniciais

10 min

Somente depois de completar as duas linhas iniciais, troque os blocos da primeira e da última cor para que a sequência comece em azul e termine em vermelho. Não altere nenhum tempo de espera. Salve, compile, faça upload e repita os dois estados do botão. Este desafio separado verifica que a ordem das cores e o tempo controlado pelo botão são regras independentes.

Quais dois blocos de código você moveu? Indique a nova ordem de cores e confirme, com uma observação com B1 solto e outra com B1 mantido pressionado, se a regra de tempo ainda funcionou.

4

Envie seu código

10 min

Envie seu main.ino final

Salve main.ino antes de anexá-lo. A captura deve mostrar a versão final, a ordem de cores alterada e nenhum token TODO restante.

Por que um botão ativo em LOW pode causar confusão no início? Escreva uma regra curta que ajude você a evitar erros.

Transforme esta visualização em uma sessão de aula

Continue para o LabsLand Teach para usar esta lição com seus estudantes e conferir o acesso disponível para sua conta.