基于stm32单片机病人监测系统系统(程序+原理图+元件清单全套资料)

功能介绍:采用stm32单片机作为主控CPU,采用MAX30102模块采集心率和血氧,采用MSP20血压传感器采集血压,OLED显示相关数据,并且通过蓝牙模块HC-05上传到手机APP,当心率低于50或者血氧低于90%,蜂鸣器进行报警,

资料包含:
1.源代码(有注释)
2.接线图
3.PCB
4.元件清单
5.参考文章
6.软件工具
7.参考论文
8.特殊定制

基于STM32单片机的病人监测系统毕业论文
摘要

本文设计并实现了一种基于STM32单片机的病人监测系统。该系统通过MAX30102模块采集心率和血氧数据,使用MSP20血压传感器采集血压数据,并通过OLED显示屏显示相关数据。此外,系统通过HC-05蓝牙模块将数据上传到手机APP,并在心率低于50或血氧低于90%时,通过蜂鸣器进行报警。本文详细介绍了系统的硬件设计、软件设计及测试结果。

1. 引言

随着医疗技术的发展,病人监测系统在医疗领域的重要性日益凸显。本文设计的基于STM32单片机的病人监测系统,旨在提供一种便携、高效的监测方案,帮助医护人员及时了解病人的生理状态,提高医疗服务质量。

2. 系统总体设计

系统主要由以下几个部分组成:

主控模块:STM32单片机
心率和血氧采集模块:MAX30102
血压采集模块:MSP20
显示模块:OLED
数据传输模块:HC-05蓝牙模块
报警模块:蜂鸣器
3. 硬件设计
3.1 STM32单片机

STM32单片机是系统的核心控制单元,负责数据的采集、处理和传输。本文选用STM32F103C8T6作为主控芯片,其具有高性能、低功耗的特点,适合用于嵌入式系统。

3.2 MAX30102模块

MAX30102模块用于采集心率和血氧数据。该模块通过I2C接口与STM32单片机通信,提供高精度的测量结果。

3.3 MSP20血压传感器

MSP20血压传感器用于采集血压数据。该传感器通过模拟信号输出,STM32单片机通过ADC模块读取并处理数据。

3.4 OLED显示模块

OLED显示模块用于实时显示心率、血氧和血压数据。本文选用0.96寸OLED显示屏,通过I2C接口与STM32单片机通信。

3.5 HC-05蓝牙模块

HC-05蓝牙模块用于将采集到的数据上传到手机APP。该模块通过串口与STM32单片机通信,支持蓝牙4.0标准。

3.6 蜂鸣器

蜂鸣器用于在心率低于50或血氧低于90%时进行报警。STM32单片机通过GPIO口控制蜂鸣器的开关。

4. 软件设计
4.1 系统初始化

系统上电后,首先进行硬件初始化,包括I2C、ADC、串口和GPIO的初始化。

4.2 数据采集
心率和血氧数据采集:通过I2C接口读取MAX30102模块的数据。
血压数据采集:通过ADC模块读取MSP20传感器的模拟信号,并进行数据处理。
4.3 数据处理
心率和血氧数据处理:对采集到的数据进行滤波和计算,得到心率和血氧值。
血压数据处理:对采集到的模拟信号进行滤波和转换,得到血压值。
4.4 数据显示

通过I2C接口将处理后的数据发送到OLED显示屏进行显示。

4.5 数据传输

通过串口将处理后的数据发送到HC-05蓝牙模块,上传到手机APP。

4.6 报警功能

当心率低于50或血氧低于90%时,通过GPIO口控制蜂鸣器进行报警。

5. 系统测试
5.1 功能测试
心率和血氧测试:使用MAX30102模块采集数据,验证数据的准确性和稳定性。
血压测试:使用MSP20传感器采集数据,验证数据的准确性和稳定性。
显示测试:通过OLED显示屏显示心率、血氧和血压数据,验证显示效果。
数据传输测试:通过HC-05蓝牙模块将数据上传到手机APP,验证数据传输的稳定性和准确性。
报警测试:设置心率低于50或血氧低于90%的条件,验证蜂鸣器的报警功能。
5.2 性能测试
功耗测试:测量系统在不同工作状态下的功耗,验证系统的低功耗设计。
响应时间测试:测量系统从采集数据到显示数据的响应时间,验证系统的实时性。
6. 结论

本文设计并实现了一种基于STM32单片机的病人监测系统。该系统通过MAX30102模块采集心率和血氧数据,使用MSP20血压传感器采集血压数据,并通过OLED显示屏显示相关数据。此外,系统通过HC-05蓝牙模块将数据上传到手机APP,并在心率低于50或血氧低于90%时,通过蜂鸣器进行报警。测试结果表明,该系统具有较高的准确性和稳定性,能够满足实际应用的需求。

参考文献

[1] STM32官方文档
[2] MAX30102模块数据手册
[3] MSP20血压传感器数据手册
[4] HC-05蓝牙模块数据手册
[5] OLED显示模块数据手册

#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "timer_task.h"
#include "mqtt-user.h"
#include "sim900a.h"
#include "timer.h"
#include "frozen.h"
#include "parameter.h"
#include "system.h"
#include "relay.h"

uint64_t curr_time = 0;
uint64_t curr_cmd_id = 0;
char curr_state = 1;

static int read_tcp_func(void* arg);
static int send_beat_func(void* arg);
static int set_relay_func(void* arg);

timer_task_t read_tcp_task = {
    .last_time = 0,
    .next_time = 1,
    .func = read_tcp_func,
};

timer_task_t send_beat_task = {
    .last_time = 0,
    .next_time = 40,
    .func = send_beat_func,
};

timer_task_t set_relay_task = {
    .last_time = 0,
    .next_time = 0,
    .func = set_relay_func,
};

/*
 *{id:13,command:"relay",data:"5"}
 *{id:14,command:"on",data:"5"}
 *{"imei":"866104823648374","state":"1"}
 */
int read_tcp_func(void* arg)
{
    char* json_start = NULL;
    char* json_end = NULL;
    int json_len = -1;
    int i = 0;

    char* cmd = NULL;
    char* data = NULL;

    sim900a_read_tcp(NULL, 0);

    gsm_global_data.frame_buf[GSM_DATA_RECORD_MAX_LEN - 1] = '\0';

    json_start = gsm_global_data.frame_buf;

    for (i=0;i<GSM_DATA_RECORD_MAX_LEN;i++) {
        if (*json_start == '{') {
            break;
        }
        json_start++;
    }

    if (NULL == json_start) {
        return 0;
    }

    json_end = json_start;

    for (i=0;i<GSM_DATA_RECORD_MAX_LEN;i++) {
        if (*json_end == '}') {
            break;
        } else if (*json_end == '\0') {
            json_end = NULL;
            break;
        }
        json_end++;
    }

    if (NULL == json_end) {
        return 0;
    }

    json_len = json_end -json_start;

    if (json_len < 5) {
        return 0;
    }

    printf("MSG IN--->\n%s\n", json_start);

    json_scanf(json_start, json_len, "{imei:%Q,state:%Q}", &cmd, &data);

    if (atoi(data) > 0) {
        printf("relay cmd on!\n");
        relay_on();
        curr_state = 1;
    } else {
        printf("relay cmd off!\n");
        relay_off();
        curr_state = 0;
    }

    //mqtt_publish("topic_server", json_start, json_len + 1, 0);
    
    free(cmd);
    free(data);

    return 0;
}

int send_beat_func(void* arg)
{
    return mqtt_send_beat("topic_server", curr_state);
}

int set_relay_func(void* arg)
{
    set_relay_task.next_time = 0;

    relay_off();
    
    return 0;
}

/******************************************
 * Checking timeout and run functions
 *******************************************/

int timer_task_executer(timer_task_t* task, void* arg)
{
    int ret = -1;
    uint64_t start_time = curr_time;

    if (curr_time - task->last_time >= task->next_time &&
        task->next_time > 0) {
        ret = task->func(arg);
        if (0 > ret) {
            printf("%s:%d:execute task failed\n", __func__, __LINE__);
        } else {
            task->last_time = start_time;
        }
    }

    return ret;
}

void update_current_time()
{
    curr_time = sys_time_sec;
}

void user_task_loop()
{
    update_current_time();

    read_tcp_func(NULL);
    //timer_task_executer(&read_tcp_task, NULL);
    timer_task_executer(&send_beat_task, NULL);
    timer_task_executer(&set_relay_task, NULL);
}

### 关于心率传感器MSP20N的技术规格及其在信息技术领域中的应用 #### 技术规格 心率传感器MSP20N是一款专为健康监测设备设计的心率检测模块。该器件能够通过光电容积脉搏波描记法(PPG),即利用光吸收原理来测量血液流动情况,从而获取心脏跳动速率的信息。 - **工作电压**: 通常支持3V到5V的工作范围。 - **接口方式**: 支持I²C/SPI等多种通信协议以便连接至MCU或其他处理器单元。 - **采样精度高**, 可提供精确可靠的数据采集能力, 对微弱信号具有较强的抗干扰性能. - **内置温度补偿功能**, 减少环境因素对于测量准确性的影响. 上述描述综合了常见商用级医疗电子元件的一般属性[^1]. #### 应用场景 在信息技术(IT)行业中,MSP20N可以应用于多种便携式穿戴装置和个人健康管理平台: - 开发基于嵌入式系统的个人健身追踪器或智能手表,在这些产品中集成此款传感器可以帮助用户实时监控自己的身体状态并记录日常活动量; ```c // 示例代码片段展示如何初始化一个SPI接口的心率传感器 void initHeartRateSensor(void){ // 设置 SPI 参数... } ``` - 构建远程医疗服务解决方案的一部分,比如家庭护理系统或是医院内部使用的移动监护仪; - 教育培训用途的教学实验套件组件之一,让学生们接触实际硬件开发流程的同时掌握生物医学工程基础知识。 值得注意的是,虽然提到了一些可能的应用方向,但在具体项目实施过程中还需要考虑更多细节方面的要求,例如功耗管理策略的选择、软件算法的设计等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科创工作室li

你的鼓励将是大学生的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值