Skip to main content

Configuration

Compile-time parameters, runtime flags, sensor calibration setup, network addressing, and performance tuning options for the sensor board firmware.

Main Loop Timing

/* src/sensor_board/main.c */
#define MAIN_TASK_DELAY_MS 5000   /* poll + transmit interval */

All sensors are polled and transmitted once per interval. Lowering this value increases network traffic and heap churn (one encode allocation per message).

Runtime Flags (main.c)

Flag

Default

Effect

sendUDP

false

When false, udp_send_envelope() returns immediately: nothing is encoded or transmitted. Set to true to enable network output.

skip_sensor_polling

false

When true, the pH/IMU/load cell/pressure polling block is skipped (flow and pump still run).

Heap Management

uint32_t free_heap = xPortGetFreeHeapSize();
if (free_heap < 4096U) {   /* critical threshold, was 8192U */
    LOGE(TAG, "CRITICAL: Low heap! Free: %lu bytes", free_heap);
    osDelay(10000);
    continue;
}
  • FreeRTOS heap size: 65536 bytes (configTOTAL_HEAP_SIZE, set in CubeMX)
  • Critical threshold: 4096 bytes free
  • LwIP heap: 16 KB at 0x30004900 (separate from the FreeRTOS heap)

Network Configuration

All addresses live in components/common/networking_constants/ip_mac_constants.h:

#define NETWORK_IP       {192, 168, 0, 111}                     /* this board */
#define NETWORK_MAC      {0x00, 0x80, 0xe1, 0x00, 0x00, 0x00}

#define SAMPLE_BOARD_IP  {192, 168, 0, 222}                     /* UDP destination */
#define SAMPEL_BOARD_MAC {0x00, 0x43, 0x23, 0xee, 0x21, 0x64}

#define GATEWAY          {192, 168, 0, 1}
#define NETMASK          {255, 255, 255, 0}

#define PORT 1500                                               /* UDP port */

Changing the Destination Address or Port

  1. Edit SAMPLE_BOARD_IP / SAMPEL_BOARD_MAC (used both for sending and for the static ARP entry) or PORT in ip_mac_constants.h.
  2. Rebuild; no other file references the raw addresses.

MAC Address Filtering

Three source MACs are allowed through the hardware filter, configured in MainTask:

int mac1[6] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
int mac2[6] = {0x12, 0x23, 0x34, 0x45, 0x56, 0x67};
int mac3[6] = {0x90, 0x2e, 0x16, 0xbe, 0x1b, 0x33};
ETH_setup_MAC_address_filtering(mac1, mac2, mac3);

UDP Transmit Queues

#define SENSOR_SEND_QUEUE_SIZE 80   /* entries per priority queue, x2 queues */

Sensor Hardware Build Flags

The analog drivers are compile gated so the firmware links without ADC hardware. Add these to build_flags in platformio.ini once the corresponding CubeMX peripherals exist:

Flag

Effect

-D PH_SENSOR_USE_ADC

Enables the pH ADC read path (optional: -D PH_SENSOR_ADC_HANDLE=hadc1, -D PH_SENSOR_ADC_MAX=65535, -D PH_SENSOR_ADC_TIMEOUT_MS=100)

-D PRESSURE_USE_ADC

Enables the pressure/FSR ADC read path; bind each unit with pressure_sensor_init_hw()

-D PUMP_MAX_RPM_EST=100

Override the pump RPM estimate used when converting duty cycle to speed_rpm

-D CONFIG_LOG_LEVEL=LOG_INFO

Log verbosity (already set in platformio.ini)

Sensor Calibration Configuration

pH Sensor

/* components/sensor_board/ph/ph_sensor.h */
#define PH_SAMPLE_COUNT   40     /* averaging buffer size */
#define PH_DEFAULT_SLOPE  3.5f   /* SEN0161 default: pH = 3.5 * V + offset */

/* runtime calibration */
ph_sensor_calibrate(&ph_sensor, offset, slope);
ph_sensor_reset_calibration(&ph_sensor);   /* offset 0, slope 3.5 */

Load Cell (HX711)

/* components/sensor_board/load_cell/load_cell_sensor.h */
#define LOAD_CELL_DEFAULT_N_PER_COUNT 1.0f  /* passthrough until calibrated */
#define LOAD_CELL_GAIN_PULSES         1U    /* 1 = ch A gain 128 */
#define LOAD_CELL_READY_TIMEOUT_MS    200U  /* wait for DOUT low */

/* runtime calibration */
load_cell_tare(&cell, 10);                 /* average 10 reads as zero */
load_cell_set_scale(&cell, n_per_count);   /* marks is_calibrated = true */

Pressure / FSR

/* kPa = voltage * scale_kpa_per_volt + offset_kpa */
pressure_sensor_set_calibration(&sensor, scale_kpa_per_volt, offset_kpa);

Flow Sensor

/* components/sensor_board/sampling/flow_sensor/flow_sensor.h */
#define FLOW_SENSOR_PULSES_PER_ML_X10 55U    /* FM-PS2216: 5.5 pulses/ml */
#define FLOW_SENSOR_SAMPLE_WINDOW_MS  1000U  /* rate calculation window */
#define FLOW_SENSOR_MAX_FLOW_ML_MIN   150U   /* plausibility clamp */

Changing the Sensor Poll Interval

  1. Edit MAIN_TASK_DELAY_MS in src/sensor_board/main.c.
  2. Keep it well above the slowest blocking read (HX711 ready wait can take up to 200 ms per cell).
  3. The flow rate is computed per poll from the pulse count, so the interval also sets flow rate resolution.

Enabling / Disabling Sensors

  • All sensor polling: skip_sensor_polling flag in main.c (flow and pump are outside this block)
  • Individual analog sensors: leave their build flag unset; the driver returns RESULT_ERR_UNIMPLEMENTED and the sensor reports IDLE / DISCONNECTED without affecting the rest of the loop