weixin_47046487 2021-05-26 20:53 采纳率: 0%
浏览 6

plussensor

最近在做一个plussensor的心率传感器测心率的实验而且要在LCD1602A上显示出来,老师要求直接把测得串口数据进行处理得到心率,我设置了一个阈值,高于阈值就相当于一次心跳,然后计算了两个波形峰值之间的时间,但是测得结果很不准确,求各位网友解答,帮帮孩子吧,如果有更改的代码就最好了。一下是我写的代码。

#define heartPin 0
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);
int heartValue = 0;
int flag=0;
float time1=0;
float time2=0;
float t=0;
int BPM=0;
void setup()
{ 
  lcd.begin(16,2);
  lcd.init();                 
  lcd.backlight();

  Serial.begin(115200);
  lcd.setCursor(0, 0);
  lcd.print("HeartRate");
}

void loop()
{
  int heartValue = analogRead(heartPin);
  Serial.println(heartValue);
  if (heartValue>510 and flag==0)
  {
    time1=millis();
    time2=time1;
    flag=1;
  }
  if(flag==1 and heartValue>510)
  {
    time1=millis();
    t=time1-time2;
    time2=time1;
  }
  BPM = 60000/t;
  
  lcd.setCursor(0,1);
  lcd.print("BPM:");
  lcd.setCursor(4,1);
  lcd.print(BPM);
  delay(500);
}     
  • 写回答

1条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-06-08 12:54
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    这个问题主要是心率测量不准确的问题,可能的原因有:传感器数据的不稳定性,阈值设置不合理,测量算法的不准确等。建议采用滤波算法对传感器数据进行处理,同时优化阈值设置和测量算法,如采用更精细的波形分析方法,可以提高测量的准确性。以下是代码示例: #define heartPin 0 #include LiquidCrystal_I2C lcd(0x27, 16, 2); int heartValue = 0; float lastValue = 0; float sum = 0; float maxThresh = 0; float minThresh = 0; float lastPeakTime = 0; float currentPeakTime = 0; float BPM = 0; void setup(){ lcd.begin(16,2); lcd.init(); lcd.backlight(); Serial.begin(115200); lcd.setCursor(0, 0); lcd.print("HeartRate"); // 初始化阈值 maxThresh = 600; minThresh = 300; } void loop(){ int heartValue = analogRead(heartPin); // 利用一阶滤波算法平滑数据 heartValue = 0.75 * heartValue + 0.25 * lastValue; lastValue = heartValue; // 去除基线(如果需要) sum += heartValue; if (millis() % 100 == 0){ float baseline = sum / 100.0; sum = 0; heartValue -= baseline; } // 通过阈值判断心跳 if (heartValue > maxThresh && currentPeakTime - lastPeakTime > 200){ currentPeakTime = millis(); if (lastPeakTime != 0){ float interval = currentPeakTime - lastPeakTime; BPM = 60000.0 / interval; } lastPeakTime = currentPeakTime; } // 实时显示结果 lcd.setCursor(0,1); lcd.print("BPM:"); lcd.setCursor(4,1); lcd.print(BPM); delay(10); }
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#wireshark#的问题:并且能够给数据做标注,如这个流量是在看视频或者是在转账
  • ¥90 请问,这个视频播放软件的名称,用过的朋友请给答案,上方..avi是啥意思?是看短剧还是播放本地视频?
  • ¥15 运筹优化,gurobi,python
  • ¥15 基于python的电影系统推荐
  • ¥20 springmvc重定向和返回json
  • ¥15 数学建模——参会安排怎么做
  • ¥15 电脑键盘实现触摸功能
  • ¥25 matlab无法将表达式转换为双数组怎么解决?
  • ¥15 单片机汇编语言相关程序
  • ¥20 家用射频美容仪技术规格