DÍA 046 DE 365

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

📖 Teoría a Estudiar

Multiprocesamiento: Delegación de Tareas y Comunicación UART

En sistemas embebidos de misión crítica, intentar que un solo microcontrolador maneje hardware en tiempo real (sensores, válvulas) y, al mismo tiempo, gestione la pila de red Wi-Fi o Bluetooth, es una receta para el desastre. Las librerías de red son intrínsecamente bloqueantes e impredecibles.

La solución profesional es el Multiprocesamiento Asimétrico. Un microcontrolador principal (ARM Cortex-M) ejecuta código C puro "bare-metal" enfocado al 100% en el control industrial. Cuando necesita reportar algo a la nube o a una app, empaqueta los datos y se los envía por UART a un co-procesador dedicado a comunicaciones (como un ESP32).

STM32 (Cortex-M) Lógica Crítica Matemática Entera C Puro TX RX GND Trama Binaria UART ACK / Comandos Tierra Común (Referencia) ESP32 (Módulo Wi-Fi) Pila TCP/IP Servidor Web Asíncrono RX TX GND

El Protocolo Binario (Adiós al sprintf)

Enviar texto plano por UART usando `sprintf` (ej. "LITROS:15.50\n") devora la memoria Flash del microcontrolador y requiere costosas conversiones de caracteres. Para mantener la arquitectura ligera y libre de bloqueos, diseñaremos un protocolo binario. Desarmaremos los enteros de 32 bits usando operaciones a nivel de bits (bitwise) y los enviaremos como un arreglo de bytes con un Byte de Inicio y un Checksum de seguridad.

⚙️ Ejercicios Prácticos

Pasos para la implementación:

  1. Definir la estructura de la trama: [START_BYTE] [COMANDO] [BYTE_ALTO] ... [BYTE_BAJO] [CHECKSUM].
  2. Usar corrimientos lógicos (>>) y máscaras AND (&) para fragmentar un uint32_t en 4 partes de 8 bits.
  3. Calcular un Checksum simple mediante compuertas lógicas XOR (^) para que el módulo receptor valide la integridad de los datos, descartando tramas corruptas.

Ejercicio 1: Escribe la función constructora del paquete en C, lista para integrarse en tu máquina de estados.


#include <stdint.h>

// --- CONSTANTES DEL PROTOCOLO ---
#define UART_START_BYTE 0xAA
#define CMD_REPORTE_LITROS 0x01
#define CMD_ESTADO_SISTEMA 0x02

// Función ficticia que representa la escritura directa al registro de datos de la UART
extern void UART_Transmit_Byte(uint8_t data);

// --- CONSTRUCTOR DE TRAMA BINARIA ---
// No usa arreglos dinámicos, ni strings, ni operaciones flotantes.
void Cortex_EnviarPaqueteESP32(uint8_t comando, uint32_t valor_datos) {
    uint8_t trama[7];
    
    // 1. Cabecera
    trama[0] = UART_START_BYTE;
    trama[1] = comando;
    
    // 2. Fragmentación del Payload (Data) usando Bitwise manipulation
    // Desplaza los bits a la derecha y enmascara solo los 8 bits menos significativos
    trama[2] = (valor_datos >> 24) & 0xFF; // MSB (Most Significant Byte)
    trama[3] = (valor_datos >> 16) & 0xFF;
    trama[4] = (valor_datos >> 8)  & 0xFF;
    trama[5] = valor_datos & 0xFF;         // LSB (Least Significant Byte)
    
    // 3. Cálculo de Checksum (XOR de comando y datos)
    // El receptor hará esta misma matemática. Si el resultado difiere, hubo ruido eléctrico.
    trama[6] = trama[1] ^ trama[2] ^ trama[3] ^ trama[4] ^ trama[5];
    
    // 4. Transmisión bloque a bloque por el periférico
    for(uint8_t i = 0; i < 7; i++) {
        UART_Transmit_Byte(trama[i]);
    }
}

int main(void) {
    // Simulación del Súper Bucle
    while(1) {
        // Imagina que el sistema calculó los litros dispensados multiplicados por 100
        // (15.50 litros = 1550) para no usar floats.
        uint32_t litros_por_100 = 1550; 
        
        // Se reporta al Módulo Wi-Fi de forma transparente y eficiente
        Cortex_EnviarPaqueteESP32(CMD_REPORTE_LITROS, litros_por_100);
        
        // El Cortex sigue operando las válvulas sin detenerse a procesar protocolos web
        // ...
    }
    return 0;
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Integración del Módulo Wi-Fi mediante Multiprocesamiento.

El corazón de tu despachador (el STM32) está leyendo sensores analógicos y controlando hardware de potencia industrial. Cuando finaliza una carga de gas LP, necesitas guardar ese registro de servicio, ruta y evento en una memoria EEPROM y enviar el reporte a la plataforma en la nube.

Aquí es donde tu módulo Wi-Fi entra en acción. Al conectar físicamente el pin TX del STM32 al pin RX de tu módulo de comunicaciones y compartir una tierra común (GND), estableces un puente de datos. Usando la trama binaria que acabas de diseñar, el STM32 informa los "litros dispensados y cobro total" de forma instantánea mediante enteros puros, y puede volver de inmediato a la supervisión de las válvulas neumáticas, sin importar si el Wi-Fi de la gasera se cayó o si el servidor tarda 3 segundos en responder.

📝 Resumen del Día

❓ Cuestionario de Autoevaluación

1. ¿Qué ocurriría si el STM32 manejara directamente las peticiones HTTP de la red en lugar de enviarlas por UART al ESP32?
Respuesta: El microcontrolador pasaría milisegundos (o segundos) esperando respuestas TCP/IP (comportamiento bloqueante). Durante esa pausa, el Súper Bucle se detendría, perdiendo pulsos de los medidores de flujo o fallando en el cierre inmediato de una válvula de gas por motivos de seguridad.

2. En el código proporcionado, ¿cómo logrará el módulo Wi-Fi (ESP32) reconstruir el número 1550 a partir de los 4 bytes separados?
Respuesta: El módulo receptor deberá aplicar el proceso inverso: tomar los bytes recibidos y desplazarlos hacia la izquierda (<<) uniéndolos con operadores OR (|) dentro de una variable de 32 bits, logrando así recuperar el valor original exacto usando matemática rápida y sin conversiones de texto.