基于Arduino的心率血氧浓度监测仪设计与制作_第1页
基于Arduino的心率血氧浓度监测仪设计与制作_第2页
基于Arduino的心率血氧浓度监测仪设计与制作_第3页
基于Arduino的心率血氧浓度监测仪设计与制作_第4页
基于Arduino的心率血氧浓度监测仪设计与制作_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录

1产品设计背景1

2设计方案遴选1

2.1产品总框架设计1

2.2ArduinoUNO开发板的选择2

2.3SSD1306OLED显示屏模块的选择2

2.4MAX30102心率血氧传感器2

3产品模块设计3

3.1产品组成3

3.2产品功能3

4产品硬件的设计3

4.1系统原理图3

4.2ArduinoUNO开发板4

4.2.1ArduinoUNO实物照片4

4.2.2ArduinoUNO核心板电路原理图4

4.3MAX30102心率血氧传感器5

4.3.1MAX30102心率血氧传感器实物照片5

4.3.2MAX30102心率血氧传感器的产品接线解析5

4.4SSD1306OLED显示屏模块7

4.4.1SSD1306OLED显示屏实物照片7

4.4.2SSD1306OLED显示屏模块产品接线解析7

5产品软件设计8

5.1Arduino软件开发环境8

5.2主程序流程图9

5.3产品程序清单10

6产品组装与调试10

6.1产品装配图10

6.2产品调试过程11

I

7产品设计技术标准13

参考资料14

附录15

附录1元件清单列表15

附录2电路原理图15

附录3PCB设计图16

附录4作品实物照16

附录4主程序代码17

II

基于Arduino的心率血氧浓度监测仪设计与制作

1产品设计背景

心率和血氧浓度是人体健康状况的重要指标,对于实时了解自身的身体状

况具有重要意义。随着科技的发展,便携式的心率血氧监测设备逐渐流行起来,

能够为用户提供方便、准确的监测服务。这些设备小巧便携,可以佩戴在身上

并通过传感器实时监测心率和血氧浓度。通过获取这些数据,人们可以判断自

己的身体状况是否正常,及时调整和采取相应的措施。心率血氧浓度监测设备

的出现,使人们更加关注自身的健康状态,提高了健康管理的水平,能够更好

地保护身体健康。无论是日常生活中的运动爱好者,还是担心心血管健康的人

群,心率血氧浓度监测设备都能为他们提供准确、实时的数据反馈,帮助他们

更好地管理自身的健康状况。

2设计方案遴选

2.1产品总框架设计

本次设计的方案为基于Arduino的心率血氧浓度监测。

电源接口

SSD1306OLEDArduinoUNOMAX30102

显示屏模块开发板心率血氧传感器

图2-1产品总框架图

1

2.2ArduinoUNO开发板的选择

方案一:ArduinoUNO开发板入门较为简单,在硬件方面,Arduino开发板

的电路非常简单,连接外设也很直观。在软件方面,Arduino提供了简单易用的

IDE和编程语法,入门门槛较低。即使是编程初学者也能很快上手Arduino开发。

方案二:STM32开发板入门相对较难,在硬件方面,STM32开发板的电路和

外设接口相对复杂,需要有一定的电子基础知识。在软件方面,STM32使用的是

基于ARM架构的专业级开发环境,如Keil或者STM32Cube,需要一定的编程基础。

将两者对比起来,所以我选择ArduinoUNO开发板,因为完全适合初学嵌入

式开发的新手,能够快速掌握并投入实践;而STM32则更适合有一定编程基础的

开发者,可以满足更高级的需求,但入门需要投入更多的学习成本。

2.3SSD1306OLED显示屏模块的选择

方案一:SSD1306OLED显示屏,在显示效果方面SSD1306OLED显示屏具

有更高的对比度和更好的显示效果,特别是在光线较弱的环境中。在功耗方面

SSD1306OLED显示屏的功耗较低,特别适合电池供电的便携设备。在应用场景

方面SSD1306适合需要显示图形、图像和动态内容的复杂应用,如手持设备、

智能家居显示屏等

方案二:LCD1602显示屏,在显示效果方面LCD1602的对比度和视角较差,

但在光线充足的环境下仍能提供清晰的字符显示。在功耗方面LCD1602需要背

光,功耗相对较高。在应用场景方面LCD1602则适合简单的字符显示,如家电

控制面板、简单仪表显示等。

将两者对比起来,所以我选择SSD1306OLED显示屏,因为SSD1306OLED显

示屏在显示效果、功耗和灵活性方面有显著优势,适合需要高质量图形显示的

应用。

2.4MAX30102心率血氧传感器

MAX30102心率血氧传感器,是一种集成了心率和血氧监测功能的传感器模

块。MAX30102传感器模块具有高精度、稳定性和低功耗的特点。通过结合多种

光线测量和算法处理,MAX30102传感器能够有效地抑制运动和环境干扰,提供

可靠、准确的测量结果。

2

3产品模块设计

此产品以ArduinoUNO开发板为主,外接SSD1306OLED显示屏模块、

MAX30102心率血氧传感器模块组装而成,符合产品设计标准。

3.1产品组成

1.ArduinoUNO开发板

2.SSD1306OLED显示屏模块

3.MAX30102心率血氧传感器模块

3.2产品功能

实时心率检测:通过电容积脉搏波描记法技术,传感器实时检测手指末端

的血液波动,精确计算每分钟心跳次数。

血氧浓度检测:通过红光和红外光反射,计算血液中的氧合血红蛋白和去

氧血红蛋白比例,得出血氧饱和度。

SSD1306OLED显示屏:实时显示心率和血氧浓度数据,通过查看SSD1306

OLED显示屏可以看出自己的心率和血氧过高、过低以及正常的波形显示。

4产品硬件的设计

4.1系统原理图

本产品是以ArduinoUNO开发板为中心,外接SSD1306OLED显示屏模块、

MAX30102心率血氧传感器模块组装而成。系统电路原理图如下:

图4-1系统电路原理图

3

4.2ArduinoUNO开发板

4.2.1ArduinoUNO实物照片

图4-2ArduinoUNO实物图

4.2.2ArduinoUNO核心板电路原理图

图4-3ArduinoUNO核心板原理图

4

4.3MAX30102心率血氧传感器

4.3.1MAX30102心率血氧传感器实物照片

图4-4MAX30102心率血氧传感器实物图

4.3.2MAX30102心率血氧传感器的产品接线解析

产品接线解析:

1.VINArduino开发板VIN

2.SCLArduino开发板A5

3.SDAArduino开发板A4

4.GNDArduino开发板GND

MAX30102心率血氧传感器电路原理图如图4-5所示。

5

图4-5MAX30102心率血氧传感器原理图

6

4.4SSD1306OLED显示屏模块

4.4.1SSD1306OLED显示屏实物照片

图4-6SSD1306OLED显示屏事物图

4.4.2SSD1306OLED显示屏模块产品接线解析

产品接线解析:

1.电源线VCC(3.3V~5V)Arduino开发板VCC

2.地线GNDArduino开发板GND

3.SCLArduino开发板上面的SCL

4.SDAArduino开发板上面的SDA

7

SSD1306OLED显示屏电路原理图:

图4-7SSD1306OLED显示屏原理图

5产品软件设计

Arduino软件设计是一项基于开源硬件平台的开发技术,通过编程语言和

开发环境,实现对Arduino板的控制和操作。其灵活性和易用性使得Arduino

成为学习和创造互动电子项目的理想选择。

5.1Arduino软件开发环境

通过USB串口和电脑PC端连接、新建工程、选择开发板和端口、进行编译

在烧录程序。在观察开发板上面的两个灯是否亮,如果亮则开发板正常。

图5-1软件开发页面

8

5.2主程序流程图

开始

清除和设置位的例程

定义BUTTON引脚

定义OPTIONS引脚

定义两个数组

辨别Arduino开发板是1284还是328

在取电压

记录、缩放和显示PPG波形

休息时每分钟心跳72下

作为参考

记录波形

去保存精度,把波形规模

画波形

睡眠直到按下按钮导致重置

转化波形得到经典的BP波形

检查红外或红色检测心跳

计算血氧浓度比率

如果按下手指,则每50毫秒更新一次显示闪光灯LED持续25ms

图5-2主程序流程图

9

5.3产品程序清单

基于Arduino的心率血氧浓度检测清单

定义变量

初始化

Arduino.ino

MAX30102心率血氧模块SSD1306OLED显示模块

图5-3产品程序清单

6产品组装与调试

6.1产品装配图

产品主要由Arduino开发板,MAX30102心率血氧传感器,SSD1306OLED显

示屏模块其装配图如下:

10

SSD1306OLED

MAX30102

显示屏模块

心率血氧传感器ArduinoUNO

开发板

图6-1产品装配图

6.2产品调试过程

1.未接连接烧录程序实物图片

图6-2产品介绍图

11

第一步:将模块接入开发板中,开发板接入电源。

图6-3未烧入程序的图片

第二步:将程序烧入Arduino开发板中。

图6-4烧入Arduino开发板中的图片

第三步:将手指放在MAX30102心率血氧传感器上(注意在测试的时候要带防静电手套

避免用静电造成损坏)。

12

图6-5在SSD1306OLED显示屏模块中的波形图

7产品设计技术标准

[1]J-STD-001E电气与电子组件的焊接要求

[2]IPC-A-610D(中文版),IPC-A-610E电子组件的可接受性要求

[3]IPC-7711/21电子组件和电路板的返工&返修

[4]GB/T11457-2006信息技术软件工程术语;

13

参考资料

[1]李永乐,曲明哲.Arduino项目开发[M].北京:清华大学出版社,2019

[2]周润景,李茂泉.常用传感器技术及应用[M].电子工业出版社,2020

[3]周润景.传感器与检测技术[M].电子工业出版社,2022

[4]戴蓉.传感器原理与工程应用[M].电子工业出版社,2021

[5]唐文彦.张晓琳.传感器[M].机械工业出版社,2021

[6]刁彬斌.Arduino编程从入门到进阶实战[M].化学工业出版社,2020

[7]李永华.王思野.Arduino案例实战卷[M].北京:清华大学出版社,2017

[8]王洪源.Arduino单片机高级开发[M].北京:清华大学出版社,2022

14

附录

附录1元件清单列表

附表1-1元件清单列表

基于Arduino心率血氧浓度监测仪的设计与制作

元件符号元件名称数量

A1ArduinoUNO开发板1

A2SSD1306OLED显示屏模块1

A3MAX30102心率血氧传感器1

附录2电路原理图

附图2-1产品原理图

15

附录3PCB设计图

附图3-1PCB设计图

附录4作品实物照

附图4-1产品实物图

16

附录4主程序代码

#include"ssd1306h.h"//显示屏模块

#include"MAX30102.h"//心率血氧模块

#include"Pulse.h"脉冲

#include<avr/pgmspace.h>

#include<EEPROM.h>

#include<avr/sleep.h>

//用于清除和设置位的例程(以便于再次使用)

#ifndefcbi

#definecbi(sfr,bit)(_SFR_BYTE(sfr)&=~_BV(bit))

#endif

#ifndefsbi

#definesbi(sfr,bit)(_SFR_BYTE(sfr)|=_BV(bit))

#endif

SSD1306oled;//(显示屏)

MAX30102sensor;//(传感器)

PulsepulseIR;//(脉冲红外)

PulsepulseRed;//(脉冲红)

MAFilterbpm;//(每分钟心跳次数)

#defineLEDLED_BUILTIN

#defineBUTTON3//定义BUTTON引脚

#defineOPTIONS7//定义OPTIONS引脚

staticconstuint8_theart_bits[]PROGMEM={0x00,0x00,0x38,0x38,

0x7c,0x7c,0xfe,0xfe,0xfe,0xff,

0xfe,0xff,0xfc,0x7f,

0xf8,0x3f,0xf0,0x1f,0xe0,0x0f,

17

0xc0,0x07,0x80,0x03,

0x00,0x01,0x00,0x00,0x00,0x00,

0x00,0x00};

//spo2_tableisapproximated(近似)as-45.060*ratioAverage(比

率平均值)*ratioAverage+30.354*ratioAverage+94.845;

constuint8_tspo2_table[184]PROGMEM=

{95,95,95,96,96,96,97,97,97,97,97,98,98,98,

98,98,99,99,99,99,

99,99,99,99,100,100,100,100,100,100,100,100,

100,100,100,100,100,100,100,100,

100,100,100,100,99,99,99,99,99,99,99,99,98,

98,98,98,98,98,97,97,

97,97,96,96,96,96,95,95,95,94,94,94,93,93,

93,92,92,92,91,91,

90,90,89,89,89,88,88,87,87,86,86,85,85,84,

84,83,82,82,81,81,

80,80,79,78,78,77,76,76,75,74,74,73,72,72,

71,70,69,69,68,67,

66,66,65,64,63,62,62,61,60,59,58,57,56,56,

55,54,53,52,51,50,

49,48,47,46,45,44,43,42,41,40,39,38,37,36,

35,34,33,31,30,29,

28,27,26,25,23,22,21,20,19,17,16,15,14,12,

11,10,9,7,6,5,

3,2,1};

intgetVCC(){

#ifdefined(__AVR_ATmega1284P__)

ADMUX=_BV(REFS0)|_BV(MUX4)|_BV(MUX3)|_BV(MUX2)|

_BV(MUX1);

#else

18

ADMUX=_BV(REFS0)|_BV(MUX3)|_BV(MUX2)|_BV(MUX1);//辨

别Arduino开发板的芯片是1284还是328,因为它们所需要电压不同。

#endif

delay(2);//等待Vref的结算

ADCSRA|=_BV(ADSC);//转变

while(bit_is_set(ADCSRA,ADSC));

uint8_tlow=ADCL;

unsignedintval=(ADCH<<8)|low;

//丢弃之前的结果

ADCSRA|=_BV(ADSC);//转变

while(bit_is_set(ADCSRA,ADSC));

low=ADCL;

val=(ADCH<<8)|low;

return(((long)1024*1100)/val)/100;

}

voidprint_digit(intx,inty,longval,charc='',uint8_tfield

=3,constintBIG=2)

{

uint8_tff=field;

do{

charch=(val!=0)?val%10+'0':c;

oled.drawChar(x+BIG*(ff-1)*6,y,ch,BIG);

val=val/10;

--ff;

}while(ff>0);

}

/*

*记录、缩放和显示PPG波形。

*/

constuint8_tMAXWAVE=72;//(休息时每分钟心跳72下)

19

classWaveform{

public:

Waveform(void){wavep=0;}

voidrecord(intwaveval){

waveval=waveval/8;//缩放以适合字节

waveval+=128;//(移位如此累实的波形)

waveval=waveval<0?0:waveval;

waveform[wavep]=(uint8_t)(waveval>255)?255:waveval;

wavep=(wavep+1)%MAXWAVE;

}//波形记录波形

voidscale(){

uint8_tmaxw=0;

uint8_tminw=255;

for(inti=0;i<MAXWAVE;i++){

maxw=waveform[i]>maxw?waveform[i]:maxw;

minw=waveform[i]<minw?waveform[i]:minw;

}

uint8_tscale8=(maxw-minw)/4+1;//去保存精度

uint8_tindex=wavep;

for(inti=0;i<MAXWAVE;i++){

disp_wave[i]=

31-((uint16_t)(waveform[index]-minw)*8)/scale8;

index=(index+1)%MAXWAVE;

}

}//规模

voiddraw(uint8_tX){

for(inti=0;i<MAXWAVE;i++){

uint8_ty=disp_wave[i];

oled.drawPixel(X+i,y);

20

if(i<MAXWAVE-1){

uint8_tnexty=disp_wave[i+1];

if(nexty>y){

for(uint8_tiy=y+1;iy<nexty;++iy)

oled.drawPixel(X+i,iy);

}

elseif(nexty<y){

for(uint8_tiy=nexty+1;iy<y;++iy)

oled.drawPixel(X+i,iy);

}

}

}

}//画波形图

private:

uint8_twaveform[MAXWAVE];

uint8_tdisp_wave[MAXWAVE];

uint8_twavep=0;

}wave;

intbeatAvg;//平均值

intSPO2,SPO2f;//心率血氧浓度

intvoltage;//电压

boolfilter_for_graph=false;

booldraw_Red=false;

uint8_tpcflag=0;

uint8_tistate=0;

uint8_tsleep_counter=0;

voidbutton(void){

pcflag=1;

}//pc标志

21

voidcheckbutton(){

if(pcflag&&!digitalRead(BUTTON)){

istate=(istate+1)%4;

filter_for_graph=istate&0x01;

draw_Red=istate&0x02;

EEPROM.write(OPTIONS,filter_for_graph);

EEPROM.write(OPTIONS+1,draw_Red);

}

pcflag=0;

}

voidDisplay_5(){

if(pcflag&&!digitalRead(BUTTON)){

draw_oled(5);

delay(1100);

}

pcflag=0;

}

voidgo_sleep(){

oled.fill(0);

oled.off();

delay(10);

sensor.off();

delay(10);

cbi(ADCSRA,ADEN);//禁用adc

delay(10);

pinMode(0,INPUT);

22

pinMode(2,INPUT);

set_sleep_mode(SLEEP_MODE_PWR_DOWN);

sleep_mode();//睡眠直到按下按钮导致重置

setup();

}

voiddraw_oled(intmsg){

oled.firstPage();

do{

switch(msg){

case0:oled.drawStr(10,0,F("Deviceerror"),1);

break;

case1:oled.drawStr(13,10,F("PLACE"),1);

oled.drawStr(10,20,F("FINGER"),1);

oled.drawChar(100,0,voltage/10+'0');

oled.drawChar(106,0,'.');

oled.drawChar(112,0,voltage%10+'0');

oled.drawChar(118,0,'V');

oled.drawStr(84,14,F("Display"),1);

if(draw_Red)

oled.drawStr(84,24,F("Red"),1);

else

oled.drawStr(84,24,F("IR"),1);

if(filter_for_graph)

oled.drawStr(108,24,F("Avg"),1);

else

oled.drawStr(108,24,F("Raw"),1);

break;

case2:print_digit(86,0,beatAvg);

wave.draw(8);

print_digit(98,16,SPO2f,'',3,1);

oled.drawChar(116,16,'%');

print_digit(98,24,SPO2,'',3,1);

23

oled.drawChar(116,24,'%');

break;

case3:oled.drawStr(30,9,F("Madeby"),1);

oled.drawStr(30,20,F("Electricats"),1);

break;

case4:oled.drawStr(28,12,F("OFFIN"),1);

oled.drawChar(76,12,10-sleep_counter/10+'0');

oled.drawChar(82,12,'s');

break;

case5:oled.drawStr(0,0,F("BMP:"),1);

print_digit(25,0,beatAvg);

oled.drawStr(0,15,F("SpO2:"),1);

print_digit(25,15,SPO2);

oled.drawXBMP(106,8,16,16,heart_bits);

break;

}

}while(oled.nextPage());

}

voidsetup(void){

pinMode(LED,OUTPUT);

pinMode(BUTTON,INPUT_PULLUP);

filter_for_graph=EEPROM.read(OPTIONS);

draw_Red=EEPROM.read(OPTIONS+1);

oled.init();

oled.fill(0x00);

draw_oled(3);

delay(3000);

if(!sensor.begin()){

draw_oled(0);

while(1);

}

sensor.setup();

24

attachInterrupt(digitalPinToInterrupt(BUTTON),button,CHANGE);

}

longlastBeat=0;

longdisplaytime=0;//上次显示更新的时间

boolled_on=false;

voidloop(){

sensor.check();

longnow=millis();//starttimeofthiscycle

if(!sensor.available())return;

uint32_tirValue=sensor.getIR();

uint32_tredValue=sensor.getRed();

sensor.nextSample();

if(irValue<5000){

checkbutton();

draw_oled(sleep_counter<=50?1:4);//fingernotdown

message

delay(200);

++sleep_counter;

if(sleep_counter>100){

go_sleep();

sleep_counter=0;

}

}else{

sleep_counter=0;

//移除直流元件

int16_tIR_signal,Red_signal;

boolbeatRed,beatIR;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论