DÍA 201 DE 365

Fase 4: FreeRTOS y Conectividad IoT

📖 Teoría a Estudiar

El Principio de Separación de Responsabilidades (SoC)

En el diseño de sistemas de Misión Crítica, rige la máxima: "No mezcles el cerebro con el módem". La arquitectura ideal consta de dos microcontroladores hablando entre sí a través de un bus inmune a bloqueos de software (usualmente UART RS-232 o UART TTL aislando voltajes).

El Maestro: STM32F4 (ARM Cortex-M4)

El Esclavo / Modem: ESP32 (Tensilica Xtensa)

ARQUITECTURA DE COPROCESAMIENTO: ARM CORTEX + ESP32 STM32F401 (Maestro) Hard Real-Time (Seguridad y Metrología) FreeRTOS Kernel Control Válvula Lectura Sensor EEPROM Fiscal UI / LCD SPI UART_TX_Task (JSON Parser) {"vol":20.5, "st":"OK"} UART (115200) Texto Plano (JSON) ESP32 (Modem/Coprocesador) Soft Real-Time (Criptografía y Redes) UART_RX_Task Lee JSON, serializa a Binario/MQTT TLS/SSL Encryption (mbedTLS) Carga CPU: Alta (Criptografía) WiFi Stack & MQTT Client Bloqueos de red absorbidos aquí AWS IoT Core

⚙️ Ejercicios Prácticos

Ejercicio 1: Programaremos la "Tarea Puente" dentro del STM32. Esta tarea (Thread_UART_Bridge) tendrá prioridad baja. Despertará, leerá la telemetría oficial de la máquina (utilizando nuestro Mailbox del Día 193), construirá un mensaje JSON ligero (aplicando los conocimientos de snprintf del Día 58) y lo inyectará al bus UART. El ESP32 estará del otro lado, escuchando ciegamente.


/**
 * @file iot_bridge_stm32.c
 * @brief Enlace serial STM32 -> ESP32 mediante JSON (Separation of Concerns)
 */

#include "stm32f401xe.h"
#include "cmsis_os2.h"
#include <stdio.h>

// El Mailbox que creamos en el Día 193 donde la Metrología deposita la verdad
extern osMessageQueueId_t mailbox_telemetria_id;

// Driver Bare-Metal del UART1 (Conectado a los pines RX/TX del ESP32)
extern UART_HandleTypeDef huart1;

// =======================================================
// LA TAREA PUENTE IoT (Corre en el STM32 - Prioridad Baja)
// =======================================================
void Thread_UART_Bridge(void *argument) {
    
    TelemetriaPresion_t datos_actuales;
    char buffer_json[128];
    int longitud_trama;
    
    for (;;) {
        // 1. Extraer la fotografía más reciente del estado de la máquina.
        // Si no hay datos nuevos, la tarea se bloquea y no gasta CPU.
        osStatus_t status = osMessageQueueGet(mailbox_telemetria_id, &datos_actuales, NULL, osWaitForever);
        
        if (status == osOK) {
            
            // 2. Construcción Segura del Payload JSON (Sin usar librerías Malloc)
            // Escapamos las comillas usando \"
            longitud_trama = snprintf(buffer_json, sizeof(buffer_json),
                "{\"device\":\"DISP_01\",\"psi\":%.2f,\"status\":\"OPERATING\"}\n",
                datos_actuales.presion_psi
            );
            
            // Verificamos que no haya ocurrido un desbordamiento (Buffer Overflow)
            if (longitud_trama > 0 && longitud_trama < sizeof(buffer_json)) {
                
                // 3. Envío al Coprocesador (ESP32) por Hardware UART
                // Como esta tarea tiene prioridad BAJA, si esta transmisión tarda 
                // varios milisegundos, el RTOS la pausará sin piedad si la Válvula 
                // (Prioridad Alta) necesita actuar. El ESP32 es tolerante a pausas.
                HAL_UART_Transmit(&huart1, (uint8_t*)buffer_json, longitud_trama, 100);
            }
        }
        
        // Enviamos telemetría hacia el ESP32 solo 1 vez por segundo.
        // El ESP32 se encargará de pelear con la criptografía y el WiFi.
        osDelay(1000); 
    }
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Aislamiento Cibernético y Robustez Criptográfica.

Conectar una máquina de despacho de combustible directamente a internet es un riesgo monumental. Si alguien ataca (DDoS) la dirección IP de tu máquina intentando saturar la red, y el procesador de metrología es el mismo que procesa los paquetes TCP/IP, el ataque ralentizará las matemáticas del controlador PID y la válvula fallará. Además, los certificados de seguridad de AWS (TLS 1.2) requieren operaciones matemáticas gigantescas (RSA 2048-bit) que devorarían la memoria de un STM32 básico.

Al implementar la **Arquitectura ARM+ESP**, has construido un Firewall físico. El ESP32 es el escudo. Él hace el "trabajo sucio": soporta los ataques de red, encripta los datos y pelea con las caídas del router WiFi de la gasolinera. El STM32F4 vive en una burbuja de tiempo perfecto, protegido de los retrasos del internet. Si el ESP32 colapsa y se reinicia, el STM32 ni siquiera se entera; sigue despachando gas y cobrando dinero, simplemente guardando los JSONs en su EEPROM interna I2C hasta que el módem (ESP32) despierte de nuevo y le pregunte: *"¿Qué me perdí?"*. Has dominado la arquitectura distribuida.

📝 Resumen del Día