DÍA 305 DE 365

Fase 5: Diseño Industrial y Hardware

📖 Teoría a Estudiar

El "Quick Start Guide" (QSG) Industrial

A diferencia de un manual de servicio técnico (que contiene esquemáticos y descripciones de la API 54), el QSG es una lámina plastificada, generalmente adherida al costado del gabinete o entregada al operador de la gasera. Su propósito es responder tres preguntas fundamentales en menos de 10 segundos:

  1. ¿Cómo inicio un despacho seguro?
  2. ¿Qué significan las luces y los errores en la pantalla?
  3. ¿Cómo detengo la máquina si todo sale mal?

La Interfaz Hombre-Máquina (HMI)

Para que un QSG sea efectivo, la carátula de tu equipo (Front Panel) debe ser intuitiva. Debes emplear la psicología del color industrial: Verde para arrancar o estado seguro, Amarillo para advertencias o estado activo, y Rojo exclusivo para paros de emergencia o fallas críticas. La pantalla de cristal líquido (LCD) o los displays de 7 segmentos deben priorizar el tamaño de los números sobre el texto descriptivo.

PANEL FRONTAL HMI (INTERFACE OPERATIVA) MOBAGAS L.P. $ 450.50 L 41.713 > DESPACHANDO... READY FLOW FAULT PARO DE EMERGENCIA 1. VERIFICA Precio y estado. 2. PROGRAMA Ingresa $ y presiona Verde. 3. ABORTAR (EMERGENCIA) Golpear para cortar energía a las válvulas.

⚙️ Estructura del Documento QSG

Un Quick Start Guide físico debe plastificarse (para resistir grasa y agua) e incluir tres secciones críticas:

  1. Arranque Seguro (Power-On):
    • Gire el botón rojo de E-Stop (Paro de Emergencia) a la derecha para liberarlo.
    • Verifique que el LED Verde (READY) esté encendido fijo.
    • La pantalla mostrará "LISTO". Si muestra otra cosa, consulte la tabla de errores.
  2. Despacho (Operación Normal):
    • Conecte la manguera al tanque del cliente y abra la válvula manual.
    • Use el teclado para teclear el monto en pesos (Ej. $200) o presione ENTER para llenado libre.
    • El LED Amarillo (FLOW) encenderá. Al terminar, cierre la válvula manual y retire la manguera.
  3. Solución de Problemas Visuales (Troubleshooting):
    • Error E01 (Sensor Temp): Cable del PT100 suelto. Llamar a mantenimiento.
    • Error E03 (Fuga/Presión): Cierre válvulas manuales. Tanque vacío o tubería fisurada.

💻 Firmware: Capa de Traducción HMI (Human-Machine Interface)

Tus rutinas de código interno devuelven valores enteros como false o números hexadecimales como 0x0A. El despachador no sabe qué significa 0x0A. Hoy crearemos el módulo HMI que intercepta los errores del sistema y los renderiza en la pantalla LCD utilizando lenguaje humano claro y accionable.


/**
 * @file hmi_display_manager.c
 * @brief Capa de presentación para la Pantalla LCD y gestión visual de errores.
 */

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

// Abstracción del hardware de la pantalla (Depende de si es I2C, SPI o Paralelo)
extern void LCD_Clear(void);
extern void LCD_Print_Line(uint8_t line, const char* text);
extern void LED_Fault_Set(bool state);

// Enumeración de Códigos de Error Internos del Sistema (Provenientes de Días anteriores)
typedef enum {
    ERR_NONE = 0,
    ERR_ESTOP_PRESSED,    // El hongo rojo fue presionado
    ERR_SENSOR_PT100,     // Fallo en lectura SPI térmica (Día 300)
    ERR_PRESSURE_LEAK,    // Prueba hidrostática fallida (Día 298)
    ERR_TIMEOUT_FLOW,     // Watchdog de software disparado (Día 303)
    ERR_EEPROM_CORRUPT    // Falla de K-Factor (Día 299)
} SystemError_t;

// =========================================================================
// TRADUCTOR DE CÓDIGOS DE MÁQUINA A LENGUAJE HUMANO (HMI)
// =========================================================================
/**
 * @brief Toma un código de error de la FSM central y lo presenta al operario.
 * @param err_code: El error detectado por los algoritmos subyacentes.
 */
void HMI_Show_System_Halt(SystemError_t err_code) {
    
    LCD_Clear();
    LED_Fault_Set(true); // Enciende el LED rojo intenso del panel
    
    // La primera línea siempre indica el nivel de severidad
    LCD_Print_Line(0, "!! PARO DE SISTEMA !!");

    // Traducción legible del error para el Quick Start Guide
    switch(err_code) {
        
        case ERR_ESTOP_PRESSED:
            LCD_Print_Line(1, "BOTON DE EMERGENCIA");
            LCD_Print_Line(2, "ACTIVADO. GIRE PARA");
            LCD_Print_Line(3, "LIBERAR Y REINICIAR.");
            break;
            
        case ERR_SENSOR_PT100:
            LCD_Print_Line(1, "ERROR: E01 (TEMPERATURA)");
            LCD_Print_Line(2, "FALLA SENSOR PT100.");
            LCD_Print_Line(3, "LLAMAR MANTENIMIENTO.");
            break;
            
        case ERR_PRESSURE_LEAK:
            LCD_Print_Line(1, "ERROR: E03 (PRESION)");
            LCD_Print_Line(2, "SISTEMA DESPRESURIZADO");
            LCD_Print_Line(3, "REVISAR FUGAS/BOMBA.");
            break;
            
        case ERR_TIMEOUT_FLOW:
            LCD_Print_Line(1, "ERROR: E04 (FLUJO)");
            LCD_Print_Line(2, "EL GAS NO AVANZA.");
            LCD_Print_Line(3, "MANGUERA CERRADA?");
            break;
            
        case ERR_EEPROM_CORRUPT:
            LCD_Print_Line(1, "ERROR: E99 (MEMORIA)");
            LCD_Print_Line(2, "FALLO METROLOGICO.");
            LCD_Print_Line(3, "EQUIPO CLAUSURADO.");
            break;
            
        default:
            LCD_Print_Line(1, "ERROR DESCONOCIDO.");
            LCD_Print_Line(2, "REINICIAR EQUIPO.");
            break;
    }
    
    // Opcional: Sonar un Buzzer piezoeléctrico
    // Buzzer_Beep(500); 
}

// =========================================================================
// RENDERIZADO DE OPERACIÓN NORMAL (VENTA)
// =========================================================================
void HMI_Update_Dispensing_Screen(float volume_L, float price_MXN) {
    char buffer_vol[20];
    char buffer_price[20];
    
    // Formateo de las cadenas a mostrar (Usando sprintf con cuidado, o funciones itoa custom)
    snprintf(buffer_price, sizeof(buffer_price), "$ %8.2f", price_MXN);
    snprintf(buffer_vol, sizeof(buffer_vol),   "L %8.3f", volume_L);
    
    LCD_Print_Line(0, buffer_price);
    LCD_Print_Line(1, buffer_vol);
    LCD_Print_Line(3, "> DESPACHANDO...");
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Usabilidad (UX Industrial) y Cumplimiento Normativo de Seguridad.

Un ingeniero novato asume que el usuario de su máquina es otro ingeniero. Deja los errores en la pantalla como `Stack Overflow at 0x0800A4B2` o `I2C NACK`. Un Arquitecto de Sistemas sabe que el usuario de su máquina es un empleado de estación de servicio, bajo presión, con clientes esperando. Si la pantalla no le dice exactamente qué hacer, el operario comenzará a golpear el equipo o presionará botones al azar, causando un accidente.

Al diseñar el panel frontal y documentar el **Quick Start Guide (QSG)** hoy, has cerrado el círculo de la usabilidad. El operador tiene un botón rojo de golpe rápido que interrumpe la energía física a las válvulas sin depender del software (E-Stop). Y cuando la máquina de estados preventiva que diseñamos en el Día 303 intercepta un error, la capa de Firmware `HMI_Display_Manager` que escribiste hoy no escupe código binario; escupe instrucciones precisas: *"EL GAS NO AVANZA. MANGUERA CERRADA?"*. Has transformado un complejo dispositivo de metrología termodinámica en una herramienta de trabajo intuitiva, demostrando que tu Tesis no es solo funcional en el laboratorio, sino operativa en el implacable mundo real.

📝 Resumen del Día