# 前言
该文主要讲述了以及STM32的一个心率传感装置的制作过程和最终实现的效果,这是我在大四毕业的时候帮别人做的一个毕业设计的小作品,最初的文章是发表在电子发烧友上面的,现转载github。原链接请点击此处:[点我跳转](http://bbs.elecfans.com/forum.php?mod=viewthread&tid=1600343&page=1#pid7932932 "点我跳转")
# 介绍
最近做了一个机遇STM32的心率监测装置,使用了一块oled屏幕进行检测到的心率的波形的显示。
心率监测传感器使用的传感器是pulse sensor,是一款比较便宜的传感器。显示屏采用的是128X64的oled显示器。
首先放上成品图,不然你们是没有兴趣看的。^_^
![心率动态显示](https://github.com/hehung/STM32-heart-rate-monitoring/blob/master/img/Heart_rate_oscillogram.gif?raw=true "心率动态显示")
![心率数据](https://github.com/hehung/STM32-heart-rate-monitoring/blob/master/img/Heart_rate_data.gif?raw=true "心率数据")
# 开发环境与开发器件
开发环境:
1、win10 +MDK keil5.24
2、ST-LINK下载器(不一定需要这个,J-LINK和串口下载都是可以的)
我是用的是STM32F103C8T6最小系统板,价格比较便宜并且功能足够强大。
元器件有:
==>pulse sensor心率传感器
==>IIC OLED显示屏
==>按键2个
==>LED1个
==>蜂鸣器1个
# 电路设计
在硬件结构方面还是比较简单的,连线比较简单,就是在软件方面花费了我一些时间,算法处理和波形系那是还是花了一些时间采写好的。
放上电路连接图:
![电路图](https://github.com/hehung/STM32-heart-rate-monitoring/blob/master/img/Schematic.jpg?raw=true "电路图")
# 软件实现
## OLED
OLED方面我采用的是IIC操作的OLED,因为IIC操作简单,只需要两根线(我直接使用的PA7和PA8)。使用了软件IIC,直接移植的正点原子的官方例程的IIC,OLED显示也是移植的正点原子的程序,只是做了改进,可以显示汉字(正点原子的官方例程中OLED程序不能显示汉字,我对代码进行升级,可以显示汉字),还增加了自动在数字前面补0的功能。
由于程序比较大,这里只放了重点的代码,在后面也提供源码。
```c
//OLED波形显示函数
void OLED_Waveform_display(void)
{
int i;
u8 n;
IF(waveform_flag == 1)
{
waveform_flag = 0;
for(i=127;i>=0;i--)
{
for(n=0;n<64;n++)
{
OLED_DrawPoint(i,n,0);
}
//波形线补点操作,如果不用,可以注释掉,将#if 1改为#if 0
//引用波形补点函数可以是波形看起来是连续的
#if 1
if(i!=0)
{
if(myabs((int)waveform-(int)waveform[i-1])>1)
{
if(waveform > waveform[i-1])
{
for(n=waveform[i-1];n<waveform;n++)
{
OLED_DrawPoint(i,n,1); //在相应的像素点上打印
}
}else
{
for(n=waveform;n<waveform[i-1];n++)
{
OLED_DrawPoint(i,n,1); //在相应的像素点上打印
}
}
}
}
OLED_DrawPoint(i,waveform,1); //在相应的像素点上打印
#endif
}
OLED_Refresh_Gram(); //更新显示到OLED
}
}
```
## pulse sensor心率传感器
pulse sensor心率传感器采用ADC进行数据采集,使用到了ADC0(PA0)。通过配置ADC引脚完成ADC的采集,通过实验,可以正常的采集到数据。当人的手指放上之后用示波器可以看到心跳的电压变化。
### 操作说明书
说明书密码(xinghuidianzi):
Pulse Sensor使用说明书V5.5(密码xinghuidianzi)
[点此处下载](https://raw.githubusercontent.com/hehung/STM32-heart-rate-monitoring/master/doc/Pulse%20Sensor%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E%E4%B9%A6V5.5%EF%BC%88%E5%AF%86%E7%A0%81xinghuidianzi%EF%BC%89.pdf?token=AIHJEAQXAKGJ7R3PJBQMJBS52AKGM "点此处下载")
### 心率监测算法实现
心率算法就是检测心率波形的峰值,检测到 有60000ms 除以两个峰值时间(ms)就是心率值,说起来比较简单,但是操作起来有各种干扰,通过官方的例程上进行修改,最终成功测出心率值,还是比较准确的
```c
//心率采集与计算处理
void HeartRate_deal(void)
{
unsigned int runningTotal;
u8 i;
Num = sampleCounter - lastBeattime; //监控最后一次节拍后的时间,以避免噪声
//找到脉冲波的波峰和波谷
if(Signal < thresh && Num > (IBI/5)*3) //为了避免需要等待3/5个IBI的时间
{
if(Signal < T)
{ //T是阈值
T = Signal; //跟踪脉搏波的最低点,改变阈值
}
}
if(Signal > thresh && Signal > P) //采样值大于阈值并且采样值大于峰值
{
P = Signal; //P是峰值,改变峰值
}
//现在开始寻找心跳节拍
if (Num > 250) //避免高频噪声
{
if ((Signal > thresh) && (Pulse == false) && (Num > (IBI/5)*3))
{
Pulse = true; //当有脉冲的时候就设置脉冲信号。
// LED_ON(); //打开LED,表示已经有脉冲了
IBI = sampleCounter - lastBeatTime; //测量节拍的ms级的时间
lastBeatTime = sampleCounter; //记录下一个脉冲的时间。
if(secondBeat) //如果这是第二个节拍,如果secondBeat == TRUE,表示是第二个节拍
{
secondBeat = false; //清除secondBeat节拍标志
for(i=0; i<=9; i++) //在启动时,种子的运行总数得到一个实现的BPM。
{
rate = IBI;
}
}
if(firstBeat) //如果这是第一次发现节拍,如果firstBeat == TRUE。
{
firstBeat = false; //清除firstBeat标志
seco
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
嵌入式优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人单片机开发经验充足,深耕嵌入式领域,有任何使用问题欢迎随时与我联系,我会及时为你解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明,项目具体内容可查看下方的资源详情。 【附带帮助】: 若还需要嵌入式物联网单片机相关领域开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注嵌入式领域】: 有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端可私信,为你解惑,欢迎交流。 【建议小白】: 在所有嵌入式开发中硬件部分若不会画PCB/电路,可选择根据引脚定义将其代替为面包板+杜邦线+外设模块的方式,只需轻松简单连线,下载源码烧录进去便可轻松复刻出一样的项目 【适合场景】: 相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可以基于此项目进行扩展来开发出更多功能
资源推荐
资源详情
资源评论
收起资源包目录
基于stm32设计的心率监控设备.zip (毕设/课设/竞赛/实训/项目开发) (209个子文件)
Template.uvguix.Administrator 175KB
Template.axf 601KB
Template_sct.Bak 464B
keilkilll.bat 372B
stm32f10x_tim.c 104KB
stm32f10x_flash.c 59KB
stm32f10x_rcc.c 49KB
stm32f10x_adc.c 45KB
stm32f10x_i2c.c 43KB
stm32f10x_can.c 43KB
stm32f10x_usart.c 36KB
system_stm32f10x.c 35KB
stm32f10x_fsmc.c 34KB
stm32f10x_spi.c 29KB
stm32f10x_dma.c 28KB
stm32f10x_sdio.c 27KB
stm32f10x_gpio.c 22KB
stm32f10x_dac.c 18KB
core_cm3.c 16KB
main.c 11KB
stm32f10x_cec.c 11KB
stm32f10x_pwr.c 8KB
stm32f10x_rtc.c 8KB
stm32f10x_bkp.c 8KB
delay.c 7KB
misc.c 7KB
OLED.c 7KB
stm32f10x_exti.c 7KB
stm32f10x_wwdg.c 5KB
stm32f10x_dbgmcu.c 5KB
stm32f10x_iwdg.c 5KB
usart.c 5KB
myiic.c 3KB
stm32f10x_crc.c 3KB
stm32f10x_it.c 2KB
adc.c 2KB
GPIO_INIT.c 1KB
timer.c 1KB
sys.c 835B
stm32f10x_tim.crf 361KB
main.crf 350KB
stm32f10x_can.crf 348KB
stm32f10x_adc.crf 346KB
stm32f10x_rcc.crf 346KB
stm32f10x_flash.crf 346KB
usart.crf 345KB
stm32f10x_i2c.crf 345KB
stm32f10x_usart.crf 345KB
stm32f10x_fsmc.crf 345KB
oled.crf 344KB
stm32f10x_sdio.crf 343KB
stm32f10x_spi.crf 343KB
stm32f10x_gpio.crf 343KB
myiic.crf 342KB
stm32f10x_dma.crf 342KB
stm32f10x_dac.crf 341KB
stm32f10x_cec.crf 341KB
adc.crf 341KB
gpio_init.crf 340KB
system_stm32f10x.crf 340KB
delay.crf 340KB
stm32f10x_bkp.crf 340KB
stm32f10x_pwr.crf 340KB
stm32f10x_rtc.crf 340KB
timer.crf 340KB
stm32f10x_exti.crf 340KB
sys.crf 339KB
stm32f10x_wwdg.crf 339KB
misc.crf 339KB
stm32f10x_iwdg.crf 339KB
stm32f10x_crc.crf 339KB
stm32f10x_it.crf 339KB
stm32f10x_dbgmcu.crf 338KB
core_cm3.crf 4KB
stm32f10x_dbgmcu.d 2KB
stm32f10x_flash.d 2KB
stm32f10x_usart.d 2KB
stm32f10x_fsmc.d 2KB
stm32f10x_iwdg.d 2KB
stm32f10x_sdio.d 2KB
stm32f10x_gpio.d 2KB
stm32f10x_exti.d 2KB
stm32f10x_wwdg.d 2KB
main.d 2KB
stm32f10x_rcc.d 2KB
stm32f10x_dac.d 2KB
stm32f10x_crc.d 2KB
stm32f10x_adc.d 2KB
stm32f10x_pwr.d 2KB
stm32f10x_can.d 2KB
stm32f10x_rtc.d 2KB
stm32f10x_i2c.d 2KB
stm32f10x_bkp.d 2KB
stm32f10x_tim.d 2KB
stm32f10x_spi.d 2KB
stm32f10x_dma.d 2KB
stm32f10x_cec.d 2KB
system_stm32f10x.d 2KB
stm32f10x_it.d 2KB
gpio_init.d 2KB
共 209 条
- 1
- 2
- 3
资源评论
阿齐Archie
- 粉丝: 1w+
- 资源: 2303
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功