Teach Remote lab lessons

Teach lesson

STM32 Mbed CodeIDE (8/8): projeto final de controlador integrado

Os alunos combinam entrada analógica, reconhecimento pelo botão, saída RGB, LED de status e evidência serial para construir um pequeno controlador STM32 integrado.

  • STM32 Nucleo (Mbed)
  • 65 min
  • Ensino médio / formação técnica introdutória em eletrônica
  • Português (Brasil)
  • Embedded systems
STM32 Nucleo (Mbed)
STM32 Nucleo (Mbed)

Learning Outcomes

  • Combine entrada analógica, entrada de botão, saída RGB PWM, um LED de status e evidência serial em um controlador.

  • Use uma matriz de teste para provar o comportamento do controlador, um estado por vez.

  • Explique como o código, a saída serial e a evidência de laboratório visível suportam uma declaração do controlador.

Student activity preview

Activity Content

Preview only. In a class session, students can fill in responses and submit their work to the teacher.

1

Requisitos do controlador

12 min

Os sistemas embarcados tornam-se úteis quando várias funções básicas trabalham em conjunto: ler um nível, decidir a que estado ele pertence, mostrar um aviso visível e imprimir evidências suficientes para confiar no resultado.

O controlador usa um potenciômetro para simular a pressão de um reservatório e um botão para reconhecer o alarme. Numa instalação real, seria necessário um transmissor de pressão calibrado e proteção com classificação de segurança; este controlador de treinamento pratica apenas a lógica de indicação e reconhecimento.

Mapa de hardware usado pelo controlador inicial:

- PC_1 é a entrada de pressão simulada, controlada pelo controle deslizante Pot. pot2.
- PC_5 é a entrada do botão de reconhecimento, controlada pelo botão B1.
- PA_8, PA_9 e PA_10 são os canais RGB PWM.
- PB_13 é o LED verde de status, ativo em nível baixo.

Entradas, controlador e saídas de evidências

Arquitetura do controlador com potenciômetro pot2 em PC1 e botão B1 em PC5 como entradas, levando a um controlador que aciona RGB PWM em PA8 para PA10, o LED de status em PB13 e a evidência serial.

Leia este mapa como um conjunto de objetos do Mbed trabalhando juntos: AnalogIn lê o nível, DigitalIn lê o botão de reconhecimento, PwmOut aciona os canais RGB e DigitalOut aciona o LED de status. O objetivo principal é conectar esses componentes da API em um controlador legível.

O comportamento necessário é:

- Nível abaixo de 40%: saída RGB verde, LED de status desligado, evidência serial como
percent=25 level=SAFE ack=0.
- Nível de 40% a 69%: saída RGB amarela, LED de status desligado, evidência serial como
percent=55 level=WARNING ack=0.
- Nível de 70% ou mais com o botão solto: saída RGB vermelha, LED de status
piscando, evidência serial como percent=80 level=CRITICAL ack=0. Observe
por pelo menos dois segundos antes de registrar esse estado; considere-o piscando
somente se o LED de status acender e apagar repetidamente.
- Nível de 70% ou mais após o botão ter sido pressionado uma vez: saída RGB azul,
LED de status desligado, evidência serial como percent=80 level=CRITICAL ack=1.
Soltar o botão não remove o reconhecimento enquanto o nível
permanece crítico.

O botão de reconhecimento não reduz a pressão nem torna segura uma condição crítica. Ele apenas trava a indicação local para mostrar que o operador percebeu o alarme; level=CRITICAL deve permanecer na evidência serial. A trava é liberada automaticamente quando a pressão simulada cai abaixo do limite crítico.

Inicie ambos os casos com a trava desativada e pressione o botão. Responda neste
formato:

1. 69% | level=... | ack=...
2. 70% | level=... | ack=...
3. Explanation: ...

Na explicação, indique por que a igualdade em 70% altera tanto a ramificação quanto
a possibilidade de memorizar o reconhecimento.

2

Execute o controlador inicial

30 min

  1. Abra o laboratório STM32 Mbed CodeIDE.

  2. Abra main.cpp.

  3. Substitua o arquivo pelo controlador abaixo.

  4. Complete TODO 1 com a expressão do botão ativo-baixo e TODO 2 com a decisão do limite do intervalo de aviso.

  5. Antes de compilar ou observar a placa, preencha as quatro células Resposta esperada na tabela de teste dos requisitos acima.

  6. Salve, compile e faça o upload. Esta é a compilação planejada 1 de 2.

  7. Use Pot. pot2 para definir níveis de pressão seguros, de alerta e críticos.

  8. No nível crítico, primeiro deixe o botão solto por dois segundos. Em seguida, pressione e solte; verifique se ack=1 permanece por pelo menos duas linhas seriais posteriores.

  9. Registre uma linha por estado, incluindo a linha serial completa.

  10. Abaixe o nível abaixo de 70% e verifique se a trava é redefinida para ack=0 antes de terminar.

#include "mbed.h"

AnalogIn level_control(PC_1);
DigitalIn acknowledge_button(PC_5, PullUp);

PwmOut rgb_red(PA_8);
PwmOut rgb_green(PA_9);
PwmOut rgb_blue(PA_10);

DigitalOut status_led(PB_13, 1);

constexpr int warning_threshold_percent = 40;
constexpr int critical_threshold_percent = 70;

void status_on() {
    status_led = 0;
}

void status_off() {
    status_led = 1;
}

void set_rgb(float red, float green, float blue) {
    rgb_red.write(red);
    rgb_green.write(green);
    rgb_blue.write(blue);
}

void show_safe() {
    set_rgb(0.0f, 0.7f, 0.0f);
    status_off();
}

void show_warning() {
    set_rgb(0.7f, 0.5f, 0.0f);
    status_off();
}

void show_critical(bool acknowledged) {
    if (acknowledged) {
        set_rgb(0.0f, 0.0f, 0.8f);
        status_off();
    } else {
        set_rgb(0.9f, 0.0f, 0.0f);
        status_led = !status_led.read();
    }
}

int main() {
    rgb_red.period_ms(2);
    rgb_green.period_ms(2);
    rgb_blue.period_ms(2);

    printf("Integrated controller start\n");

    bool acknowledged = false;

    while (true) {
        float reading = level_control.read();
        int percent = (int)(reading * 100.0f);
        // TODO 1: substitua false pela expressão do botão ativo-baixo.
        bool button_pressed = false;

        if (percent < critical_threshold_percent) {
            acknowledged = false;
        } else if (button_pressed) {
            acknowledged = true;
        }

        if (percent < warning_threshold_percent) {
            show_safe();
            printf("percent=%d level=SAFE ack=%d\n",
                   percent,
                   acknowledged);
        // TODO 2: substitua false pelo teste de limite do intervalo WARNING.
        } else if (false) {
            show_warning();
            printf("percent=%d level=WARNING ack=%d\n",
                   percent,
                   acknowledged);
        } else {
            show_critical(acknowledged);
            printf("percent=%d level=CRITICAL ack=%d\n",
                   percent,
                   acknowledged);
        }

        ThisThread::sleep_for(500ms);
    }
}

Prepare e preencha a tabela em duas etapas. Antes da compilação, selecione cada Caso de teste, escolha a ação planejada para o botão e escreva a Resposta esperada como a cor RGB e o comportamento do LED de status. Durante o teste ao vivo, insira a porcentagem inteira real, a resposta visível e a linha serial completa. Essa porcentagem simula a saída de um transmissor; não é uma pressão em bar. No estado crítico não reconhecido, escreva piscando somente após observar por pelo menos dois segundos. No estado crítico reconhecido, pressione e solte o botão e registre uma linha posterior que mostre que ack=1 persistiu. Deixe as linhas extras não utilizadas completamente em branco.

Tabela de teste do controlador de quatro estados

Antes de testar, preencha as respostas esperadas para todos os quatro estados. Durante o teste, adicione entradas reais, respostas visíveis e evidências seriais completas. Deixe as linhas extras não utilizadas em branco.

Caso de teste Entrada de pressão real % Ação do botão Resposta esperada Resposta visível observada Evidência serial

Depois de reconhecer o estado crítico, copie uma linha completa impressa após soltar B1 que ainda mostre level=CRITICAL ack=1. Em seguida, abaixe o nível para menos de 70% e copie a primeira linha completa que mostre ack=0. Explique como as duas linhas comprovam a trava e sua condição de reinicialização.

Escolha sua linha de teste mais forte. Cite o estado de entrada e a linha serial dessa linha e, em seguida, explique como a saída RGB e o LED de status atenderam ao requisito.

3

Melhore o controlador

15 min

O controlador acima é um ponto de partida. Escolha uma melhoria, implemente-a em main.cpp, salve, compile, carregue e teste-a no cenário de alarme do reservatório. Um plano sem execução de código não é suficiente.

Escolha uma melhoria limitada:

- Rota do limite: altere apenas critical_threshold_percent para um valor de
72% a 80%. Escolha um valor de teste fixo entre 70% e seu novo limite,
para que a mesma entrada mude de ramificação após sua edição.
- Rota de nível muito alto: adicione uma ramificação VERY_HIGH para valores de 90% ou mais,
imediatamente antes da ramificação crítica comum. Use uma indicação RGB magenta,
mantenha o LED de status aceso e gere a evidência serial level=VERY_HIGH.
Use 95% com o botão solto no teste antes/depois e depois verifique 80%
uma vez para confirmar que o comportamento crítico comum ainda funciona.

Antes de editar, responda com estas linhas:

1. Rota escolhida: limite / nível muito alto
2. Local exato do código que vou alterar: ...
3. Entrada e ação do botão que repetirei antes e depois: ...
4. Somente para a rota de nível muito alto: Verificação de regressão em 80%: ...

Use a linha correspondente do controlador inicial como evidência antes. Implemente a alteração, salve, compile e faça o upload; esta é a compilação planejada 2 de 2. Teste novamente a mesma entrada e a mesma ação do botão para obter a evidência depois. Registre uma linha serial completa e o comportamento RGB/status visível para as duas versões. Se você escolheu a rota de nível muito alto, execute a verificação adicional de regressão em 80% e relate-a na explicação final.

Evidência de melhoria antes e depois

Use a mesma entrada controlada para antes e depois. Deixe as linhas extras não utilizadas em branco.

Versão Entrada de pressão controlada % Estado do botão controlado Status da compilação/upload Linha serial completa Resultado RGB/status visível

Indique a alteração exata do código e compare as linhas seriais antes e depois e os resultados visíveis. Diga se a evidência confirmou a melhoria pretendida. Para a rota muito alta, informe também se a verificação de regressão de 80% ainda produziu comportamento crítico comum.

4

Envie seu código

8 min

Anexe seu main.cpp final salvo

Clique em Verificar arquivos salvos, confirme se main.cpp contém o controlador final que você testou e clique em Anexar código salvo. Depois que o código for anexado, clique em Enviar envio na parte inferior da atividade.