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:
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.
Un Quick Start Guide físico debe plastificarse (para resistir grasa y agua) e incluir tres secciones críticas:
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...");
}
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.