当前位置: 首页 > news >正文

[开源免费]基于STM32的心率监控仪 —— 从原理到实现的完整技术解析

基于STM32的心率监控仪 —— 从原理到实现的完整技术解析

前言

心率监测技术在智能穿戴、健康管理设备中已经非常普及,但如果你想亲手做一个心率监控仪,理解其硬件原理、信号采集方法以及心率算法,其实并不复杂。在大四毕业设计期间,我曾基于 STM32F103C8T6 + PulseSensor + OLED 实现过一台完整可用的心率监控仪,并将全过程整理成技术文档。

本文将结合当时的实践,系统讲解这个小项目的实现思路,涵盖从硬件设计、信号采集、算法处理到界面显示的完整流程,帮助你快速入门一个小而完整的嵌入式信号采集项目。
在这里插入图片描述

源码分享

直接放到之前写的文章里了,免费开源,下载学习即可。
https://blog.csdn.net/weixin_52908342/article/details/155599089

项目介绍

本项目的核心功能包括:

  • 采集手指脉搏的光电信号
  • 使用 STM32 内部 ADC 进行采样
  • 利用算法识别心率波形峰值,并计算 BPM(Beats Per Minute)
  • 在 OLED 上实时显示波形与心率数值
  • 当心率异常时通过蜂鸣器报警
  • 支持按键切换界面、关闭报警等交互

使用到的关键器件:

  • Pulse Sensor 心率传感器(模拟信号输出)
  • STM32F103C8T6 最小系统板
  • 0.96 寸 128×64 OLED(IIC 接口)
  • LED ×1
  • 按键 ×2
  • 蜂鸣器 ×1(需三极管驱动)

成品具有较清晰的心率波形显示、较稳定的数据采集能力,以及轻量的硬件成本,非常适合作为课程设计或个人项目。


开发环境与硬件构成

软件环境

  • Windows 10
  • MDK-ARM Keil 5.24
  • 下载器:ST-Link / J-Link / 串口均可
    在这里插入图片描述

硬件清单

器件 功能
STM32F103C8T6 主控芯片
Pulse Sensor 心率模块 采集脉搏光电信号
OLED(IIC) 显示波形与数据
蜂鸣器 + 三极管 心率异常报警
按键 2 个 页面切换、报警消除
LED 心跳指示灯(可选)

硬件电路设计

Pulse Sensor 通过光电反射检测指尖血液流动变化,并输出模拟电压信号。STM32 使用 ADC1 通道 0(PA0) 进行采样。配合简单 RC 滤波,可有效抑制部分噪声干扰。

OLED 使用软件 IIC 驱动(示例中使用 PA7/SDA 和 PA8/SCL),布线简单,占用资源少。

蜂鸣器由 NPN 三极管驱动,避免 GPIO 无法直接提供驱动电流的问题。

完整连接关系如下:

  • Pulse Sensor → PA0(ADC)
  • OLED SDA → PA7
  • OLED SCL → PA8
  • 按键 K1/K2 → 任意 GPIO(带上拉)
  • 蜂鸣器 → 三极管 → GPIO
  • LED → GPIO

(电路图略,可按你的原图展示)


软件设计与核心模块

软件部分主要包含三大模块:

  1. OLED 显示系统
  2. ADC 采样与信号预处理
  3. 心率计算算法(峰值检测法)

1. OLED 显示模块

OLED 采用软件 IIC 驱动,兼容性好且不占用硬件 IIC。显示部分我在移植正点原子例程基础上进行了:

  • 优化字库,支持显示汉字
  • 增加数字补零功能
  • 提供波形绘制和连续补点,使曲线更平滑

下面是波形绘制核心代码示例:

void OLED_Waveform_display(void)
{int i, n;if(waveform_flag){waveform_flag = 0;for(i = 127; i >= 0; i--){for(n = 0; n < 64; n++)OLED_DrawPoint(i, n, 0);#if 1if(i != 0){if(abs(waveform[i] - waveform[i-1]) > 1){int start = MIN(waveform[i], waveform[i-1]);int end = MAX(waveform[i], waveform[i-1]);for(n = start; n <= end; n++)OLED_DrawPoint(i, n, 1);}}
#endifOLED_DrawPoint(i, waveform[i], 1);}OLED_Refresh_Gram();}
}

2. Pulse Sensor 信号采样

Pulse Sensor 输出模拟信号,需要 STM32 的 ADC 来采集。建议采样频率在 400Hz~500Hz 之间(本项目使用 2ms 定时器中断 = 500Hz)。

核心采样流程:

  1. 定时器每 2ms 进入中断
  2. 执行 ADC 启动转换
  3. 读取电压值(0–4095)
  4. 保存到波形缓存
  5. 调用心率处理算法

3. 心率计算算法(峰值检测法)

算法原理非常经典:

  1. 记录采样时间戳(sampleCounter)
  2. 找到波峰(P)和波谷(T)
  3. 检测信号越过阈值(thresh)时触发一次心跳
  4. 计算两次心跳间隔(IBI = Inter Beat Interval)
  5. BPM = 60000 / 平均 IBI

以下为简化算法片段:

void HeartRate_deal(void)
{Num = sampleCounter - lastBeatTime;if (Signal < thresh && Num > (IBI/5)*3)if (Signal < T) T = Signal;if (Signal > thresh && Signal > P)P = Signal;if (Num > 250){if (Signal > thresh && !Pulse && Num > (IBI/5)*3){Pulse = true;IBI = sampleCounter - lastBeatTime;lastBeatTime = sampleCounter;if (firstBeat) { firstBeat = false; secondBeat = true; return; }if (secondBeat){secondBeat = false;for (i = 0; i < 10; i++)rate[i] = IBI;}runningTotal = 0;for (i = 0; i < 9; i++) { rate[i] = rate[i+1]; runningTotal += rate[i]; }rate[9] = IBI;runningTotal += rate[9];BPM = 60000 / (runningTotal / 10);QS = true;}}if (Signal < thresh && Pulse){Pulse = false;amp = P - T;thresh = amp/2 + T;P = thresh;T = thresh;}if (Num > 2500){thresh = P = T = 512;firstBeat = true;secondBeat = false;lastBeatTime = sampleCounter;}
}

该算法具有较好的鲁棒性,在 PulseSensor 官方算法基础上进行了简化与调优。


系统交互设计

实际运行中,设备具有以下操作流程:

  1. 按键 K1:切换界面

    • 界面 1:显示心率数值、ADC 原始数据等
    • 界面 2:实时心率波形显示
  2. 手指检测机制

    • 利用采集到 0 值的“空白时间段”判断是否有人手放上传感器
  3. 心率异常报警

    • 当 BPM 不在设定区间(如 40–150)蜂鸣器报警
  4. 按键 K2:关闭蜂鸣器


在这里插入图片描述

成品展示

你可以使用原项目中的图片,例如:

  • 心率动态波形图
  • 心率数据界面
  • 实际测试图
    在这里插入图片描述

总结

本项目虽然硬件简单,但涵盖了 传感器信号采集 → 嵌入式算法处理 → 波形图形化显示 → 用户交互设计 的完整体系,非常适合作为嵌入式入门项目或课程设计。

你可以在此基础上继续扩展:

  • 通过 BLE/WiFi 上传数据
  • 加滤波器、卡尔曼算法优化心率稳定性
  • 更换更高性能的 MCU
  • 增加 PPG 信号分析与 HRV(心率变异性)计算
http://www.rkmt.cn/news/74585.html

相关文章:

  • 尺度变换是指图片大小变化吗
  • Keyviz 屏幕按键程序 下载
  • 2025上海外资注册公司五大靠谱机构年度排名,看看哪家收费便
  • 深入理解MySQL基本原理和架构
  • 2025年装配式建筑房屋材料制造/安装公司排行榜,精选技术强
  • 轻松上手:使用 Vercel 部署 HTML 页面教程 - 实践
  • redis集群下如何启用lua脚本
  • 2025 年 12 月桥架型材厂家权威推荐榜:铝合金/不锈钢/热镀锌桥架,大跨距线槽与专用型材实力品牌深度解析
  • 2025年中国优质滑板公园设计工作室推荐:靠谱的滑板公园设计
  • 2025年12月角接触球轴承厂家权威推荐榜:精密/推力/不锈钢/密封/超高速/低噪音/机器人专用等全系列轴承深度解析与选购指南
  • 2025年度桥梁护栏专业厂家TOP5权威推荐:甄选企业助力基
  • 2025 年 12 月合肥搬家公司权威推荐榜:专业团队与高效服务,覆盖包河区、蜀山区等全市范围的正规搬家公司精选
  • 2025 年 12 月薄膜包衣厂家权威推荐榜:药用包衣粉/预混辅料/包衣剂,创新工艺与稳定品质的行业标杆之选
  • 2025 年 12 月珩磨机厂家权威推荐榜:球面/球头/髋关节磨削珩磨机,镜面抛光与超精加工机床实力解析
  • 2025年智能仓储物流公司权威推荐榜:自动化冷链医药次日达,快运大件轿车托运零担同城配,长途短途专线电商仓储全解析
  • 2025 年 12 月宁波网站建设厂家权威推荐榜:网站搭建/推广/设计/定制,企业品牌与营销展示网站一站式解决方案
  • 2025年成都五大离婚律师排名推荐:权威离婚律师咨询与收费标
  • 2025年网站建设与智能营销公司口碑五大排名:南方网通位居前
  • 幻兽帕鲁支持网络联机版
  • 2025年五大靠谱防盗门品牌售后服务推荐,北京盼盼防盗门厂家
  • 十大三维扫描仪品牌推荐:国产化替代浪潮下的首选型号
  • 【后端】使用 Easy Rules 构建灵活的业务规则引擎 — Spring Boot 集成实践 - 实践
  • 2025 年 12 月上海保洁服务权威推荐榜:专业开荒、精细养护与全场景保洁口碑之选
  • 2025 年 12 月大回旋切断机厂家权威推荐榜:高效精准的金属加工利器,实力工厂与创新技术深度解析
  • Obsidian的Bases数据库入门教程,使用数据库实现Todo待办管理系统
  • 2025年12月AI智搜GEO服务商权威推荐榜:福州/莆田/三明地区智能搜索推广与排名优化专家深度解析
  • PbootCMS网站修改CSS样式后自动更新缓存
  • pbootcms模板获取指定栏目下面的所有单页内容(PbootCMS模板获取指定栏目下所有单页内容的方法)
  • 2025年玻璃钢拉挤型材推荐厂商排名:正规定制厂家全解析
  • 基于融智学双重形式化的汉字汉语数学建模技巧