版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年食堂员工合同(1篇)
- 2026年劳务合同是劳务派遣合同(1篇)
- 2026年楼房无证转让合同(1篇)
- 任务二 用吹风机吹头发教学设计小学劳动鲁科版四年级上册-鲁科版
- 2026年消防房屋建设合同(1篇)
- 2025-2026学年少年当自强班会教学设计
- 8.2平行线及其判定(2)同位角、内错角、同旁内角教学设计-青岛版(2024)七年级数学下册
- 2025-2026学年松鼠教学设计英语高中
- 2.3 建构原子模型(第2课时)(教学设计)七年级科学下册同步备课系列(浙教版)
- 企业生产领域工业固废规范处置排查整治方案
- 铝粉尘安全管理制度
- CJ/T 527-2018道路照明灯杆技术条件
- 肛肠疾病的预防与管理
- 股权投资管理试题及答案
- 帮忙办理调动协议书
- GB/Z 45463-2025热喷涂涂层孔隙率的测定
- 《三维点云:原理、方法与技术》笔记
- 中考英语:近三年中考英语530个高频词非常重要
- 【MOOC】宋词经典-浙江大学 中国大学慕课MOOC答案
- 计算机系统结构曹强习题答案
- 第5课《大自然的语言》课件++2023-2024学年统编版八年级语文下册
评论
0/150
提交评论