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 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵