DÍA 049 DE 365

Fase 1: Fundamentos de C y Lógica de Software

📖 Teoría Explícita: Metrología y Termodinámica

1. La Dilatación Volumétrica

El Gas LP líquido tiene un coeficiente de expansión térmica alto ($\alpha$). Esto significa que por cada grado Celsius de diferencia respecto a la temperatura de referencia, su volumen aparente cambia sustancialmente aunque su masa permanezca intacta. La ecuación básica que gobierna esto es:

$$ V_c = V_m \times [1 - \alpha(T_m - T_b)] $$

Donde $V_c$ es el volumen compensado (neto), $V_m$ es el volumen bruto medido por tu flujómetro, $\alpha$ es el coeficiente de dilatación del Gas LP (aprox. 0.003 per °C), $T_m$ es la temperatura actual del líquido y $T_b$ es la temperatura base legal (20°C en muchas normativas).

2. Abstracción a Punto Fijo

Si introduces esa ecuación tal cual en tu MCU, el compilador usará rutinas de coma flotante por software que colapsarán la eficiencia del sistema. Para resolverlo, multiplicaremos toda la ecuación por 1000. Así, el factor base es 1000. El coeficiente $\alpha$ de 0.003 se convierte en el número entero 3. Todo el cálculo térmico se reduce a sumas, restas y multiplicaciones enteras fulminantes.

MOTOR DE COMPENSACIÓN TÉRMICA Vol. Bruto (Vm) Desde Factor-K Sensor Temp (Tm) ADC -> 30°C Cálculo de Factor F = 1000 - ((30 - 20) * 3) Factor = 970 x Vol. Neto (Vc) (Vm * 970) / 1000 Física del Despacho A 30°C el gas está expandido. El factor es menor a 1000 (0.970). El microcontrolador descontará el 3% del volumen bruto cobrado para ser justo.

⚙️ Ejercicios Prácticos: Fórmula Metrológica C

Ejercicio 1: Integraremos la compensación térmica al motor metrológico. Tomaremos el volumen bruto en mililitros calculado en el Día 48 y lo pasaremos por este filtro termodinámico utilizando aritmética 100% entera.


#include <stdint.h>

// --- 1. CONSTANTES TERMODINÁMICAS ---
// Temperatura legal base para México (20°C)
#define TEMPERATURA_BASE_C  20 

// Coeficiente de expansión del Gas LP (Propano/Butano mix)
// Aprox 0.003. Multiplicado por 1000 para usar enteros = 3
#define COEF_EXPANSION_X1000 3 


// --- 2. FUNCIÓN DE COMPENSACIÓN TÉRMICA ---
/**
 * @brief Aplica corrección térmica de volumen usando punto fijo (Base 1000).
 * @param volumen_bruto_ml El volumen leído por el flujómetro.
 * @param temperatura_actual_c La temperatura de la tubería leída por el ADC.
 * @return El volumen neto (compensado) en mililitros.
 */
uint32_t Metrologia_Compensar_Volumen(uint32_t volumen_bruto_ml, int8_t temperatura_actual_c) {
    
    int32_t factor_compensacion = 1000;
    int8_t delta_temperatura = temperatura_actual_c - TEMPERATURA_BASE_C;
    
    // Si la temperatura es mayor a 20°C, el gas está expandido (menos denso).
    // Debemos reducir el volumen cobrado restando al factor.
    // Si es menor a 20°C, delta será negativo, por lo que la resta de un negativo sumará, 
    // aumentando el volumen registrado (el gas está más denso).
    
    factor_compensacion = factor_compensacion - (delta_temperatura * COEF_EXPANSION_X1000);
    
    // RED DE SEGURIDAD: Limitar el factor en caso de falla catastrófica del sensor de temperatura.
    // Si el sensor ADC se cortocircuita y lee 100°C, no queremos que la máquina regale el gas.
    if (factor_compensacion < 850) factor_compensacion = 1000; // Desactivar compensación si es ilógico
    if (factor_compensacion > 1150) factor_compensacion = 1000;
    
    // Aplicar el factor al volumen (Punto fijo: Multiplicar y dividir)
    // Usamos uint64_t internamente para prevenir overflow al multiplicar millones de mililitros
    uint64_t volumen_neto_temp = ((uint64_t)volumen_bruto_ml * factor_compensacion) / 1000;
    
    return (uint32_t)volumen_neto_temp;
}


// --- 3. SÚPER BUCLE DE METROLOGÍA ---
extern uint32_t Metrologia_Calcular_Mililitros(uint32_t pulsos); // Función del Día 48
extern int8_t Leer_Temperatura_Sensor_ADC(void);

int main(void) {
    
    uint32_t pulsos_acumulados = 5000; // Recibidos del DMA/Interrupción
    
    while(1) {
        // 1. Obtener Volumen Bruto
        uint32_t volumen_bruto_ml = Metrologia_Calcular_Mililitros(pulsos_acumulados);
        
        // 2. Obtener Temperatura
        int8_t temp_c = Leer_Temperatura_Sensor_ADC();
        
        // 3. Compensación Legal
        uint32_t volumen_neto_ml = Metrologia_Compensar_Volumen(volumen_bruto_ml, temp_c);
        
        // 4. Cobro
        // uint32_t costo_total = (volumen_neto_ml * PRECIO_POR_LITRO) / 1000;
    }
    
    return 0;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Certificación y Exactitud Metrológica.

Con la implementación de este motor de compensación térmica en C puro, tu máquina ya no es solo un contador de pulsos ciego. Al vincular las lecturas analógicas (del sensor RTD de temperatura de la tubería) con la lógica del microcontrolador sin usar la pesada librería `math.h` ni variables `float`, aseguras que el corte volumétrico final de la electroválvula sea absolutamente exacto sin importar la estación del año ni el calor de la planta industrial. Esta capacidad computacional es exactamente lo que separa un prototipo escolar de una unidad vendible comercialmente.

📝 Resumen del Día