Lección Teach
STM32 Mbed CodeIDE (8/8): proyecto final de controlador integrado
El alumnado combina entrada analógica, botón de confirmación, salida RGB/LED de estado y evidencia por consola serie para construir un controlador STM32 integrado.
¿Primera vez que activas Teach? Puedes realizar una sesión de clase sin costo. El alumnado entra con un código de clase.
¿Primera vez en LabsLand? Crea tu cuenta de docente
Resultados de aprendizaje
Combinar entrada analógica, entrada de botón, salida PWM RGB, un LED de estado y evidencia serie en un controlador.
Usar una matriz de pruebas para demostrar el comportamiento del controlador estado por estado.
Explicar cómo el código, la salida serie y la evidencia visible del laboratorio apoyan una afirmación sobre el controlador.
Vista previa de la actividad del estudiante
Contenido de la actividad
Solo vista previa. En una sesión de clase, los estudiantes pueden completar respuestas y entregar su trabajo al docente.
Requisitos del controlador
12 min
Los sistemas embebidos se vuelven útiles cuando varias habilidades pequeñas trabajan juntas: leer un nivel, decidir a qué estado pertenece, mostrar un aviso visible e imprimir evidencia suficiente para confiar en el resultado.
El controlador usa un potenciómetro como presión simulada y un botón como reconocimiento de alarma. En una instalación real harían falta un transmisor calibrado y protecciones certificadas; este controlador didáctico solo practica lógica de indicación y reconocimiento.
Mapa de hardware usado por el controlador inicial:
- PC_1 es la entrada de presión simulada, controlada por el deslizador Pot. pot2.
- PC_5 es la entrada del botón de reconocimiento, controlada por el botón B1.
- PA_8, PA_9 y PA_10 son los canales PWM RGB.
- PB_13 es el LED verde de estado activo en bajo.
Entradas, controlador y salidas de evidencia
Lee este mapa como un conjunto de objetos Mbed trabajando juntos: AnalogIn lee el nivel, DigitalIn lee el botón de reconocimiento, PwmOut controla los canales RGB y DigitalOut controla el LED de estado. El proyecto final consiste sobre todo en conectar esas piezas de la API en un controlador legible.
El comportamiento requerido es:
- Nivel por debajo de 40%: salida RGB verde, LED de estado apagado, evidencia serie como
percent=25 level=SAFE ack=0.
- Nivel de 40% a 69%: salida RGB amarilla, LED de estado apagado, evidencia serie como
percent=55 level=WARNING ack=0.
- Nivel de 70% o más con el botón suelto: salida RGB roja, LED de estado
parpadeando, evidencia serie como percent=80 level=CRITICAL ack=0. Observa
al menos dos segundos antes de registrar este estado; cuéntalo como parpadeo
solo si el LED de estado se enciende y apaga repetidamente.
- Nivel de 70% o más después de pulsar una vez el botón: salida RGB azul, LED de
estado apagado y evidencia serie como percent=80 level=CRITICAL ack=1.
Soltar el botón no elimina el reconocimiento mientras el nivel siga crítico.
El botón de reconocimiento no reduce la presión ni vuelve seguro un estado crítico. Solo enclava la indicación local para mostrar que la alarma se ha visto; la evidencia serie debe mantener level=CRITICAL. El enclavamiento se borra automáticamente al bajar la presión simulada por debajo del umbral crítico.
Empieza en ambos casos con el enclavamiento borrado y pulsa después el botón.
Responde con este formato:
1. 69% | level=... | ack=...
2. 70% | level=... | ack=...
3. Explicación: ...
En la explicación, indica por qué la igualdad en 70% cambia tanto la rama como
la posibilidad de enclavar el reconocimiento.
Ejecutar el controlador inicial
30 min
Abre el laboratorio STM32 Mbed CodeIDE.
Abre
main.cpp.Reemplaza el archivo con el controlador siguiente.
Completa TODO 1 con la expresión activa en bajo del botón y TODO 2 con la decisión de umbral del rango WARNING.
Antes de compilar u observar la placa, rellena las cuatro celdas
Respuesta esperadade la tabla usando los requisitos anteriores.Guarda, compila y carga. Es la compilación prevista 1 de 2.
Usa
Pot. pot2para fijar presiones simuladas segura, de aviso y crítica.En crítico, deja primero el botón suelto durante dos segundos. Después púlsalo y suéltalo; comprueba que
ack=1permanece en al menos dos líneas serie posteriores.Registra una fila por estado, incluyendo la línea serie completa.
Baja el nivel por debajo del 70% y comprueba que el enclavamiento vuelve a
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: sustituye false por la expresión activa en bajo del botón.
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: sustituye false por la prueba de umbral de 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);
}
}
Prepara y completa la tabla en dos pasadas. Antes de compilar, selecciona cada Caso de prueba, la acción prevista del botón y escribe su Respuesta esperada como color RGB más comportamiento del LED. Durante la prueba, introduce el porcentaje entero real, la respuesta visible y la línea serie completa. El porcentaje simula un transmisor; no es presión en bar. Para crítico sin reconocer, escribe parpadeando solo tras dos segundos. Para crítico reconocido, pulsa y suelta el botón y registra una línea posterior que demuestre que ack=1 permaneció. Deja vacías las filas adicionales.
Tabla de prueba del controlador de cuatro estados
Antes de probar, rellena las respuestas esperadas de los cuatro estados. Durante la prueba, añade entradas reales, respuesta visible y línea serie completa. Deja vacías las filas adicionales.
| Caso de prueba | Entrada de presión real % | Acción del botón | Respuesta esperada | Respuesta visible observada | Evidencia serie |
|---|---|---|---|---|---|
Después de reconocer el estado crítico, copia una línea completa posterior a soltar B1 que todavía muestre level=CRITICAL ack=1. Luego baja del 70% y copia la primera línea completa que muestre ack=0. Indica cómo demuestran ambas líneas el enclavamiento y su condición de borrado.
Elige tu fila de prueba más fuerte. Cita el estado de entrada y la línea serie de esa fila; después explica cómo la salida RGB y el LED de estado coincidieron con el requisito.
Mejorar el controlador
15 min
El controlador anterior es un punto de partida. Elige una mejora, impleméntala en main.cpp, guarda, compila, carga y pruébala en el escenario de alarma. Un plan sin código ejecutado no basta.
Elige una mejora acotada:
- Ruta de umbral: cambia solo critical_threshold_percent a un valor entre
72% y 80%. Elige una entrada fija entre 70% y tu nuevo umbral para que esa
misma entrada cambie de rama después de editar.
- Ruta muy alta: añade una rama VERY_HIGH para valores del 90% o más,
justo antes de la rama crítica normal. Dale indicación RGB magenta, LED de
estado encendido fijo y evidencia serie level=VERY_HIGH. Usa 95% con el
botón suelto en la comparación y prueba después 80% para confirmar que el
comportamiento crítico ordinario sigue funcionando.
Antes de editar, responde con estas líneas:
1. Ruta elegida: umbral / muy alta
2. Lugar exacto del código que cambiaré: ...
3. Entrada y acción del botón que repetiré antes y después: ...
4. Solo para la ruta muy alta: Prueba de regresión al 80%: ...
Usa la fila correspondiente del controlador inicial como evidencia anterior. Implementa el cambio, guarda, compila y carga; es la compilación prevista 2 de 2. Repite la misma entrada/acción para la evidencia posterior. Registra una línea serie completa y el comportamiento RGB/LED. Si elegiste la ruta muy alta, ejecuta además la prueba de regresión al 80% y descríbela en la explicación final.
Evidencia anterior y posterior de la mejora
Usa la misma entrada controlada antes y después. Deja vacías las filas adicionales no usadas.
| Versión | Entrada de presión controlada % | Estado controlado del botón | Estado de compilación/carga | Línea serie completa | Resultado RGB/estado visible |
|---|---|---|---|---|---|
Indica el cambio exacto y compara líneas serie y resultados visibles anterior/posterior. Concluye si la evidencia confirmó la mejora. Para la ruta muy alta, indica también si la prueba al 80% mantuvo el comportamiento crítico ordinario.
Enviar tu código
8 min
Adjunta tu main.cpp final guardado
Pulsa Comprobar archivos guardados, confirma que main.cpp contiene el controlador final que probaste y luego pulsa Adjuntar código guardado. Después de adjuntar el código, pulsa Enviar entrega al final de la actividad.
Convierte esta vista previa en una sesión de clase real
Activa LabsLand Teach para usar esta lección con tus estudiantes. La primera vez que actives Teach, podrás realizar una sesión de clase sin costo.
¿Primera vez en LabsLand? Crea tu cuenta de docente