You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SEEED XIAO BLE SENSE中MAX30100加BLE后无法检测心跳求助

解决MAX30100与BLE共存时心跳检测失效的问题

问题场景

在SEEED XIAO BLE SENSE模块上单独运行MAX30100心率检测功能一切正常,但加入BLE广播功能后,每当BLE启动时,MAX30100便无法检测到心跳,核心原因是pox.update()未能被及时高频调用。

核心问题分析

你的代码中BLEUpload()函数每次执行都会重复调用BLE.begin()和BLE.end(),这个过程会占用大量CPU资源甚至阻塞主线程,导致pox.update()的调用频率急剧下降。而MAX30100的心率检测依赖持续、高频的采样(pox.update()需要每秒被调用数百次),一旦采样中断,就会丢失关键光信号数据,直接导致心跳检测失效。

具体解决思路

1. 重构BLE初始化逻辑,避免重复启停

将BLE的初始化操作移到setup()中仅执行一次,后续仅更新广播数据,不再重复初始化/关闭BLE模块:

void setup() {
  Serial.begin(115200);

  // 初始化MAX30100
  if (!pox.begin()) {
    Serial.println(F("MAX30100 error"));
    while(1); // 初始化失败则停滞
  }
  Serial.println(F("MAX30100 OK!"));
  pox.setOnBeatDetectedCallback(onBeatDetected);
  
  // 初始化BLE(仅执行一次)
  if (!BLE.begin()) {
    Serial.println(F("BLE init failed"));
    while(1);
  }
  // 设置蓝牙发射功率与模式
  uint32_t *TXPOWER = (uint32_t *)0x4000150C;
  *TXPOWER &= 0x0;
  *TXPOWER |= 0x08;

  uint32_t *MODE = (uint32_t *)0x40001510;
  *MODE &= 0x0;
  *MODE |= 0x05;
  
  BLE.setLocalName("IT'S ME, BLE");
  // 初始化广播基础配置
  BLEAdvertisingData advData;
  advData.setFlags(BLEFlagsBREDRNotSupported | BLEFlagsGeneralDiscoverable);
  BLE.setAdvertisingData(advData);
}

void BLEUpload(){
  unsigned char send_data[2] = {
    (unsigned char)hearty,
    (unsigned char)oxy
  };
  
  // 仅更新广播数据并重启广播
  BLE.stopAdvertise();
  BLEAdvertisingData advData;
  advData.setFlags(BLEFlagsBREDRNotSupported | BLEFlagsGeneralDiscoverable);
  advData.setAdvertisedServiceData(0x2ACA, send_data, sizeof(send_data));
  BLE.setAdvertisingData(advData);
  BLE.advertise();
  
  ble_prev_millis = millis();
}

2. 保证pox.update()的调用优先级

在loop()中,确保pox.update()是最优先被执行的操作,不要被其他逻辑延迟:

void loop() {
  pox.update(); // 核心采样操作,必须放在最前面
  
  // 心率数据读取(每秒一次)
  if (millis() - max_prev_millis >= 1000UL) {
      readMax30100();
  }

  // BLE数据上传(每15秒一次)
  if (millis() - ble_prev_millis >= 15000UL) {
      BLEUpload();
  }
}

注意用1000UL这类无符号长整型常量,避免millis()溢出导致的定时器逻辑错误。

3. 排查I2C通信稳定性

MAX30100通过I2C总线通信,如果BLE操作导致CPU负载过高,可能会引发I2C通信超时。可以尝试:

  • 降低I2C总线速率(比如从400kHz改为100kHz),在pox.begin()前添加Wire.setClock(100000);
  • 检查模块接线是否牢固,避免接触不良

内容的提问来源于stack exchange,提问作者thewackyseal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:15:35