博客 / 詳情

返回

[開源免費]基於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 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(心率變異性)計算
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.