tag 标签: 心率检测

相关博文
  • 热度 13
    2022-4-11 10:51
    3242 次阅读|
    0 个评论
    用MAX30102制作一个血氧及心率测量仪
    项目采用MAX30102血氧及心率监视模块、Arduino UNO板、OLED显示器和蜂鸣器,搭建了一个简单的心率(BPM)测量仪。 这里,BPM为每分钟的心跳数,正常人的数字为65-75之间,体育运动员的数字要低些;血氧饱和度(SaO2)对于正常然来说大概为95%。 项目物料 本项目所需材料包括: Max30102(×1):这是项目的功能器件,是一款用于可穿戴设备的高灵敏脉冲式血样及心率传感器,具有不同版本,但是只要型号正确即可。 Arduino UNO(×1) OLED 128x32(×1):低功耗显示器。 Buzzer (×1):蜂鸣器 面包板(×1):方便组件安装和连接的线路板。 连接线 本项目所用代码来自Sparkfun_MAX3010x示例库,OLED和Buzzer代码根据 "HeartRate" 示例改进而来,这需要用户将手指放在传感器上。 注意,如果将手指放在传感器上,就要保持安静,直到蜂鸣器的“哔哔”声与你的心率节拍同步,或者与OLED动画同步,这时可读出正确的BPM心率读数。 本项目采用4次BPM读数的平均值,因此比较准确。 让OLED显示bmp图像 OLED显示的是小的“心形”栅格图(bmp),一旦传感器检测到一次心跳,就立即切换为大点的“心形”栅格图并保持一会儿,这样屏幕就像心跳一样,一闪一闪的,并伴有蜂鸣器的“哔哔”声。 选择希望看到的图走向的格式,如 .png\ .bmp\ .dib等。切记,本项目屏幕尺寸为128x32px,图像尺寸要小一些,为32x32px和24x21px。 下载LCD助手并打开。 可看到如下"数字" 这就是所谓的代码: display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE); 其含义为: display.drawBitmap(Starting x pos, Starting y pos, Bitmap name, Width, Height, Color); 这段代码描述了两件事——“当检测到手指时做什么”,以及“捡到心跳时做什么”。 以下是更新后的代码: MAX_BPM_OLED_Buzzer.inoArduino Modified from the SparkFun MAX3010x library /* This code works with MAX30102 + 128x32 OLED i2c + Buzzer and Arduino UNO * It's displays the Average BPM on the screen, with an animation and a buzzer sound * everytime a heart pulse is detected * It's a modified version of the HeartRate library example * Refer to www.surtrtech.com for more details or SurtrTech YouTube channel */ #include //OLED libraries #include #include #include "MAX30105.h" //MAX3010x library #include "heartRate.h" //Heart rate calculating algorithm MAX30105 particleSensor; const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good. byte rates ; //Array of heart rates byte rateSpot = 0; long lastBeat = 0; //Time at which the last beat occurred float beatsPerMinute; int beatAvg; #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 32 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Declaring the display name (display) static const unsigned char PROGMEM logo2_bmp = { 0x01, 0xF0, 0x0F, 0x80, 0x06, 0x1C, 0x38, 0x60, 0x18, 0x06, 0x60, 0x18, 0x10, 0x01, 0x80, 0x08, 0x20, 0x01, 0x80, 0x04, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x08, 0x03, 0x80, 0x00, 0x08, 0x01, 0x80, 0x00, 0x18, 0x01, 0x80, 0x00, 0x1C, 0x01, 0x80, 0x00, 0x14, 0x00, 0x80, 0x00, 0x14, 0x00, 0x80, 0x00, 0x14, 0x00, 0x40, 0x10, 0x12, 0x00, 0x40, 0x10, 0x12, 0x00, 0x7E, 0x1F, 0x23, 0xFE, 0x03, 0x31, 0xA0, 0x04, 0x01, 0xA0, 0xA0, 0x0C, 0x00, 0xA0, 0xA0, 0x08, 0x00, 0x60, 0xE0, 0x10, 0x00, 0x20, 0x60, 0x20, 0x06, 0x00, 0x40, 0x60, 0x03, 0x00, 0x40, 0xC0, 0x01, 0x80, 0x01, 0x80, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x30, 0x0C, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x01, 0x80, 0x00 }; void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Start the OLED display display.display(); delay(3000); // Initialize sensor particleSensor.begin(Wire, I2C_SPEED_FAST); //Use default I2C port, 400kHz speed particleSensor.setup(); //Configure sensor with default settings particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running } void loop() { long irValue = particleSensor.getIR(); //Reading the IR value it will permit us to know if there's a finger on the sensor or not //Also detecting a heartbeat 7000){ //If a finger is detected display.clearDisplay(); //Clear the display display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE); //Draw the first bmp picture (little heart) display.setTextSize(2); //Near it display the average BPM you can display the BPM if you want display.setTextColor(WHITE); display.setCursor(50,0); display.println("BPM"); display.setCursor(50,18); display.println(beatAvg); display.display(); if (checkForBeat(irValue) == true) //If a heart beat is detected { display.clearDisplay(); //Clear the display display.drawBitmap(0, 0, logo3_bmp, 32, 32, WHITE); //Draw the second picture (bigger heart) display.setTextSize(2); //And still displays the average BPM display.setTextColor(WHITE); display.setCursor(50,0); display.println("BPM"); display.setCursor(50,18); display.println(beatAvg); display.display(); tone(3,1000); //And tone the buzzer for a 100ms you can reduce it it will be better delay(100); noTone(3); //Deactivate the buzzer to have the effect of a "bip" //We sensed a beat! long delta = millis() - lastBeat; //Measure duration between two beats lastBeat = millis(); beatsPerMinute = 60 / (delta / 1000.0); //Calculating the BPM if (beatsPerMinute 20) //To calculate the average we strore some values (4) then do some math to calculate the average { rates = (byte)beatsPerMinute; //Store this reading in the array rateSpot %= RATE_SIZE; //Wrap variable //Take average of readings beatAvg = 0; for (byte x = 0 ; x < RATE_SIZE ; x++) beatAvg += rates ; beatAvg /= RATE_SIZE; } } } if (irValue < 7000){ //If no finger is detected it inform the user and put the average BPM to 0 or it will be stored for the next measure beatAvg=0; display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(30,5); display.println("Please Place "); display.setCursor(30,15); display.println("your finger "); display.display(); noTone(3); } }
  • 热度 2
    2015-12-20 20:48
    1632 次阅读|
    0 个评论
       0 引 言   心率是人体中一个非常重要的生命信息,而传统的脉诊由于其定性化和主观性影响了心率测试的精度,成为中医脉诊应用、发展和交流中的制约因素。为了提高对此类生物医学信号的测试精度,必须结合现代科学技术。目前用于检测心率的仪器很多,常见的有基于压力传感器、光电传感器、电容传感器和电声传感器等类型的测试装置,但是对脉搏测试部位的选择没有太大区别,对于能在指端进行脉搏精确测量的仪器还是比较少。这里介绍的智能人体心率检测装置可以实现人体指端的无创测量,测试过程简单,能精确测量出心跳次数,实现数据显示和上、下限报警功能。    1 装置组成及工作原理   系统组成如图1所示。此设计以单片机AT89C2051为核心,由光电传感器采集脉搏信号,经过前置放大电路、滤波电路、积分和比较电路后得到与脉搏相关的脉冲信号,该脉冲信号作为中断信号交由单片机进行脉冲周期的计算。然后得出每分钟的脉搏搏动次数(即心率),并在数码管上显示心率,同时利用软件实现上下限报警功能,在测量数据超过正常范围(如大于180次/min或小于45次/min)时进行报警以提醒医生注意。    2 装置硬件电路设计   2.1 传感器及信号处理电路   由于在人体指尖组织中的动脉成分含量高,而且指尖厚度相对其他人体组织而言比较薄,透过手指后检测到.的光强相对较大,因此光电式脉搏传感器的测量部位在人体指尖。将一对红外发射与接收探头置于手指两侧,当动脉血管随心脏周期性的收缩和舒张,动脉血管的血液容积随之发生变化时,红外接收探头便接收到随心脏周期性地收缩和舒张的动脉搏动光脉冲信号,从而采集到心脏搏动信号。   检测心率的传感器采用红外对管HRl068C一05Y2和PT331C。由于从人体手指采集到的生理信号十分微弱,其幅度一般在微伏到毫伏的数量级范围,而且在测试过程中由于肢体动作以及较强的工频干扰而产生大量的噪声。同时要将采集到的脉搏信号经过前置级放大电路进行高倍放大,这就要求电路具有高增益和高共模抑制比,至少在80 dB以上,即集成运放要有很高的共模抑制比和极低的零漂等,所选的电阻参数要尽量精确。放大电路由电阻网络和OP07组成,传感器及前置放大电路如图2所示。   由于内外噪声及50 Hz工频干扰等因素,即使电路具有很高的共模抑制比,但是脉搏信号非常微弱,淹没在于扰信号中,由于脉搏信号主峰频率在1 Hz左右,能量较强的分量也在20 Hz以下,所以设计低通滤波器的上限截止频率为40 Hz。对于工频干扰,采用对称性双T阻容有源陷波器对其专门滤除。再通过积分、比较电路整形之后便可以得到单片机所需要的标准的0~5 V脉冲信号。滤波、陷波电路及积分比较电路如图3所示。    2.2 单片机控制及显示电路   单片机控制及显示电路如图4所示。采用动态显示方式,利用单片机的P1口的P1.0~P1.6作为数码管七段码的输入。利用P3.0,P3.1,P3.2,P3.3作为4只数码管的选中信号(见图4)。从光电传感器输出的心率脉冲作为中断信号直接接到单片机89C2051的9脚(即T1端)。由T0定时,T1计数。P1.7输出心率的上、下限报警信号,经二极管驱动报警器报警。当心率低于下限45次/min时报警发出长音报警。当心率高于上限180次/min时报警器发出短音报警。    3 软件设计   系统软件流程图如图5所示。将要显示心率数千位、百位、十位、个位数分别存放在89C2051单片机内部的41H,42H,43H,44H单元内。采用动态扫描,每隔5 ms分别轮流显示千位、百位、十位、个位。当单片机的第9脚有一上升沿时,T1脚计数1次,T0定时50 ms,循环定时1 200次,T1计数即为心率次数。然后返回主程序继续执行显示程序。    4 电路调试及噪声分析   电路调试主要是对输入的脉搏信号进行滤波和放大,调试的效果直接关系到数据采集的精确度。通过测试可以得知,脉搏信号中存在严重的噪声干扰,前置级放大电路的设计至关重要。使用宁波中策电子有限公司的DFl405数字合成信号发生器来模拟脉搏信号,信号频率较高,信号处理电路对于高频信号(106 Hz左右)有很好的衰减作用,当信号频率适中的时候,信号可以按照设计的需要进行放大。50 Hz陷波器对工频干扰起到了很好的抑制作用。通过积分、比较电路对脉搏信号整形可以得到单片机需要的脉冲信号。通过整机调试,系统达到了预期的设计要求。   在测量过程中,传感器采集到的脉搏信号十分微弱,容易受到外界环境干扰,因此需要对脉搏传感器的干扰噪声进行分析。光电式脉搏传感器的主要有测量环境光干扰、电磁干扰、测量过程运动噪声干扰。为了减少环境光对脉搏信号测量的影响,同时考虑到传感器使用的方便性,采用密封的指套式的包装方式,整个外壳采用不透光的介质和颜色,尽量减小外界环境光的影响。通过光电转换得到的包含脉搏信息的电信号一般比较微弱,容易受到外界电磁信号的干扰,因此对硬件电路进行适当的屏蔽处理。脉搏信号变化缓慢,特别容易受到工频信号的干扰,利用陷波器有效地解决了这一问题。在测量过程当中,让指套和手指更紧的接触减少了他们之间的相对运动,降低了运动噪声。    5 结 语   心率检测中的关键技术在于传感器的制作和微弱脉搏信号的放大问题。通过实际的设计制作,结果证实了该设计的合理性和可行性,说明用科学设计的透射式传感器可实现手指脉搏的无损检测。但是在小信号放大技术方面有待于进一步研究。同其他心率检测仪相比较,该装置的体积小,重量轻,成本低,使用方便,测量准确等,具有很好的应用前景。
相关资源
  • 所需E币: 3
    时间: 2019-6-7 10:14
    大小: 1.19MB
    上传者: royalark_912907664
    从人脸彩色视频图像序列中能够分离出光电容积脉搏波(PPG)信号,进而提取人体的心率值,为了保证提取心率值的实时性和准确性,降低对外界光照环境的依赖性,研究使用对角累积量算法和RobustICA算法用于彩色视频提取PPG信号,并转化成人体心率。通过对角累积量算法、RobustICA算法与传统视频提取心率算法,即联合近似特征对角化(JADE)算法的彩色视频提取心率结果的对比分析实验,得出对角累积量算法提取的心率结果与实际心率的误差更小,准确率更高,RobustICA算法提取心率的运行时间达到0.2s以内,实时性更强。