Resumen
Firmware para dispositivo esclavo Modbus RTU sobre ESP32 con ADC ADS1015, calcula valores RMS en tiempo real mediante FIFOs circulares, mantiene historial de mediciones y responde a consultas Modbus RTU sobre RS485 dentro de un entorno FreeRTOS.
Dependencias
- FreeRTOS: tareas, colas, semáforos y sincronización.
- Arduino core ESP32 + Wire/I2C + ModbusServerRTU.
- Adafruit_ADS1X15 para comunicación con ADC.
- PlatformIO como toolchain recomendada.
Grupos
Flujo general
- Arranque: setup() inicializa Serial/I2C, ADS1015, ModbusServerRTU, colas y tareas.
- Configuración ADC: establece ganancia, velocidad de muestreo y modo de interrupción del ADS1015.
- Adquisición: task_adquisicion gestiona conversiones round-robin entre canales usando interrupciones; encola muestras en queue_adc_samples.
- Procesamiento: task_procesamiento consume muestras, actualiza FIFOs circulares con sumas acumulativas y calcula RMS periódicamente usando algoritmos incrementales.
- Historial: valores RMS se almacenan en buffers circulares thread-safe protegidos por rms_history_mutex.
- Actualización Modbus: dataUpdateTask extrae datos del historial, aplica factor de conversión y actualiza holdingRegisters.
- Respuestas Modbus: readHoldingRegistersWorker maneja peticiones de lectura para parámetros de configuración (registros 0-7) y datos RMS (registros 10+).
- Depuración: loop() muestra valores RMS periódicamente para verificación del sistema.
Colas y sincronización
Interfaz Modbus
- Registros 0-7: parámetros de configuración del sensor (sensorID, numberOfChannels, startAddress, etc.).
- Registros 10+: datos RMS históricos organizados por canal con factor de conversión aplicado.
- Función 03: lectura de holding registers con validación de direcciones y manejo de errores.
- Descubrimiento: responde con estructura SensorData para identificación automática por maestros.
Algoritmo RMS
- FIFO circular: buffer de 320 muestras con sumas acumulativas para eficiencia.
- Cálculo incremental: media y varianza calculadas sin recorrer todo el buffer.
- Actualización periódica: valores RMS calculados cada 1000ms.
- Thread-safe: acceso protegido mediante semáforos para concurrencia segura.