DÍA 321 DE 365

Fase 5: Diseño Industrial y Hardware

📖 Teoría a Estudiar

El Concepto del SAT (Site Acceptance Test)

A diferencia del FAT (que haces en tu taller con herramientas e instrumentos), el SAT se realiza en las instalaciones del cliente (la gasera). El objetivo es validar la interacción de tu equipo con los sistemas del mundo real: la bomba centrífuga de 5HP del cliente, la red Wi-Fi inestable de la estación, y el voltaje fluctuante de la red de CFE. Si la placa madre tiene un punto débil ante el ruido electromagnético ambiental, el SAT lo revelará.

La Curva de la Bañera (The Bathtub Curve)

En ingeniería de confiabilidad, la tasa de fallas de un hardware tiene forma de U:

  1. Mortalidad Infantil (Primeras 2 semanas): Fallas altísimas. Se deben a defectos de manufactura (soldaduras frías, chips defectuosos de fábrica). Aquí es donde tu grupo Beta de 5 a 10 máquinas sufrirá.
  2. Vida Útil (Años 1 al 7): Tasa de fallas plana y muy baja. Fallos aleatorios o por desgaste esperado.
  3. Desgaste Final (Wear-out): Las fallas se disparan nuevamente porque los relés mecánicos llegaron a su límite de ciclos y los capacitores electrolíticos se secaron.
MONITOREO BETA: LA CURVA DE LA BAÑERA (RELIABILITY) Tiempo (Años) Tasa de Fallas (λ) MORTALIDAD INFANTIL VIDA ÚTIL ÚTIL (Constant Failure Rate) DESGASTE (Wear-out) VENTANA BETA Descubrimiento de soldaduras frías y bugs lógicos. PAYLOAD DE SALUD DEL SISTEMA (ENVIADO A AWS CADA 24H) MAX_TEMP: 62°C MIN_VCC: 3.10V UPTIME: 340 Hrs WDT_RESETS: 0

⚙️ Procedimiento Práctico: Criterios del Piloto Beta

Paso 1: Selección del Sitio (El peor escenario).
No instales tu primera máquina en la gasera nueva y limpia con techo sombra. Instálala en la peor estación de tu cliente: la que está a la intemperie, junto a una avenida con vibración constante de camiones, y donde la red de CFE es inestable. Si tu hardware sobrevive a la "Prueba del Ácido" allí, sobrevivirá en cualquier parte.

Paso 2: Aislamiento del Cliente.
Durante el Piloto Beta, tu máquina no debe procesar dinero real del cliente final sin una auditoría paralela. En metrología, la máquina Beta se instala en serie o paralelo con una máquina antigua ya certificada. Si hay una discrepancia volumétrica, se cree a la máquina vieja. Tu máquina es estrictamente un "Monitor" (Shadow Mode) hasta que demuestre 0% de desviación.

Paso 3: El Paquete de Signos Vitales.
Una máquina beta que se reinicia sola y no te avisa es inútil. El firmware debe registrar los voltajes mínimos históricos (para probar Brownouts), la temperatura máxima del microcontrolador (Overheating), y el contador de veces que el Watchdog tuvo que matar a la máquina. Este paquete se envía a la nube una vez al día.

💻 Firmware: El Monitor de Salud ("Caja Negra")

Programaremos una estructura en C (`struct`) que actuará como la Caja Negra del avión. En cada ciclo del bucle principal, el STM32 verificará si batió algún récord negativo (Ej. el voltaje cayó más bajo que nunca) y lo guardará. Esta estructura se enviará al módulo ESP32 por UART.


/**
 * @file telemetry_health_monitor.c
 * @brief Registro de Signos Vitales para Monitoreo de Flota Beta
 */

#include "stm32f4xx_hal.h"
#include <stdint.h>
#include <stdio.h>

// Abstracciones de sensores internos del STM32
extern float ADC_Read_Internal_Temperature(void);
extern float ADC_Read_Internal_VREF(void);
extern uint32_t Get_Watchdog_Reset_Count_From_EEPROM(void);

// =========================================================================
// ESTRUCTURA DE LA CAJA NEGRA (PAYLOAD)
// =========================================================================
typedef struct {
    uint32_t uptime_seconds;       // Tiempo total de vida en este ciclo de poder
    float max_mcu_temp_C;          // Temperatura máxima alcanzada por el silicio
    float min_vcc_voltage;         // Caída máxima de voltaje detectada
    uint16_t wdt_reset_count;      // Cuántas veces colapsó el código (Histórico)
    uint16_t flow_timeouts;        // Cuántas veces se cerró la válvula por emergencia
} SystemHealth_t;

SystemHealth_t Machine_Vitals = {
    .uptime_seconds = 0,
    .max_mcu_temp_C = -100.0f,
    .min_vcc_voltage = 5.0f,
    .wdt_reset_count = 0,
    .flow_timeouts = 0
};

// =========================================================================
// ACTUALIZADOR DE SIGNOS VITALES (Ejecutar cada 1 segundo)
// =========================================================================
void HealthMonitor_Update(void) {
    
    // 1. Actualizar Uptime
    Machine_Vitals.uptime_seconds++;
    
    // 2. Monitoreo Térmico (Buscar el peor caso)
    float current_temp = ADC_Read_Internal_Temperature();
    if (current_temp > Machine_Vitals.max_mcu_temp_C) {
        Machine_Vitals.max_mcu_temp_C = current_temp;
    }
    
    // 3. Monitoreo de Energía (Buscar caídas de voltaje)
    float current_vcc = ADC_Read_Internal_VREF();
    if (current_vcc < Machine_Vitals.min_vcc_voltage) {
        Machine_Vitals.min_vcc_voltage = current_vcc;
    }
}

// =========================================================================
// EMPAQUETADO PARA TRANSMISIÓN IoT (ESP32 -> AWS)
// =========================================================================
/**
 * @brief Convierte los datos a un log legible o JSON binario para enviar al ESP32.
 * Esta función se dispara por un Timer (ej. Cada 24 horas) o si la máquina sufre pánico.
 */
void HealthMonitor_Transmit_To_Cloud(void) {
    
    // Recuperar el contador histórico de muertes guardado en la memoria no volátil
    Machine_Vitals.wdt_reset_count = Get_Watchdog_Reset_Count_From_EEPROM();
    
    // Empaquetado simple para UART (En producción usaríamos struct raw empaquetado)
    char payload_buffer[128];
    snprintf(payload_buffer, sizeof(payload_buffer), 
             "SYS_HEALTH|UP:%lu|TMAX:%.1f|VMIN:%.2f|RST:%u|ERR:%u",
             Machine_Vitals.uptime_seconds,
             Machine_Vitals.max_mcu_temp_C,
             Machine_Vitals.min_vcc_voltage,
             Machine_Vitals.wdt_reset_count,
             Machine_Vitals.flow_timeouts);
             
    printf("\r\n[TELEMETRÍA] Enviando Signos Vitales: %s\r\n", payload_buffer);
    
    // Aquí invocamos la función de transmisión UART (Día 313)
    // ESP32_UART_Transmit(payload_buffer);
    
    // Reseteamos los umbrales transitorios tras reportarlos
    Machine_Vitals.max_mcu_temp_C = -100.0f;
    Machine_Vitals.min_vcc_voltage = 5.0f;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Telemetría Forense y Supervivencia en la Fase de Mortalidad Infantil.

Enviar una máquina a campo sin telemetría interna es como soltar una sonda espacial sin radio. Si la máquina muere, el cliente te llamará furioso y tú llegarás a ver un gabinete apagado sin pistas de qué salió mal. ¿Fue el calor del mediodía? ¿Fue un pico de bajo voltaje de los motores de la gasera? En la etapa Beta, el Hardware está atravesando la fase de "Mortalidad Infantil" de la curva de la bañera. Las soldaduras frías se romperán por vibración y los capacitores defectuosos estallarán.

Al implementar el struct de **Signos Vitales**, has dotado a tu STM32 de conciencia situacional a largo plazo. Utilizando los canales ADC internos del propio procesador ARM (que leen el voltaje de referencia y el sensor de temperatura incrustado en el silicio), la placa registra en silencio sus mayores traumas. Si la máquina se resetea por el Watchdog, el evento queda grabado en la EEPROM. Al recuperar el pulso, lo primero que hará la máquina es empacar esa autopsia en un paquete de telemetría y gritarlo a la nube a través del ESP32. Esta es la madurez máxima del código Bare-Metal: un sistema que, incluso al fallar, proporciona a su Creador los datos exactos para parchear el problema en el siguiente lote de producción.

📝 Resumen del Día