一、设计简介
本项目旨在利用STM32F103C8T6微控制器为核心,构建一个实时人体健康监测系统。该系统集成了多种传感器和模块,能够全面、准确地监测并显示人体的关键健康数据,同时提供异常报警功能,还通过蓝牙通信功能实现了数据的远程传输和记录,方便用户随时了解自己的健康状况并进行相应的调整。同时,系统的异常报警功能也为用户的健康提供了有力的保障。确保用户能够及时了解自身的健康状况。
原理图源代码等相关资料相关在文末
二、功能设计
- 心率血氧监测:
- 通过MAX30102传感器,系统能够实时采集并处理人体的心率和血氧饱和度数据。
- 行走步数监测:
- 利用ADXL345加速度传感器,系统能够准确记录用户的行走步数,
- 体温监测:
- 通过DS18B20温度传感器,系统能够实时测量并显示用户的体温数据,
- 实时时间显示与修改:
- 系统配备了一个独立的RTC时钟模块,能够显示当前时间,并允许用户通过按键进行时间的修改,确保时间的准确性和实用性。
- OLED液晶显示:
- 系统采用OLED液晶显示屏,能够清晰地显示当前时间、心率、血氧、体温和步数等关键健康数据,方便用户随时查看。
- 蓝牙通信:
- 系统支持蓝牙连接功能,能够将采集到的健康数据无线传输到手机端蓝牙调试软件上,方便用户进行远程监测和数据记录。
- 阈值设置与异常报警:
- 用户可以根据自身健康状况设置心率、血氧和温度的正常范围阈值。一旦系统检测到数据超出设定的阈值范围,将立即触发声光报警功能
三、所需硬件连接
(1)、通过MAX30102的采集心率血氧数据;
(2)、ADXL345采集当前行走步数;
(3)、DS18B20采集温度数据;
(4)、独立RTC时钟模块显示当前时间,可通过按键修改时间;
(5)、OLED液晶显示当前时间,心率血氧,体温,步数。
(6)、蓝牙通讯模块HC05、HC06连接蓝牙,手机端蓝牙调试软件接收无线传输数据。
(7)、设置阈值,心率血氧和温度的正常范围
(8)、异常情况触发声光报警
四、软件环境
Keil5 MDK:stm32单片机源代码程序编写及下载代码
ST-Link 驱动程序:用于下载程序到 STM32。
手机APP
五、所需硬件以及传感器模块
5.1 stm32f103c8t6最小系统板(1个)
STM32F103C8T6最小系统板是基于STM32F103C8T6微控制器(MCU)构建的一个基础电路系统,它能够确保MCU正常工作并发挥其基本功能。
STM32F103C8T6微控制器是该最小系统板的核心组件,它是一款基于ARM Cortex-M3内核的高性能、低功耗的32位单片机。这款MCU具有丰富的外设接口,如USART、I2C、SPI、ADC等,能够满足各种应用需求。
需要为其配置一系列外围电路,这些电路共同构成了STM32F103C8T6最小系统板。以下是外围电路的主要组成部分:
-
电源电路:
- 通常,STM32F103C8T6微控制器的工作电压在1.8V至3.6V之间。因此,需要使用稳压器(如AMS1117)将外部输入的5V电压转换为3.3V,以供给MCU使用。
- 为了稳定电压并滤除噪声,电源电路中还会配置多个去耦电容。
-
时钟电路:
- 时钟电路是MCU的“心跳”,为MCU提供系统时钟信号。STM32F103C8T6支持外部晶振和内部RC振荡器两种时钟源。
- 在实际应用中,通常会使用外部晶振(如8MHz晶体谐振器)作为主时钟源,并配置两个负载电容器。
-
复位电路:
- 复位电路用于将MCU恢复到起始状态,以便重新开始执行程序。STM32F103C8T6支持系统复位、电源复位和备份区域复位等多种复位方式。
- 在最小系统板中,通常会使用电阻和电容组合来实现上电自动复位以及手动按钮触发复位的功能。
-
下载调试电路:
- 为了方便程序的下载和调试,STM32F103C8T6最小系统板会配置SWD/SWDIO两线串行调试端口。这个端口允许连接编程工具(如ST-Link)进行固件下载和在线调试操作。
5.2 蓝牙通讯模块HC06(1个)
- HC-06模块设计简洁,引脚定义清晰,方便与各种单片机和嵌入式系统集成。
- 模块通过4个2.54mm间距的排针与外部连接,包括GND(接地)、VCC(电源,3.3V~5.0V)、RXD(模块串口接收脚,TTL电平)、TXD(模块串口发送脚,TTL电平)四个引脚。
- 此外,HC-06模块还自带了一个状态指示灯,可以方便地判断模块的当前状态。指示灯有两种状态:均匀慢速闪烁表示蓝牙等待配对,常亮表示蓝牙已建立连接。
-
5.3 MAX30102心率血氧模块(1个)
MAX30102是Maxim Integrated公司开发的一款高灵敏度光学脉搏血氧传感器,能够采集心率和血氧饱和度(SpO2)数据。MAX30102通过光电容积脉搏波描记法(PPG)来测量心率和血氧饱和度。传感器内部的红光LED和红外光LED向皮肤发射光线,血液中的血红蛋白会吸收部分光线,剩余的光线被反射回传感器并被光电二极管接收并转换成电信号。传感器内部的模拟前端(AFE)对电信号进行放大和滤波,得到脉搏波信号。最后,通过I2C接口将处理后的数据传输给主控芯片进行进一步分析和处理。
要将MAX30102模块与STM32连接,需要按照以下步骤进行:
- 将SCL(I2C时钟线)连接到微控制器的SCL引脚。
- 将SDA(I2C数据线)连接到微控制器的SDA引脚。
- 将VDD(电源引脚)接3.3V(MAX30102工作电压为1.8V~3.3V,不支持5V)。
- 将GND接地。
- 将中断引脚(INT)连接到微控制器的一个GPIO引脚,用于通知数据准备好。
5.4 ADXL345采集当前行走步数(1个)
ADXL345是ADI公司推出的一款高性能、低功耗的三轴加速度传感器。以下是对ADXL345的详细介绍:
- 高分辨率:ADXL345具有最高13位的分辨率,能够精确测量加速度的微小变化。在±16g的测量范围内,分辨率可高达4mg/LSB(最小刻度),可以检测到非常小的加速度变化。
- 可变测量范围:ADXL345拥有±2g、±4g、±8g、±16g四种可变的测量范围,可以根据不同的应用需求进行选择。
- 数字接口:支持标准的I2C和SPI数字接口,方便与各种微控制器或处理器进行通信。I2C接口使用较少的引脚,适合对引脚数量有限制的系统;SPI接口则具有更高的通信速度,适用于对数据传输速率要求较高的应用。
- 自带FIFO存储:自带32级FIFO(先进先出)存储,可以缓存传感器采集到的数据,减少主机处理器的干预,提高数据处理的效率。
- 低功耗:在VS=2.5V(典型值)时,测量模式下低至23μA,待机模式下更是低至0.1μA。并且功耗会根据带宽自动扩展,支持基于运动的智能电源管理,可有效降低系统的功耗。
- 状态检测和中断方式:内部有多种状态检测和灵活的中断方式,如活动和不活动感应、轻敲感应、自由落体感应等,这些功能可以映射到两个中断输出引脚之一,方便系统及时响应传感器的状态变化。
5.5 DS18B20温度传感器(1个)
DS18B20是一款常用的数字温度传感器
一、基本特性
- 输出信号:数字信号。
- 特点:体积小、硬件开销低、抗干扰能力强、精度高。
- 工作电压:3V~5.5V。
- 测温范围:-55℃+125℃(-67°F+257°F)。
- 测量精度:在-10℃~+70℃范围内的测试精度可以达到±0.5℃。
- 分辨率:可配置为9到12位,默认情况下为12位。分辨率越高,测量的精度越高,但转换时间也越长。温度转换为12位数字格式时,最大值为750毫秒。
六、原理图及设计流程图
七、实物图
八、程序代码
int main(void)
{
unsigned char i;
DelayInit();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
I2C_Configuration(); //IIC初始化
OLED_Init(); //OLED初始化
KEY_Init(); //按键初始化
DelayMs(200);
CheckNewMcu();
OLED_CLS();//清屏
DS18B20_Init();
DS1302_Init(&SysDate);
DelayMs(100);
for(i=0;i<8;i++)OLED_ShowCN(i*16,2,i+8,0);//测试显示中文:欢迎使用使能手环
DelayMs(1000);
OLED_CLS();//清屏
DS1302_DateRead(&SysDate);//读时间
OLED_CLS();//清屏
for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+16,1);//测试显示中文:心率
for(i=0;i<2;i++)OLED_ShowCN(i*16+48,4,i+18,1);//测试显示中文:血氧
for(i=0;i<2;i++)OLED_ShowCN(i*16+95,4,i+20,1);//测试显示中文:步数
OLED_ShowCentigrade(112, 2); //℃
IIC_init();//IIC初始化
uart1_Init(9600);
adxl345_init();//ADXL345初始化
Init_MAX30102();//MAX30102初始化
TIM2_Init(99,719); //定时器初始化,定时1ms
//Tout = ((arr+1)*(psc+1))/Tclk ;
//Tclk:定时器输入频率(单位MHZ)
//Tout:定时器溢出时间(单位us)
while(1)
{
shanshuo=!shanshuo;
KeySettings();
DisplayTime();
if(setn == 0)//不在设置状态下,读取相关数据
{
DisplayTemperature();
GetSteps();
GetHeartRateSpO2();
if(fallTime==0)
{
if(displayfall==0)
{
displayfall=1;
OLED_CLS();//清屏
for(i=0;i<3;i++)OLED_ShowCN(i*16+48,2,i+64,0);//测试显示中文:跌倒
UsartSendReceiveData();
DelayMs(1000);DelayMs(1000);
OLED_CLS();//清屏
for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+16,1);//测试显示中文:心率
for(i=0;i<2;i++)OLED_ShowCN(i*16+48,4,i+18,1);//测试显示中文:血氧
for(i=0;i<2;i++)OLED_ShowCN(i*16+95,4,i+20,1);//测试显示中文:步数
OLED_ShowCentigrade(112, 2); //℃
}
}
}
UsartSendReceiveData();
DelayMs(10);
}
}
void TIM2_IRQHandler(void)//定时器2中断服务程序,用于记录时间
{
static u16 timeCount1 = 0;
static u16 timeCount3 = 0;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志位
timeCount1 ++;
if(timeCount1 >= 800)
{
timeCount1 = 0;
sendFlag = 1;
if(tiltFlag)
{
if(fallTime>0)fallTime--; //跌倒时间倒计时
}
}
timeCount3 ++;
if(timeCount3 >= 100)
{
timeCount3=0;
if(fallTime==0){ //跌倒蜂鸣器报警
BEEP=1;
}
else
{
if(((hrAvg!=0)&&(hrAvg>=xinlvMax||hrAvg<=xinlvMin))||((spo2Avg!=0)&&(spo2Avg<=spo2Min))||(temperature>=tempMax||temperature<=tempMin))//不在范围蜂鸣器报警
{
BEEP=~BEEP;
beepFlag|=0x01;
}else
{
beepFlag&=0xFE;
BEEP=0;
}
}
}
}
}
九、资料内容清单
源代码原理图等相关资料
百度网盘资料下载链接
更过相关设计资料或者毕设计定制请加下面联系方式
标签:血氧,心率,引脚,原理图,蓝牙,单片机,模块,STM32F103C8T6,监测 From: https://blog.csdn.net/weixin_41024363/article/details/145174165