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

简介: 本文详解基于STM32的心率监控仪设计,涵盖硬件搭建、ADC采样、峰值检测算法及OLED波形显示。采用STM32F103C8T6与PulseSensor实现心率实时监测,支持报警提示与按键交互,适合嵌入式入门与课程实践。

基于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 1
            if(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);
                }
            }
#endif
            OLED_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(心率变异性)计算
相关文章
|
7月前
|
传感器 机器学习/深度学习 监控
基于STM32的人体健康监测系统设计与实现(温度、心率、老人摔倒检测)【开源免费】
本文介绍了一个基于 STM32 微控制器 的健康监测系统,涵盖了 温度采集、心率监测、跌倒检测 等核心功能,并通过蓝牙实现数据传输与报警提醒。该系统在家庭养老、运动监控、医疗健康等场景具有广阔的应用前景。未来可以结合 AI+物联网 技术,进一步提升智能化和实用性。
1868 12
|
3月前
|
传感器 监控 网络协议
【开源源码】基于 STM32智能温度监控系统 | 一个支持远程监控与告警的嵌入式实践项目
本项目基于STM32与μC/OS实时操作系统,结合LWIP协议栈,实现支持远程监控与告警的智能温度系统。通过多任务协同,完成温度采集、网络通信与阈值告警,支持手机App实时查看与配置。系统具备高实时性、稳定性与扩展性,是RTOS与物联网技术融合的典型嵌入式实践案例,开源可学,适用于工业、智能家居等场景。
【开源源码】基于 STM32智能温度监控系统 | 一个支持远程监控与告警的嵌入式实践项目
|
3月前
|
传感器 数据采集 安全
基于 STM32 的智能窗户控制系统设计与实现【源码分享】
基于STM32与ESP8266设计智能窗户系统,集成温湿度、雨滴、光照、风速等多传感器,实现环境感知、自动开关窗、入侵检测及远程APP控制。支持MQTT/HTTP通信,具备高扩展性与实用性,助力传统家居智能化升级。(239字)
基于 STM32 的智能窗户控制系统设计与实现【源码分享】
|
3月前
|
传感器 存储 数据采集
【开源免费】基于 STM32的远程环境监测系统(环境数据的实时感知与远程监测)
远程环境监测系统不仅是物联网技术的典型应用场景,也是嵌入式系统、网络通信与云计算融合的综合体现。希望本项目的设计思路与工程经验,能够为从事物联网与嵌入式开发的读者提供参考与启发。 本远程环境监测系统项目围绕“低成本、可扩展、工程可落地”这一核心目标,完整实现了从环境数据采集、嵌入式设备处理、网络通信,到云端存储与远程可视化展示的物联网闭环系统。通过合理的系统分层与模块化设计,有效降低了嵌入式设备联网的复杂度和数据传输成本,同时保证了系统运行的稳定性与可维护性。
|
1月前
|
人工智能 监控 安全
人体姿态[站着、摔倒、坐、深蹲、跑]检测数据集(6000张图片已划分、已标注)| AI训练适用于目标检测
高质量的数据集是 AI 模型成功的关键。本人体姿态识别数据集经过精心标注,覆盖多种常见姿态,既可以用于目标检测模型训练,也可用于行为分析研究。无论你是科研开发者还是工程应用者,这个数据集都能帮助你快速搭建人体姿态识别系统。本篇文章介绍了 人体姿态识别数据集(6000张图片) 的构成与使用方法。数据集覆盖五种常见姿态:站着、摔倒、坐、深蹲、跑,并按照 训练集与验证集(约5:1) 划分,保证了模型训练的效果与泛化能力。
263 10
|
7月前
|
传感器 数据采集 人工智能
基于STM32单片机的智能晾衣架设计与实现【开源免费】
随着智能家居的发展,传统晾衣架已经难以满足现代家庭对便捷、智能化的需求。基于STM32单片机的智能晾衣架能够实现自动升降、光照检测、风干控制、远程控制等功能,为家庭用户提供更智能、更舒适的晾晒体验。本项目以STM32F103C8T6为核心控制器,通过电机驱动模块、光照传感器、温湿度传感器、蓝牙/Wi-Fi通信模块,实现晾衣架的自动化与远程控制。
基于STM32单片机的智能晾衣架设计与实现【开源免费】
|
3月前
|
传感器 算法 安全
【代码开源】基于 STM32 的智能空气加湿器设计与实现
本项目通过STM32单片机构建了一款智能空气加湿器,实现了温湿度自动监测与调控、智能显示以及远程控制等功能。在硬件方面,系统整合了湿度传感器、温度传感器、超声波雾化模块以及OLED显示屏,实现了环境数据的实时采集和直观展示。在软件方面,基于STM32的控制程序通过PID调节算法对加湿器进行精确控制,同时支持定时和手动模式,提高了使用灵活性与舒适度。
【代码开源】基于 STM32 的智能空气加湿器设计与实现
|
7月前
|
传感器 存储 数据采集
基于 STM32 的睡眠质量检测仪设计与实现【开源免费】
在当今快节奏的生活方式下,越来越多的人面临 失眠、睡眠不足、深度睡眠时间偏短 等健康问题。良好的睡眠不仅是缓解疲劳的关键,更是维持身体免疫力和心理健康的重要保障。传统的睡眠质量检测往往依赖昂贵的医疗设备或专业睡眠实验室,而这些方式成本高、使用不便,不适合日常监测。
基于 STM32 的睡眠质量检测仪设计与实现【开源免费】
|
3月前
|
传感器 监控 算法
基于 STM32 的老人摔倒报警装置项目【源码分享】
在我国逐步迈入老龄化社会的背景下,独居老人摔倒事故频发且救援不及时的情况越来越受到关注。摔倒后无法及时呼救,是老年人伤亡的重要原因之一。因此,构建一套低成本、可靠、可实时报警的摔倒监测系统具有重要价值。
|
3月前
|
传感器 物联网 API
【源码开源】基于 STM32 的智能桌面天气预报系统
基于 STM32 的智能桌面天气预报系统,是一个将 嵌入式开发、物联网数据获取、语音识别、人机交互 有机结合的综合性实践项目。它不仅具备天气查询、空气质量显示等功能,还实现了语音控制、触摸交互和收音机娱乐,功能丰富且体验友好。