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).
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);
}
}
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.