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.
New to LabsLand? Create your teacher account
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.
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
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.
Execute o controlador inicial
30 min
Abra o laboratório STM32 Mbed CodeIDE.
Abra
main.cpp.Substitua o arquivo pelo controlador abaixo.
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.
Antes de compilar ou observar a placa, preencha as quatro células Resposta esperada na tabela de teste dos requisitos acima.
Salve, compile e faça o upload. Esta é a compilação planejada 1 de 2.
Use
Pot. pot2para definir níveis de pressão seguros, de alerta e críticos.No nível crítico, primeiro deixe o botão solto por dois segundos. Em seguida, pressione e solte; verifique se
ack=1permanece por pelo menos duas linhas seriais posteriores.Registre uma linha por estado, incluindo a linha serial completa.
Abaixe o nível abaixo de 70% e verifique se a trava é redefinida para
ack=0antes 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.
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.
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.