MODBUS SLAVE MONITOR 1.0
Loading...
Searching...
No Matches
main.cpp File Reference

Firmware Esclavo Modbus RTU con ADS1015 y cálculo RMS en tiempo real (ESP32). More...

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_ADS1X15.h>
#include "HardwareSerial.h"
#include "ModbusServerRTU.h"

Classes

struct  ADC_Sample
 Muestra del ADC con valor y canal asociado. More...
struct  RMS_FIFO
 Buffer circular para cálculo eficiente de RMS. More...
struct  SensorData
 Parámetros de configuración del sensor para descubrimiento Modbus. More...

Macros

#define I2C_SDA_PIN   9
 Pin SDA del bus I2C para comunicación con ADS1015.
#define I2C_SCL_PIN   8
 Pin SCL del bus I2C para comunicación con ADS1015.
#define ADS_ALERT_PIN   10
 Pin de interrupción del ADS1015 para conversiones completadas.
#define SLAVE_ID   1
 Dirección Modbus del dispositivo esclavo.
#define NUM_REGISTERS   18
 Número total de registros Modbus disponibles para datos RMS.
#define RX_PIN   20
 Pin de recepción UART para RS485.
#define TX_PIN   21
 Pin de transmisión UART para RS485.

Functions

HardwareSerial ModbusSerial (1)
 Instancia del puerto serie para comunicación Modbus RS485.
ModbusServerRTU MBserver (2000)
 Servidor Modbus RTU con timeout de 2000ms.
void IRAM_ATTR on_adc_data_ready ()
 Rutina de servicio de interrupción para conversiones ADC completadas.
void task_adquisicion (void *pvParameters)
 Tarea de adquisición de datos del ADC con manejo mejorado de multiplexor.
void task_procesamiento (void *pvParameters)
 Tarea de procesamiento de muestras y cálculo RMS.
int get_rms_history (int channel, float *output_buffer, int count)
 Obtiene el historial de valores RMS de un canal específico.
void dataUpdateTask (void *pvParameters)
 Tarea de actualización de registros Modbus con factores de conversión por canal.
ModbusMessage readHoldingRegistersWorker (ModbusMessage request)
 Worker para manejar peticiones Modbus de lectura de registros.
void setup ()
 Función de inicialización del sistema.
void loop ()
 Loop principal del sistema.

Variables

const int NUM_CHANNELS = 3
 Número de canales ADC a muestrear.
const int FIFO_SIZE = 320
 Tamaño del buffer circular FIFO para cálculo RMS.
const int PROCESS_INTERVAL_MS = 1000
 Intervalo de procesamiento RMS en milisegundos.
const int RMS_HISTORY_SIZE = 100
 Tamaño del historial de valores RMS para cada canal.
const int MODBUS_UPDATE_INTERVAL_MS = 300
 Intervalo de actualización de registros Modbus en milisegundos.
const float CONVERSION_FACTOR = 0.618f
 Factor de conversión global (mantenido por compatibilidad).
const float CONVERSION_FACTORS [NUM_CHANNELS]
 Factores de conversión específicos para cada canal ADC.
Adafruit_ADS1015 ads
 Instancia del convertidor ADS1015.
QueueHandle_t queue_adc_samples
 Cola de comunicación para muestras del ADC.
RMS_FIFO fifos [NUM_CHANNELS]
 Array de FIFOs para cada canal de medición.
float rms_history_ch0 [RMS_HISTORY_SIZE]
 Historial de valores RMS del canal 0.
float rms_history_ch1 [RMS_HISTORY_SIZE]
 Historial de valores RMS del canal 1.
float rms_history_ch2 [RMS_HISTORY_SIZE]
 Historial de valores RMS del canal 2.
volatile int rms_history_head = 0
 Índice de escritura para los historiales RMS.
SemaphoreHandle_t rms_history_mutex
 Mutex para protección de acceso concurrente a historiales RMS.
volatile bool adc_data_ready = false
 Flag de datos listos del ADC (ISR).
volatile uint8_t current_isr_channel = 0
 Canal actual en secuencia de muestreo (ISR).
uint16_t holdingRegisters [NUM_REGISTERS]
 Registros Modbus para datos RMS.
SemaphoreHandle_t dataMutex
 Mutex para protección de registros Modbus.
TaskHandle_t dataUpdateTaskHandle
 Handle de la tarea de actualización de datos Modbus.
SensorData sensor = {1, 3, 10, NUM_REGISTERS, PROCESS_INTERVAL_MS, 1, 1, 0}
 Configuración del sensor para respuestas de descubrimiento.

Detailed Description

Firmware Esclavo Modbus RTU con ADS1015 y cálculo RMS en tiempo real (ESP32).

Este sistema adquiere señales analógicas de 3 canales usando el ADC ADS1015, calcula valores RMS en tiempo real usando FIFOs circulares, mantiene un historial de mediciones y responde a consultas Modbus RTU sobre RS485. Incluye factores de conversión específicos por canal y manejo mejorado de multiplexor ADC.

Date
2025-12-04