# 前言
该文主要讲述了以及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
没有合适的资源?快使用搜索试试~ 我知道了~
基于STM32的心率监测装置
共209个文件
h:37个
d:36个
o:36个
需积分: 0 6 下载量 58 浏览量
2024-04-15
09:14:21
上传
评论 1
收藏 15.56MB 7Z 举报
温馨提示
pulse sensor心率传感器采用ADC进行数据采集,使用到了ADC0(PA0)。通过配置ADC引脚完成ADC的采集,通过实验,可以正常的采集到数据。使用了软件IIC,直接移植的正点原子的官方例程的IIC,OLED显示也是移植的正点原子的程序,只是做了改进,可以显示汉字(正点原子的官方例程中OLED程序不能显示汉字,我对代码进行升级,可以显示汉字),还增加了自动在数字前面补0的功能。 //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++) {
资源推荐
资源详情
资源评论
收起资源包目录
基于STM32的心率监测装置 (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_usart.d 2KB
stm32f10x_flash.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_dac.d 2KB
stm32f10x_rcc.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
资源评论
H_zizi
- 粉丝: 355
- 资源: 66
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功