跳转至

说明

Offline Sensing — 高频批量采集,存储到本地

以较高采样率(默认 100 Hz)采集一段时间(默认 10 秒)的数据,存到内存和/或 SD 卡,采集结束后发送 MQTT 报告。适合锤击实验、模态测试等需要高频率数据的场景。

算法直觉

为什么离线能比在线频率高?

在线是"边采边发",带宽受限。离线是"先采后发",采集时全力冲刺:

  • 数据先写入本地缓冲区(内存或 SD 卡)
  • 采集任务完成后才发 MQTT 报告
  • 不受网络传输速度的约束

内存预算

采样率 × 轴数 × 字节/样本 × 时长 = 缓冲区大小
100 Hz × 3 (x,y,z) × 4 bytes × 10 秒 = 12 KB

默认 10 秒 100 Hz 只需 12 KB,ESP32 的 SRAM 完全够用。若设到 4000 Hz × 60 秒,则需约 2.8 MB——此时建议用 PSRAM 或 SD 卡。

数据流

MQTT 命令 "SENSE,OFFLINE,F=100,D=10"
初始化内存 / SD 卡缓冲区
ESP 定时器每 10 ms (100 Hz) 触发中断
读取 ADXL355 → 写入内存缓冲区 / SD 卡
计时到 → 停止采集
MQTT 报告(统计信息:采样数、时长、文件路径等)

API 参考

typedef struct {
    float sampling_frequency_hz;       // 采样率 (Hz),默认 100.0
    float sampling_duration_sec;       // 采集时长 (秒),默认 10.0
    bool enable_memory;                // 启用内存存储
    bool enable_sd;                    // 启用 SD 卡存储
    bool enable_mqtt_report;           // 启用 MQTT 报告
    const char *sd_file_path;          // SD 卡文件路径(NULL = 自动生成)
    const char *mqtt_report_topic;     // MQTT 报告主题(NULL = 默认)
} offline_sensing_config_t;

esp_err_t offline_sensing_start(const offline_sensing_config_t *config);
esp_err_t offline_sensing_stop(void);
bool offline_sensing_is_running(void);

注意事项

最大采样率 4000 Hz 受 ADXL355 硬件限制

这是传感器 ODR(Output Data Rate)的物理上限。再高也读不到更多数据。

SD 卡适合长时间采集

内存缓冲有限,SD 卡可以存更多数据。但 SD 卡写入速度慢于内存,高采样率+长时长建议两者同时用。

采集完成后自动生成文件名

SD 卡文件路径未指定时,自动按 sensor_YYMMDD_HHMMSS.csv 格式生成,包含时间戳防止覆盖。