功能介绍:采用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);
}