DÍA 320 DE 365

Fase 5: Diseño Industrial y Hardware

📖 Teoría a Estudiar

El Significado del Grado Beta (Beta-Tester)

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).

La Prueba de Pre-Vuelo (Pre-Flight Check)

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.

PROTOCOLO FAT: FACTORY ACCEPTANCE TEST (GRADO BETA) HARDWARE Y PCB Diodos Flyback OK Star Ground Validado Filtro RC en NRST Optoaisladores 24V Pull-Ups de I2C OK MECÁNICO / GABINETE Sellos NEMA 4X OK Wire Looming (Peinado) Botón E-Stop Físico Cables Etiquetados Barniz Dieléctrico PCB LEGAL Y METROLOGÍA STM32 RDP Nivel 1 Switch Calibración HW Sello de Plomo (PROFECO) Fixed-Point Math (64b) Compensación API 54 FIRMWARE Y RED Test E2E de Negocio Timeout FSM State Hardware Watchdog Git Release v1.0 SHA Pre-Flight POST Activo LA RUTINA POST (Power-On Self Test) - FIRMWARE PRE-FLIGHT 1. PING I2C/SPI 2. ADC RANGES 3. EEPROM CRC 4. ESP32 HEARTBEAT READY

⚙️ Ejecución de la Auditoría FAT (Pasos de Taller)

Con tu lista de cotejo en mano, el Jefe de Ingeniería (Tú) ejecuta lo siguiente antes de sellar las 5 máquinas piloto:

  1. Shake Test (Prueba de Vibración): Golpea ligeramente la placa y los arneses con el mango de un destornillador. Si la pantalla parpadea o el equipo se resetea, tienes una soldadura fría o un conector flojo. Vuelve al cautín.
  2. Thermal Camera Test (Prueba Térmica): Enciende el relé de las válvulas durante 30 minutos continuos. Observa la placa con una cámara térmica. Si el regulador DC-DC (Buck) o el Optoacoplador supera los 65°C, tu cálculo de disipación de cobre (Día 275) falló.
  3. Short-to-Ground Test (Cortocircuito a Chasis): Con la máquina APAGADA, mide continuidad con el multímetro entre la bornera de +24V y el gabinete de acero. Debe marcar Infinito (O.L). Si hay continuidad, hay un cable prensado que causará un incendio al encender.

💻 Firmware: La Rutina POST (Pre-Flight Audit)

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);
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

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.

📝 Resumen del Día