STM32项目分享:基于物联网的健康监测系统设计
“我们不做一锤子买卖,只做技术成长的长期伙伴!”
目录
一、视频展示
二、项目简介
三、原理图设计
四、PCB硬件设计
五、程序设计
六、资料分享
一、视频展示
基于物联网的健康监测系统设计 -视频分享
二、项目简介
题目:基于物联网的健康监测系统设计
主控:STM32
显示:OLED显示屏
jfc103生理指标传感器
ds18b20温度传感器
通信:esp8266上云
DC供电
功能:
1、屏幕实时显示当前体温,心率血氧,血压。
2、数据通过wifi上传到阿里云。
3、数据通过阿里云实时传输到手机查看数据。
三、原理图设计
四、PCB硬件设计
五、程序设计
#include "stm32f10x.h" // Device header
#include "delay.h"
#include "lcd.h"
#include "timer.h"
#include "IOput.h"
#include "usart.h"
#include "ds18b20.h"
/*该设计由STM32F103C8T6作为主控芯片,供电系统,0.96的OLED显示屏,DS18B20温度传感器和JFC103心率血氧血压模块,以及三个独立按键和蜂鸣器组成。
本设计的功能:1、 上电屏幕打开默认进入数据主页。该页面会显示当前测得数据包括心率血氧,舒张压收缩压,体温。2、此时摁下按键一时会进入阈值设置界面。共有五个阈值设置,都是通过摁下一键按顺序显示,方便调节阈值,其中分别为心率上下两个阈值设置(设置其上下限,测得心率超过阈值数值,蜂鸣器就会报警),血氧阈值设置(设置下限,和心率阈值报警逻辑一致),舒张压上下两个阈值设置,收缩压上下两个阈值设置,和体温阈值上限设置。
*/
u8 datatemp[SIZE];
u8 zl,show1_flag,count;
short zj;
u8 show_flag;
//以下是默认阈值,若修改此数值,则开机后对应的默认阈值也会改变
u8 max_wd=37;
u8 MaxDiastolicPressure = 139; //收缩压上限139
u8 MinDiastolicPressure = 100; //收缩压下限100
u8 MaxSystolicPressure = 89; //舒张压上限89
u8 MinSystolicPressure = 60; //舒张压下限60
u8 MaxBloodOxygen = 95;//血氧默认阈值
u8 MaxHeartRate = 100;//最大心率
u8 MinHeartRate = 60;//最小心率
u8 HeartRate,SystolicPressure,BloodOxygen,DiastolicPressure;int main (void)
{delay_init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);OLED_Init();//屏幕初始化delay_ms(1);OLED_Clear();input_init();output_init();USART3_Init(38400);//jfc103串口初始化Usart_SendByte(USART3, 0x8a);Usart1_Init(9600);DS18B20_Init();show_flag == 0;while(1){count++;key_scan(1,0,0);//开启按键扫描程序if(set_flag == 1 && show_flag == 0){set_flag = 0;show_flag ++;if(show_flag >= 3)show_flag = 0;}if(show_flag == 0){show1_flag=0;temp_get();//温度获取入口OLED_ShowCH(0,0," 健康监测系统 ");OLED_ShowCH(0,2,"心率:");OLED_ShowCH(0,4,"血氧:");OLED_ShowCH(0,6,"体温:");OLED_ShowCH(64,2,"收压:");OLED_ShowCH(64,4,"舒压:");OLED_ShowNum(40,6,wd,2,16);//温度数值if(senor_Flag)//判断当手指按压在jfc103模块上将开始传输数据并显示出来{senor_Flag=0;if(USART_RX_BUF2[65] == 0)OLED_ShowCH(40,2,"---");elseOLED_ShowNum(40,2,USART_RX_BUF2[65],3,16);//心率if(USART_RX_BUF2[66] == 0)OLED_ShowCH(40,4,"---");elseOLED_ShowNum(40,4,USART_RX_BUF2[66],3,16);//血氧if(USART_RX_BUF2[71] == 0)OLED_ShowCH(104,2,"---");elseOLED_ShowNum(104,4,USART_RX_BUF2[72],3,16);//舒张压if(USART_RX_BUF2[72] == 0)OLED_ShowCH(104,4, "---");elseOLED_ShowNum(104,2,USART_RX_BUF2[71],3,16);//收缩压HeartRate=USART_RX_BUF2[65];SystolicPressure=USART_RX_BUF2[72];BloodOxygen=USART_RX_BUF2[66];DiastolicPressure=USART_RX_BUF2[71];}}if(show_flag==1)//阈值修改界面,此界面包含四个阈值{OLED_ShowCH(0,0,"心率上限:");OLED_ShowCH(0,2,"心率下限:");OLED_ShowCH(0,4,"舒压上限:");OLED_ShowCH(0,6,"舒压下限:");OLED_ShowNum(72,0,MaxHeartRate,3,16);OLED_ShowNum(72,2,MinHeartRate,3,16);OLED_ShowNum(72,4,MaxSystolicPressure,3,16);OLED_ShowNum(72,6,MinSystolicPressure,3,16);if(set_flag==1&&show_flag==1)//在此界面判断按键按下程序,并与第一个界面放冲突{set_flag=0;show1_flag++;if(show1_flag>=4){show1_flag=0;show_flag=2; OLED_Clear();}}if(show1_flag==0){OLED_ShowCH(112,0,"←");if(add_flag==1){add_flag=0;MaxHeartRate++;}if(dec_flag==1){dec_flag=0;MaxHeartRate--;}if(MaxHeartRate<=MinHeartRate){MaxHeartRate=MinHeartRate+1;}//防呆设置,避免心率上限阈值的数值比心率下限阈值的数值还要小,以下类似的均是此设置}if(show1_flag==1){OLED_ShowCH(112,2,"←");if(add_flag==1){add_flag=0;MinHeartRate++;}if(dec_flag==1){dec_flag=0;MinHeartRate--;}if(MinHeartRate>=MaxHeartRate){MinHeartRate=MaxHeartRate-1;}}if(show1_flag==2){OLED_ShowCH(112,4,"←");if(add_flag==1){add_flag=0;MaxSystolicPressure++;}if(dec_flag==1){dec_flag=0;MaxSystolicPressure--;}if(MaxSystolicPressure<=MinSystolicPressure){MaxSystolicPressure=MinSystolicPressure+1;}}if(show1_flag==3){OLED_ShowCH(112,6,"←");if(add_flag==1){add_flag=0;MinSystolicPressure++;}if(dec_flag==1){dec_flag=0;MinSystolicPressure--;}if(MinSystolicPressure>=MaxSystolicPressure){MinSystolicPressure=MaxSystolicPressure-1;}}}if(show_flag==2)//第二个阈值修改界面,包含四个阈值项{OLED_ShowCH(0,0,"血氧下限:");OLED_ShowCH(0,2,"温度上限:");OLED_ShowCH(0,4,"收压上限:");OLED_ShowCH(0,6,"收压下限:");OLED_ShowNum(72,0,MaxBloodOxygen,3,16);OLED_ShowNum(72,2,max_wd,3,16);OLED_ShowNum(72,4,MaxDiastolicPressure,3,16);OLED_ShowNum(72,6,MinDiastolicPressure,3,16);if(set_flag==1&&show_flag==2){set_flag=0;show1_flag++;if(show1_flag>=4){show_flag=0;OLED_Clear();}}if(show1_flag==0){OLED_ShowCH(112,0,"←");if(add_flag==1){add_flag=0;MaxBloodOxygen++;}if(dec_flag==1){dec_flag=0;MaxBloodOxygen--;}if(MaxBloodOxygen>=100 || MaxBloodOxygen<=0){MaxBloodOxygen=0;}}if(show1_flag==1){OLED_ShowCH(112,2,"←");if(add_flag==1){add_flag=0;max_wd++;}if(dec_flag==1){dec_flag=0;max_wd--;}if(max_wd>=100 || max_wd<=0){max_wd=0;}}if(show1_flag==2){OLED_ShowCH(112,4,"←");if(add_flag==1){add_flag=0;MaxDiastolicPressure++;}if(dec_flag==1){dec_flag=0;MaxDiastolicPressure--;}if(MaxDiastolicPressure<=MinDiastolicPressure){MaxDiastolicPressure=MinDiastolicPressure+1;}}if(show1_flag==3){OLED_ShowCH(112,6,"←");if(add_flag==1){add_flag=0;MinDiastolicPressure++;}if(dec_flag==1){dec_flag=0;MinDiastolicPressure--;}if(MinDiastolicPressure>=MaxDiastolicPressure){MinDiastolicPressure=MaxDiastolicPressure-1;}}}
//以下是判断阈值是否在范围内的判断,如果在范围内则停止警报,如果不在范围内则触发警报。if((HeartRate>=MaxHeartRate&&HeartRate!=0) || (HeartRate<=MinHeartRate&&HeartRate!=0) || (MaxBloodOxygen>=BloodOxygen&&BloodOxygen!=0) || ((MaxDiastolicPressure<=DiastolicPressure || MinDiastolicPressure>=DiastolicPressure)&&DiastolicPressure!=0) || ((SystolicPressure>=MaxSystolicPressure || SystolicPressure<=MinSystolicPressure )&&SystolicPressure!=0) || wd>=max_wd)BEEP=0;elseBEEP=1;if(count>=30){count = 0;USART_SendData(USART1,'B');delay_ms(1);USART_SendData(USART1,'a');delay_ms(1);USART_SendData(USART1,HeartRate);delay_ms(1);USART_SendData(USART1,'b');delay_ms(1);USART_SendData(USART1,BloodOxygen);delay_ms(1);USART_SendData(USART1,'c');delay_ms(1);USART_SendData(USART1,SystolicPressure);delay_ms(1);USART_SendData(USART1,'d');delay_ms(1);USART_SendData(USART1,DiastolicPressure);delay_ms(1);USART_SendData(USART1,'e');delay_ms(1);USART_SendData(USART1,(u8)wd);delay_ms(1);USART_SendData(USART1,'E');delay_ms(1);}}
}
六、资料分享
点击即可查看当前资料分享。