En el software web, una versión "Beta" significa que el cliente probará el código y reportará los botones que no funcionan. En el hardware industrial petroquímico, enviar un Beta a campo significa que confías tu carrera, y posiblemente vidas humanas, a la solidez de tu equipo. Un Beta-Tester probará la usabilidad de la pantalla y la precisión del gas, pero no debe probar la seguridad; la seguridad debe estar garantizada desde la fábrica mediante un FAT (Factory Acceptance Test).
Un avión no despega esperando que los motores no se apaguen en el aire; la computadora los audita en la pista. De igual forma, tu STM32 no puede iniciar el bucle while(1) o arrancar el RTOS si un cable de sensor está dañado. Diseñaremos una rutina de "Pre-Vuelo" (POST: Power-On Self Test) que ejecute un sondeo eléctrico de toda la placa en los primeros 2 segundos de encendido.
Con tu lista de cotejo en mano, el Jefe de Ingeniería (Tú) ejecuta lo siguiente antes de sellar las 5 máquinas piloto:
No basta con encender la pantalla y decir "Bienvenido". El firmware debe verificar sus propios órganos antes de permitir la venta. Si el sensor de presión SPI no responde, arrancar la Máquina de Estados es un suicidio.
/**
* @file system_preflight_audit.c
* @brief Auditoría Exhaustiva de Hardware en el Arranque (POST)
*/
#include "stm32f4xx_hal.h"
#include <stdio.h>
#include <stdbool.h>
extern I2C_HandleTypeDef hi2c1;
extern SPI_HandleTypeDef hspi1;
extern void LCD_Display_Fatal_Error(const char* msg);
// Direcciones físicas de los periféricos
#define LCD_I2C_ADDR (0x27 << 1)
#define EEPROM_I2C_ADDR (0x50 << 1)
// =========================================================================
// VALIDACIÓN DE RUTINA DE PRE-VUELO (BOOT DIAGNOSTIC)
// =========================================================================
/**
* @brief Ejecuta el escrutinio de todos los buses y sensores de hardware.
* @retval bool: TRUE si el hardware está intacto y listo para operar.
*/
bool Execute_PreFlight_Hardware_Audit(void) {
printf("\r\n[POST] Iniciando Pre-Flight Hardware Audit...\r\n");
// 1. AUDITAR BUS I2C (Pantalla y Memoria de K-Factor)
printf(" -> Auditando I2C Bus... ");
if (HAL_I2C_IsDeviceReady(&hi2c1, LCD_I2C_ADDR, 3, 100) != HAL_OK) {
printf("[FAIL] Pantalla LCD no detectada.\r\n");
// No podemos usar LCD_Display_Fatal_Error porque la pantalla no sirve.
// Hacemos parpadear el LED Rojo de falla de placa en patrón SOS.
return false;
}
if (HAL_I2C_IsDeviceReady(&hi2c1, EEPROM_I2C_ADDR, 3, 100) != HAL_OK) {
printf("[FAIL] EEPROM Metrológica no responde.\r\n");
LCD_Display_Fatal_Error("SYS: EEPROM I2C FAIL");
return false;
}
printf("[OK]\r\n");
// 2. AUDITAR LA INTEGRIDAD DE LA MEMORIA (CRC)
printf(" -> Validando K-Factor CRC... ");
if (!EEPROM_Validate_Metrology_CRC()) {
printf("[FAIL] K-Factor Corrupto.\r\n");
LCD_Display_Fatal_Error("SYS: CALIBRATION CORRUPT");
return false;
}
printf("[OK]\r\n");
// 3. AUDITAR BUS SPI (Sensor PT100)
printf(" -> Auditando SPI (MAX31865)... ");
if (!MAX31865_Read_Fault_Register()) {
// La librería lee el registro interno del chip. Si devuelve error de hardware
// (Ej. RTD Abierto o Corto), abortamos.
printf("[FAIL] Falla de Hardware en PT100.\r\n");
LCD_Display_Fatal_Error("SYS: SPI TEMP FAIL");
return false;
}
printf("[OK]\r\n");
// 4. AUDITAR LAZOS ANALÓGICOS (4-20mA)
printf(" -> Auditando Lazos ADC... ");
uint16_t pres_adc = Read_Pressure_ADC_Clean(); // Día 314
if (pres_adc < 200 || pres_adc > 3900) {
printf("[FAIL] ADC Fuera de Rango (Cable roto o Corto).\r\n");
LCD_Display_Fatal_Error("SYS: ADC LOOP FAIL");
return false;
}
printf("[OK]\r\n");
// 5. AUDITAR DOMINIO DE RED (ESP32)
printf(" -> Esperando Heartbeat del ESP32... ");
if (!Wait_For_ESP32_Boot(5000)) { // Timeout de 5 segundos
printf("[WARN] Modulo Wi-Fi no responde. Iniciando en Modo OFFLINE.\r\n");
// Nota: Esto no es fatal. La máquina puede despachar gas sin internet.
} else {
printf("[OK]\r\n");
}
printf("\r\n[V] PRE-FLIGHT AUDIT COMPLETADO. SISTEMA HARDWARE VERIFICADO.\r\n");
return true;
}
// Bucle Main de Arranque
int main(void) {
Hardware_Init();
if (!Execute_PreFlight_Hardware_Audit()) {
// El hardware físico tiene un problema mortal.
// El bucle principal muere aquí. La máquina jamás abrirá una válvula.
while(1) {
HAL_IWDG_Refresh(&hiwdg); // Mantenemos vivo para que el LED de error siga encendido
LED_Fault_Blink();
HAL_Delay(500);
}
}
// Si llegamos aquí, el Hardware base es 100% confiable.
// === [ FIN DE LA FASE 5 BARE-METAL ] ===
// En la Fase 6, aquí invocaremos:
// Init_RTOS_Tasks();
// vTaskStartScheduler();
while(1);
}
Objetivo del día: Certificación de Plataforma Base e Inmunización contra Defectos de Fábrica.
Has pasado de conectar cables en un protoboard a auditar maquinaria industrial de Misión Crítica. Un estudiante cruza los dedos al encender su proyecto, rezando para que la pantalla encienda. Un Arquitecto de Sistemas programa su máquina para que se audite a sí misma a nivel eléctrico y lógico antes de que un humano pueda interactuar con ella.
Al implementar el **Checklist FAT** y la rutina `Execute_PreFlight_Hardware_Audit()`, sellaste definitivamente las vulnerabilidades de tu hardware. Tu código ahora hace un ping en el bus I2C (enviando la dirección `0x27`) solo para ver si la pantalla responde con un Acknowledgment. Revisa el CRC de la EEPROM para garantizar que nadie alteró el archivo de calibración con un rayo electromagnético. Sondea el lazo analógico para comprobar que los cables de presión no fueron mutilados durante el envío en el camión de carga. Si alguna de estas pruebas de estrés físico falla, el firmware ejecuta un bloqueo absoluto de los relés, mostrando un diagnóstico exacto y evitando una explosión potencial en la gasera.
Tu hardware ya no es un experimento. Es una plataforma sólida, sellada, auditable y segura. La Fase 5 ha concluido. Has dominado el mundo físico.