极客秀
搜索

一句话,让我的MAX30100血氧传感器直接宕机!

最近是毕设的高峰期,MAX30100血氧传感器也是一款典型的光电传感器被应用在心率测量,血氧测量方面。
前几期我们介绍了一个FreeRTOS实战项目应用于类似运动手环检测老人摔倒姿态以及血氧心率采集。
而当我部署其到ESP32时,其他都没有什么问题,唯独当MAX30100,MLX90614,MPU6050一起使用的时候出现了问题,不仅仅是MAX30100无法启动的问题,还有其他传感器都失效。

如图MPU6050和温度传感器都是正常使用的,唯独MAX30100无法输出数据。 后来仔细检查,发现是因为我在代码的主循环中 加入了一个延时

这里本意是想延时,降低其他传感器数据的发送频率,但是就会出现MAX30100无法工作的问题。 ** 原因分析 **
原因是MAX30100的update函数,其函数的目的读取传感器的数据,而传感器的数据曲线是一个和心率有关的曲线。

之后再利用其库函数中的滤波和寻找心率算法,检测峰峰值的心率数据。

所以正常情况下我们应该启用一个定时器来实现数据的更新,例如15ms更新一次数据。

然而当我们在While循环中使用delay函数的时候,就会导致采样出现了延迟,本来一秒钟可以有将近1000个点,而加了延时之后,采样率就会骤降,所以就会导致MAX30100解析其峰峰值频率算法出现许多问题。

所以正确的解决办法就是将延时函数去掉!


void loop(){  WiFiClient client;  float ambientTemp = mlx.readAmbientTempC();  float objectTemp = mlx.readObjectTempC();  
  int16_t ax, ay, az;  mpu.getAcceleration(&ax, &ay, &az);  client.connect("192.168.4.2", 8081);  
  mpu.getAcceleration(&ax, &ay, &az);  
  String data = "Ambient Temp: " + String(ambientTemp) + " *C | Object Temp: " + String(objectTemp) +                " *C | Ax: " + String(ax) + " | Ay: " + String(ay) + " | Az: " + String(az);  
  pox.update();//更新数据  
  if (millis() - lastReportTime > REPORTING_PERIOD_MS) {    lastReportTime = millis();    data += " | Heart Rate: " + String(pox.getHeartRate()) + " bpm | SpO2: " + String(pox.getSpO2()) + "%" + "rn";    Serial.println(data);    client.write(data.c_str(), strlen(data.c_str()));//数据上传  }}

将延时函数去掉之后,就可以正常的使用MAX30100和其他函数了。

确实,这次的经历给我们提供了一个宝贵的教训:在编写代码的过程中,我们不能过度依赖外部库。虽然这些库能够为我们提供便捷的功能和工具,帮助我们快速构建应用,但过度依赖它们却可能掩盖了潜在的问题。
当我们对库的底层实现方式缺乏了解时,一旦遇到错误或问题,我们就很难准确地定位问题所在。这可能导致我们花费大量的时间和精力去排查错误,甚至可能让我们陷入困境,无法找到有效的解决方案。
因此,我们应该在使用外部库的同时,也努力去了解它们的底层实现方式。这样,当遇到问题时,我们不仅能够更准确地定位问题,还能够更深入地理解问题的本质。同时,通过了解库的底层实现,我们还可以更好地优化我们的代码,提高应用的性能和稳定性。
当然,这并不意味着我们应该完全摒弃外部库的使用。相反,我们应该在合理使用外部库的同时,保持对底层实现的关注和学习。只有这样,我们才能在编写代码的过程中更加得心应手,避免不必要的麻烦和损失。

1.转载请保留原文链接谢谢!
2.本站所有资源文章出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。
3.本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户擦亮眼睛自行鉴别,做一个有主见和判断力的用户。
4.本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。
5.联系方式(#替换成@):pm#vimge.com

  相关内容