Vender un microcontrolador empotrado en una bomba de gas es un modelo de negocio lineal. Vender una red de dispositivos que se comunican entre sí para auditar toda la planta gasera es un modelo exponencial. Para consolidar tus habilidades de enrutamiento de PCBs y programación C en Bare-Metal, desarrollaremos módulos esclavo que le quitarán carga de trabajo al procesador maestro.
Proyecto 1: El Tótem de RS485.
Un microcontrolador secundario (Ej. un STM32G0 económico) con un transceptor MAX485. ¿Por qué no usar el código pesado de la librería estándar (stdlib) para imprimir en la pantalla de LEDs gigantes? Porque seguiremos nuestra filosofía estricta: capturaremos los bytes por interrupción UART y utilizaremos rutinas matemáticas de conversión a caracteres basadas en enteros exactos (stdint.h), eludiendo los desbordamientos clásicos de memoria.
Proyecto 2: Sonda de Presión (Lazo 4-20mA).
En instalaciones de Gas LP, la presión del tanque debe conocerse. Los sensores analógicos industriales envían una corriente (no un voltaje) de 4 a 20 mA para ser inmunes a las caídas de voltaje del cableado largo. En nuestra placa secundaria (diseñada en KiCad), colocamos una resistencia de precisión de $165 \Omega$ para convertir esa corriente en $0.66V - 3.3V$, rango perfecto para el ADC del STM32. Para estabilizar la señal inyectaremos matemáticas de sobremuestreo (Oversampling):
$V_{real} = \sum_{i=0}^{N-1} \frac{ADC_i}{N} \times \frac{3300}{4095}$
El siguiente fragmento consolida las prácticas de código desarrolladas en la Fase 5: lectura de hardware segura (ADC) con filtrado matemático en punto fijo, manteniendo el microcontrolador remoto sumamente rápido y eficiente.
/**
* @file remote_tank_probe.c
* @brief Proyecto Satélite 2: Lectura de Sonda Analógica 4-20mA con Oversampling
* Módulo periférico que envía la presión del tanque al Despachador Principal.
*/
#include "stm32f4xx_hal.h"
#include <stdint.h>
extern ADC_HandleTypeDef hadc1;
// =========================================================================
// ALGORITMO DE OVERSAMPLING Y PUNTO FIJO PARA LECTURAS ADC ESTABLES
// =========================================================================
#define ADC_SAMPLES 64 // Potencia de 2 para optimizar la división (bit-shift)
/**
* @brief Captura múltiples muestras del ADC y aplica un filtro de promedio.
* Evita el uso de floats, utilizando aritmética entera escalada.
* @return Presión en PSI multiplicada por 100 (Ej. 12550 = 125.50 PSI)
*/
uint32_t Get_Filtered_Tank_Pressure(void) {
uint32_t accumulator = 0;
uint32_t average_adc = 0;
// 1. OVERSAMPLING: Recolección rápida de muestras para anular ruido blanco
for (uint8_t i = 0; i < ADC_SAMPLES; i++) {
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 5) == HAL_OK) {
accumulator += HAL_ADC_GetValue(&hadc1);
}
}
// División ultra-rápida (Equivalente a accumulator / 64)
average_adc = accumulator >> 6;
// 2. CONVERSIÓN ELÉCTRICA A MAGNITUD FÍSICA (PUNTO FIJO)
// Sensor 4-20mA sobre resistencia de 165 Ohms = 0.66V a 3.3V
// ADC a 12 bits (0-4095) => 0.66V = ~819 cuentas | 3.3V = 4095 cuentas
// Rango de presión del sensor hipotético: 0 a 300 PSI.
//
// Ecuación lineal: PSI = (ADC - ADC_MIN) * (PSI_MAX / (ADC_MAX - ADC_MIN))
// Aplicamos escalado x100 para no perder decimales sin usar "float".
int32_t adc_offset = average_adc - 819; // Restar el offset de 4mA
if (adc_offset < 0) adc_offset = 0; // Prevenir underflow si el cable se corta
// Factor de escala pre-calculado: (300 * 100) / (4095 - 819) = ~9.15
// Multiplicamos por 915 y dividimos entre 100 para aplicar el factor 9.15
uint32_t pressure_fixed_point = (uint32_t)((adc_offset * 915) / 100);
return pressure_fixed_point;
}
// =========================================================================
// EMPAQUETADO PARA TRANSMISIÓN (Sin sprintf)
// =========================================================================
/**
* @brief Prepara la trama para ser enviada por CAN o RS485 al equipo central.
*/
void Transmit_Probe_Data(void) {
uint32_t current_pressure = Get_Filtered_Tank_Pressure();
// Aquí invocamos las funciones agnósticas de formateo rápido (Día 336/340)
// Fast_IntToStr_FixedPoint(current_pressure, tx_buffer, 2);
// RS485_Transmit(tx_buffer);
}
Objetivo del día: Expandir el alcance del producto más allá de la placa base (Carrier Board).
Muchos ingenieros invierten años en perfeccionar un solo dispositivo central, ignorando que el entorno que lo rodea es igual de deficiente. Tu Despachador de Gas LP ahora es una computadora de Misión Crítica. Pero si el chofer del camión anota en una libreta de papel a qué clientes les despachó gas porque no integraste un módulo RFID periférico, la seguridad de tu sistema es burlada por la vulnerabilidad humana.
Al diseñar estos tres pequeños proyectos, aplicas inmediatamente la experiencia ganada en las últimas semanas. Ruteas las mini-placas en tu software de diseño electrónico con total confianza, reutilizas tus repositorios de código matemáticos limpios de librerías flotantes pesadas, y usas buses industriales fuertes (RS485 y CAN) para comunicarlos con el cerebro maestro. Has dejado de pensar en un solo circuito impreso; ahora estás pensando en la infraestructura completa de una planta petroquímica.