1 基于STM32单片机的家庭医护血氧体温血压吃药监测APP系统
本设计以STM32F103C8T6单片机为核心控制器,结合血氧检测模块、DS18B20温度传感器、血压检测模块、OLED显示屏、蓝牙通信模块、按键输入电路及继电器控制电路,构建了一套家庭医护监测系统。该系统不仅能够实时监测血氧、体温和血压,还能通过手机APP接收数据,提供定时吃药提醒和自动执行的功能,从而提升家庭健康管理的智能化与自动化水平。
2 系统功能介绍
系统的功能主要体现在以下几个方面:
-
健康数据检测
系统通过血氧模块、DS18B20温度传感器和血压检测电路实时采集人体的血氧饱和度、体温和血压数据,并通过OLED液晶屏直观显示。
-
蓝牙数据传输
通过蓝牙模块将采集到的血氧、体温和血压数据发送到手机APP,用户可以在APP中实时查看健康数据并进行记录。
-
体温报警阈值设置
用户可以通过按键设置体温报警阈值。当检测到的体温超过设定阈值时,系统会触发报警提示,帮助用户及时发现异常。
-
定时吃药功能
系统支持倒计时功能,用户可通过按键设置倒计时时间。例如设置10分钟后提醒吃药,倒计时结束后系统自动驱动继电器输出,实现智能提醒或直接触发相关执行装置。
-
交互与操作
通过多按键设计,用户能够实现体温阈值调整、定时设置、倒计时开始与取消等操作。OLED屏幕和手机APP共同提供运行界面和状态反馈。
3 系统电路设计
3.1 STM32F103C8T6最小系统电路
STM32F103C8T6作为控制核心,承担信号采集、逻辑处理、通信和输出控制任务。最小系统电路包括电源电路(3.3V稳压模块)、时钟电路(外部8MHz晶振及内部PLL倍频)、复位电路和调试下载接口(SWD)。其强大的运算能力和丰富的外设接口保证了系统的稳定运行。
3.2 血氧检测模块电路
血氧检测模块一般采用光电传感原理,通过红光和红外光透射手指,测量血液中的血氧饱和度(SpO₂)。模块输出数据通过I²C总线传输至STM32,由单片机计算和显示血氧值。该模块在硬件设计上对电源噪声要求较高,因此需增加滤波电容。
3.3 DS18B20温度检测电路
体温检测采用DS18B20数字温度传感器,具有单总线接口,使用简单且精度较高。传感器直接输出数字信号,避免了模拟采样中的误差。STM32通过单总线协议读取温度数据,并与用户设置的阈值进行比较,当超过阈值时触发报警。
3.4 血压检测模块电路
血压检测一般采用集成血压测量芯片或模拟传感器配合运算放大器进行信号调理。模块采集血压信号并通过ADC接口传输给STM32,单片机对数据进行滤波和处理后显示到OLED上。
3.5 OLED显示电路
OLED显示屏采用I²C接口,与STM32连接简单,功耗低且显示效果清晰。其任务是实时显示血氧、体温、血压数值以及倒计时剩余时间等信息,使用户能够直观掌握系统状态。
3.6 蓝牙通信模块电路
蓝牙模块采用常见的HC-05/HC-06,使用UART串口与STM32通信。模块将采集到的健康数据传输到手机APP端,支持实时显示和数据记录。
3.7 按键电路
按键电路由多个独立按键组成,用于:
- set_key:进入倒计时设置模式或修改体温阈值模式。
- key_up:数值增加(如增加体温阈值或增加倒计时时间)。
- key_down :数值减少(如减少体温阈值或减少倒计时时间)。
按键采用上拉电阻配置,低电平触发,并在程序中进行消抖处理。
3.8 继电器控制电路
继电器电路用于定时吃药提醒的执行。倒计时结束后,STM32输出控制信号驱动继电器闭合,可连接蜂鸣器、灯光或其他执行装置,实现提醒或动作输出。继电器电路需要配合二极管进行反向电动势保护。
4 程序设计
4.1 主程序框架
主程序包括系统初始化、传感器数据采集、显示更新、蓝牙通信、按键检测和继电器控制。逻辑框架如下:
- 初始化系统时钟、OLED、蓝牙模块、DS18B20和血氧模块。
- 默认设置体温报警阈值。
- 主循环中,定时采集血氧、体温和血压数据,更新OLED显示和蓝牙传输。
- 检测按键状态,修改参数或启动倒计时。
- 倒计时结束后输出继电器控制信号。
c
#include "stm32f10x.h"
#include "oled.h"
#include "ds18b20.h"
#include "spo2.h"
#include "bp.h"
#include "bluetooth.h"
#include "key.h"
#include "relay.h"
float temp_threshold = 37.5; // 初始体温报警阈值
uint16_t countdown_time = 0; // 倒计时时间,单位:分钟
uint8_t countdown_flag = 0;
int main(void) {
SystemInit();
OLED_Init();
DS18B20_Init();
SPO2_Init();
BP_Init();
BT_Init();
Key_Init();
Relay_Init();
while (1) {
float temp = DS18B20_ReadTemp();
int spo2 = SPO2_Read();
int bp = BP_Read();
OLED_ShowData(temp, spo2, bp, countdown_time);
BT_SendData(temp, spo2, bp);
if (temp > temp_threshold) {
OLED_ShowString(2, 0, "Temp Alarm!");
}
Key_Process(&temp_threshold, &countdown_time, &countdown_flag);
if (countdown_flag) {
if (countdown_time == 0) {
Relay_On();
OLED_ShowString(3, 0, "Take Medicine!");
}
}
}
}
4.2 DS18B20温度检测程序
负责读取体温并与阈值比较,超限时触发报警。
c
float DS18B20_ReadTemp(void) {
// 单总线协议读温度
int temp = DS18B20_GetData();
return (float)temp / 16.0;
}
4.3 血氧检测模块程序
通过I²C通信获取血氧数据并返回。
c
int SPO2_Read(void) {
int spo2 = I2C_ReadData(SPO2_ADDR);
return spo2;
}
4.4 血压检测模块程序
血压数据通过ADC接口采样,并经简单滤波处理后返回。
c
int BP_Read(void) {
uint16_t adc_val = ADC_GetConversionValue(ADC1);
int bp = adc_val * 0.1; // 假设换算比例
return bp;
}
4.5 蓝牙模块程序
蓝牙通过串口发送数据至APP。
c
void BT_SendData(float temp, int spo2, int bp) {
char buf[50];
sprintf(buf, "T:%.1f S:%d BP:%d\r\n", temp, spo2, bp);
USART_SendString(USART1, buf);
}
4.6 按键控制程序
实现阈值与倒计时时间的修改,并支持倒计时启动。
c
void Key_Process(float *threshold, uint16_t *cd_time, uint8_t *flag) {
if (Key_Scan(SET_KEY)) {
*flag = !(*flag);
}
if (Key_Scan(KEY_UP)) {
if (*flag) (*cd_time) += 1; // 倒计时加1分钟
else *threshold += 0.1; // 阈值加0.1℃
}
if (Key_Scan(KEY_DOWN)) {
if (*flag && *cd_time > 0) (*cd_time) -= 1;
else if (!*flag) *threshold -= 0.1;
}
}
4.7 继电器控制程序
倒计时结束后执行。
c
void Relay_On(void) {
GPIO_SetBits(GPIOB, GPIO_Pin_5);
}
5 总结
本设计以STM32单片机为核心,结合血氧、体温和血压检测模块,完成了家庭健康数据的实时采集与显示,并通过蓝牙模块实现数据上传至手机APP。系统不仅具备体温报警阈值设置和报警功能,还设计了定时吃药的智能提醒,能够有效提升家庭健康管理的便利性与智能化水平。
从电路设计到程序实现,本项目涵盖了传感器数据采集、OLED显示、蓝牙通信、按键交互和继电器控制等多方面技术,具有较强的实践价值与推广意义。