Si usas #define REPOSO 0, durante una sesión de Debugging (con J-Link o ST-Link), el depurador solo te mostrará un 0 en la variable. Tendrás que recordar de memoria qué significa ese 0. Al usar typedef enum, el compilador conserva el nombre simbólico. El depurador te mostrará literalmente la palabra REPOSO, ahorrándote horas de frustración al analizar fallos.
Por defecto, un enum asigna los valores 0, 1, 2, 3... secuencialmente. Pero en sistemas críticos, el valor 0x00 es el valor de un cable de datos en cortocircuito a tierra. Debemos forzar firmas hexadecimales claras (ej. 0x10, 0x20) para que si el ESP32 recibe un byte de estado, sepamos matemáticamente que es auténtico y no ruido eléctrico.
En C puro, un enum se compila internamente como un entero (usualmente 1 byte o 4 bytes, dependiendo del nivel de optimización y arquitectura ARM). Sin embargo, al crear un nuevo tipo de dato con typedef, obligamos al compilador a advertirnos si intentamos pasar un valor sin sentido (como 99) a una función que espera un estado válido de la máquina.
Ejercicio 1: Crea la arquitectura base de la FSM de tu Despachador de Gas. Asigna valores hexadecimales específicos a cada estado para que puedan ser mapeados directamente al protocolo UART que va hacia el ESP32, garantizando integridad en las tramas.
#include <stdint.h>
// --- 1. DEFINICIÓN DEL TIPO ESTRICTO Y FIRMAS HEX ---
// El compilador sabrá que cualquier variable de tipo 'EstadoFSM_e'
// solo debe contener uno de estos valores.
typedef enum {
FSM_INICIALIZACION = 0x05, // 0x00 evitado intencionalmente
FSM_REPOSO = 0x10,
FSM_AUTENTICANDO = 0x15, // Esperando token del ESP32
FSM_DESPACHANDO = 0x20, // Válvulas abiertas
FSM_CORTE_FLUJO = 0x30, // Cierre de válvulas, calculando
FSM_FALLA_CRITICA = 0xFF // 255: Código universal de error
} EstadoFSM_e;
// Declaración global del estado de la máquina
EstadoFSM_e estado_actual_lp = FSM_INICIALIZACION;
// --- 2. FUNCIÓN DE CAMBIO DE ESTADO (Manejador Seguro) ---
// Al recibir 'EstadoFSM_e' en lugar de 'uint8_t', el compilador GCC te lanzará
// un 'Warning' si intentas pasarle un número al azar como "cambiar_estado(99);".
void FSM_Cambiar_Estado(EstadoFSM_e nuevo_estado) {
// Aquí podrías agregar lógica para ignorar cambios si estamos en falla
if (estado_actual_lp == FSM_FALLA_CRITICA && nuevo_estado != FSM_INICIALIZACION) {
return; // Una falla crítica solo se sale con un reset o inicio
}
estado_actual_lp = nuevo_estado;
}
// --- 3. EXTRACCIÓN PARA TELEMETRÍA UART ---
// Retornamos el valor numérico (Hex/Byte) para enviarlo crudo por UART al ESP32
uint8_t FSM_Obtener_Estado_Para_UART(void) {
// Un simple casting explícito a 8-bits extrae la firma hexadecimal
return (uint8_t)estado_actual_lp;
}
int main(void) {
// Simulación del Súper Bucle de la Máquina
// Autodiagnóstico superado
FSM_Cambiar_Estado(FSM_REPOSO);
// ... Evento de Botón de Start ...
FSM_Cambiar_Estado(FSM_AUTENTICANDO);
// El puerto UART ahora enviará exactamente '0x15' al ESP32.
// El ESP32 sabrá con certeza matemática que la máquina espera autorización.
while(1) {
// Ejecución de tareas...
}
return 0;
}
Objetivo del día: Sincronización Determinista de Estados con Telemetría.
En un ecosistema industrial compuesto por dos cerebros (el microcontrolador STM32 que maneja el hardware duro y el módulo ESP32 que maneja el Wi-Fi/Nube), la sincronización es el eslabón más débil. Al forzar firmas hexadecimales exactas mediante enums de tipado estricto, evitas crear arreglos de mapeo complejos. Cuando el ESP32 reciba el byte 0x20, su código fuente (que compartirá este mismo archivo .h de Enums) sabrá instantáneamente que el despachador está en FSM_DESPACHANDO, sin parsear cadenas de texto ni arriesgar desbordamientos de memoria.
typedef aplican Type Safety, permitiendo al compilador atrapar errores lógicos de transición de estados.0x00. El ruido eléctrico en una pista de la PCB o una memoria no inicializada se lee como ceros. Asigna valores explícitos..h) con las definiciones de estos enumeradores entre el firmware de tu STM32 y el firmware del ESP32 garantiza que ambos hablen un protocolo de telemetría inquebrantable.