En la industria de procesos, los sistemas rara vez se construyen pieza por pieza en el sitio del cliente. Se diseñan como un Skid (Módulo montado en patín). Esto significa que la base metálica, la tubería, el gabinete de control y el cableado se ensamblan y prueban rigurosamente en tu taller. Cuando el equipo llega a la gasolinera, la instalación toma minutos: conectar la entrada de gas, la salida, y la corriente eléctrica.
Al unificar piezas metálicas, el error más letal es el "Daisy Chaining" (conectar las tierras en cadena). Si conectas la tierra de la fuente 24V al chasis, luego del chasis a la PCB, y de la PCB al sensor, el ruido electromagnético de la fuente pasará a través de tu tarjeta antes de disiparse. La ley exige Star Grounding (Tierra en Estrella): existe un único perno de acero masivo en el gabinete (El Centro de la Estrella). Cada componente de metal (Gabinete, PCB, Tubería, Malla del Cable) debe tener su propio cable individual conectado directa y exclusivamente a este perno principal.
Paso 1: Montaje en Riel DIN.
Las cajas de cartón y la cinta doble cara son para prototipos. En la base de tu gabinete NEMA atornillarás un Riel DIN (DIN Rail 35mm). La fuente de poder de 24V (MeanWell o similar) se encaja (Snap-on) directamente en este riel. Tu PCB diseñada en KiCad debe atornillarse a un soporte plástico compatible con Riel DIN, asegurando que quede firme, aislada del metal posterior, y fácil de reemplazar si un técnico de campo necesita cambiarla en el futuro.
Paso 2: Ruteo de Arnés (Wire Harnessing).
Los cables que conectan tu placa a la puerta del gabinete (Pantalla LCD y Botones) sufrirán flexión mecánica cada vez que abras el equipo. Debes usar cable trenzado multifilar (Stranded wire), jamás alambre sólido. Agrupa los cables utilizando Espiral Plástico o Malla Expandible. Regla DFM: Todo cable que cruce una bisagra debe tener un "bucle de servicio" (Loop) en U, dándole holgura para no arrancar los conectores al abrir la tapa a 180 grados.
Paso 3: Inspección de Tierras.
Usa tu multímetro en modo "Continuidad". Coloca una punta en la tubería de gas de acero, otra punta en la carcasa del gabinete, y otra en el pin GND de la placa STM32. Todas deben tener resistencia cero hacia el cable de Tierra Física de la estación (el cable verde con raya amarilla). Esta es la protección definitiva contra rayos y electricidad estática.
Al ensamblar toda la máquina por última vez, no sabes si aplastaste un cable al apretar la tapa o si un conector I2C quedó suelto. Diseñaremos la rutina culminante de la Fase 5: un chequeo secuencial total del hardware. Si este código se ejecuta y enciende un LED verde, la arquitectura física es un éxito y estamos listos para instalar FreeRTOS.
/**
* @file sys_final_integration.c
* @brief Auditoría Máxima de Subsistemas de Hardware (Fase 5 - Día 301)
*/
#include "stm32f4xx_hal.h"
#include <stdbool.h>
#include <stdio.h>
// Dependencias de los 300 días anteriores
extern bool Clock_Init_HSE_Safe(void);
extern bool EEPROM_Load_K_Factor(void);
extern bool Hydraulic_Leak_Test_Routine(void);
extern bool I2C_Display_Ping(void);
extern bool SPI_MAX31865_Ping(void);
extern bool UART_ESP32_Ping(void);
// =========================================================================
// RUTINA DE VALIDACIÓN INTEGRAL DE SISTEMAS
// =========================================================================
/**
* @brief Escanea la salud de la electrónica, mecánica y comunicaciones.
* @retval bool: TRUE si la Tesis está mecánicamente lista para software.
*/
bool System_Hardware_Final_Audit(void) {
printf("\r\n==============================================\r\n");
printf(" INICIANDO AUDITORÍA INTEGRAL DE HARDWARE \r\n");
printf("==============================================\r\n");
// 1. Núcleo Lógico (Clocks & Memory)
printf("[1/6] Evaluando PLL y Cristal de Cuarzo...\r\n");
if(!Clock_Init_HSE_Safe()) {
printf(" [X] FALLO CORE: El procesador no está a 84MHz.\r\n");
return false;
}
printf(" [V] Núcleo Operativo a máxima velocidad.\r\n");
// 2. Metrología Persistente (EEPROM)
printf("[2/6] Leyendo K-Factor de Memoria No-Volátil...\r\n");
if(!EEPROM_Load_K_Factor()) {
printf(" [X] FALLO MEMORIA: EEPROM corrupta o I2C caído.\r\n");
return false;
}
printf(" [V] Constantes metrológicas cargadas.\r\n");
// 3. Sensor Térmico (SPI & MAX31865)
printf("[3/6] Sondeando Bus SPI Térmico (API 54)...\r\n");
if(!SPI_MAX31865_Ping()) {
printf(" [X] FALLO SPI: MAX31865 no responde. Revisa cable 4-Hilos.\r\n");
return false;
}
printf(" [V] Sensor PT100 en línea.\r\n");
// 4. Interfaz de Usuario (HMI)
printf("[4/6] Escaneando Display LCD (I2C)...\r\n");
if(!I2C_Display_Ping()) {
printf(" [!] WARNING HMI: Pantalla no detectada. Verifique arnés de puerta.\r\n");
// No es fatal para operar, pero requiere revisión
} else {
printf(" [V] Display HMI detectado.\r\n");
}
// 5. IoT & Cloud (UART)
printf("[5/6] Enlazando Coprocesador Wi-Fi ESP32...\r\n");
if(!UART_ESP32_Ping()) {
printf(" [X] FALLO IoT: Módulo ESP32 incomunicado.\r\n");
return false;
}
printf(" [V] Subsistema IoT listo.\r\n");
// 6. Integridad Estructural y Física
printf("[6/6] Ejecutando Prueba Hidrostática de Hermeticidad...\r\n");
// La válvula se cierra, inyecta presión, y mide caída por 5 segs para test rápido
if(!Hydraulic_Leak_Test_Routine()) {
printf(" [X] FALLO MECÁNICO: Fuga de presión detectada. NO OPERAR.\r\n");
return false;
}
printf(" [V] Cero fugas. Acero intacto.\r\n");
// VEREDICTO
printf("==============================================\r\n");
printf(" [!!!] PLATAFORMA DE HARDWARE CERTIFICADA [!!!] \r\n");
printf(" El sistema está listo para recibir el Sistema Operativo (RTOS).\r\n");
printf("==============================================\r\n");
// Encender LED Verde Fijo
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
return true;
}
int main(void) {
HAL_Init();
// Bucle infinito si el hardware falla la auditoría
while (!System_Hardware_Final_Audit()) {
HAL_Delay(5000); // Reintentar cada 5 segundos
}
// Si escapamos el bucle, la placa base es un éxito rotundo.
// Aquí es donde, a partir del Día 366 (Fase 6), llamaremos a:
// osKernelStart(); // [INICIO DE MAGIA RTOS]
while(1) {
// En Bare-Metal nos quedamos en HALT. La misión está cumplida.
}
}
Objetivo del día: Integración Multisistémica y Liberación Final de Hardware.
Durante 301 días has recorrido un camino de disciplina implacable. Comenzaste dudando si sabías suficiente electrónica (Día 1), luchaste contra los punteros de memoria en C, dominaste los registros del STM32, diseñaste pistas para tolerar Amperios, y blindaste tu silicio contra explosiones y agua a presión. Has construido una máquina que respeta la física, la química de los hidrocarburos y las matemáticas de la metrología legal.
El **Montaje Integral** de hoy es la manifestación física de tu ingeniería de sistemas. Tu hardware ya no es frágil. Al unificar la **Tierra en Estrella (Star Grounding)**, aseguraste que un rayo o la estática de una manguera de gas jamás corromperán tu procesador. Al ejecutar la rutina `System_Hardware_Final_Audit()`, has dotado a tu máquina de la capacidad de auto-inspeccionarse: desde la integridad de su memoria EEPROM hasta la hermeticidad de sus tubos de acero. Tómate un momento para contemplar el *Skid* ensamblado frente a ti. La Fase 5 ha concluido. El cuerpo de tu creación está mecánicamente y eléctricamente finalizado. El Hardware está liberado. ¡Has forjado la obra maestra de tu Tesis!