编号:16
基于STM32单片机的人体健康体测仪
功能描述:
本设计由STM32单片机+DS18B20温度传感器+称重传感器(电位器通过A/D转换模拟)+HC_SR04超声波模块+键盘模拟+OLED显示模块组成。
1、主控制器是STM32单片机
2、通过HC_SR04超声波模块测量身高,有DS18B20温度传感器进行温度补偿,使精度更大;
3、10K电位器通过STM32内部A/D转换器进行A/D转换,用来模拟称重传感器实现称重,量程0-200kg;
4、OLED显示身高、体重;通过公式计算出BMI,得出体重指数辨别是否肥胖;
5、三个按键进行相关信息设置,可设置被测人性别、年龄。通过以上数据计算体脂率进行显示。
注意:proteus8.11版本才能打开
视频演示链接:
https://www.bilibili.com/video/BV1f14y1G7ZJ/?spm_id_from=333.999.0.0
仿真图:
信息设定界面
程序源码:
/***********************************************
***********************************************/
#include "delay.h"
#include "key.h"
#include "timer.h"
#include "ds18b20.h"
#include "HCSR04.h"
#include "adc.h"
#include "OLED_I2C.h"
#include "stdio.h"
#include "stdlib.h"
extern unsigned char Age ; //年龄
extern unsigned char Gender; //0 :女 1:男
short temprature; //定义温度变量
extern unsigned int Weight; //体重
float Height = 0; //身高
float BMI = 0; //bmi指数的计算公式为体重(KG)除以身高(M)的平方
float Fat = 0; //体脂率
void Dis_Init(void)
{
OLED_ShowStr(0,0,"BMI",2);
OLED_ShowCN(16*5,0,30); //体脂率
OLED_ShowCN(16*6,0,31);
OLED_ShowCN(16*7,0,32);
OLED_ShowCN(0,2,0); //身高
OLED_ShowCN(16,2,1);
OLED_ShowCN(0,4,2); //体重
OLED_ShowCN(16,4,3);
OLED_ShowCN(16*0,6,16); //体重指数
OLED_ShowCN(16*1,6,17);
OLED_ShowStr(16*2,6,":",2);
}
int main(void)
{
unsigned int distance = 0; //距离
unsigned char buf[16];
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
OLED_Init(); //OLED初始化操作
OLED_CLS(); //OLED清除屏幕
Dis_Init();
DS18B20_Init();
while(DS18B20_Init()!=0) //ds18b20初始化检测
{
OLED_ShowStr(0,0,(u8 *)" DS18B20 Error! ",2);
delay_ms(800);
OLED_ShowStr(0,0,(u8 *)" ",2);
delay_ms(800);
}
TIM3_Int_Init(499,7199); //10Khz的计数频率,计数到500为50ms
KEY_Init(); //初始化端口
Adc_Init();
HCSR04_Init(); //超声波模块相关初始化
while(1) //等待温度传感器稳定
{
temprature = DS18B20_Get_Temp(); //读取温度
delay_ms(100);
if(temprature!=850)
break;
}
while(1)
{
if(flag_timer==1) //200毫秒赋一次值 flag_timer是标志位
{
flag_timer = 0; //清除标志 等待下一次600ms
temprature = DS18B20_Get_Temp(); //读取温度
Get_Weight();
sprintf((char *)buf,(const char *)":%5.1fkg",(float)Weight/1000);
OLED_ShowStr(16*2,4,buf,2);
if(HCSR04_Count(&distance)==0) //测距 将距离值传递给distance
{
sprintf((char *)buf,(const char *)":%3dcm",distance);
}
else
{
sprintf((char *)buf,(const char *)":---cm");
}
OLED_ShowStr(16*2,2,buf,2);
Height = (float)distance/100;
BMI = Weight/1000/(Height*Height);
sprintf((char *)buf,(const char *)":%4.1f",BMI);
OLED_ShowStr(16*1+8,0,buf,2); //显示BMI
Fat = 1.2*BMI + 0.23 * Age -5.4-10.8* Gender;
sprintf((char *)buf,(const char *)"%4.1f%%",Fat);
if(Fat<50)
OLED_ShowStr(16*5+8,2,buf,2); //显示体脂率
/*
1、正常:18-24;
2、超重:24-27.5;
3、肥胖:超过27.5;
4、轻度肥胖:27.5-32.5;
5、中度肥胖:32.5-37.5;
6、重度肥胖:37.5以上;
7、极重度肥胖:超过50。
*/
if(BMI<18) //过轻
{
OLED_ShowCN(16*2+8,6,34);
OLED_ShowCN(16*3+8,6,35);
}
if(BMI>=18&&BMI<24) //正常
{
OLED_ShowCN(16*2+8,6,4);
OLED_ShowCN(16*3+8,6,5);
}
if(BMI>=24&&BMI<27.5) //超重
{
OLED_ShowCN(16*2+8,6,6);
OLED_ShowCN(16*3+8,6,7);
}
if(BMI>=27.5&&BMI<32.5) //轻度肥胖
{
OLED_ShowCN(16*2+8,6,10);
OLED_ShowCN(16*3+8,6,33);
OLED_ShowCN(16*4+8,6,8);
OLED_ShowCN(16*5+8,6,9);
}
if(BMI>=32.5&&BMI<37.5) //中度肥胖
{
OLED_ShowCN(16*2+8,6,11);
OLED_ShowCN(16*3+8,6,33);
OLED_ShowCN(16*4+8,6,8);
OLED_ShowCN(16*5+8,6,9);
}
if(BMI>=37.5&&BMI<50) //重度肥胖
{
OLED_ShowCN(16*2+8,6,12);
OLED_ShowCN(16*3+8,6,33);
OLED_ShowCN(16*4+8,6,8);
OLED_ShowCN(16*5+8,6,9);
}
if(BMI>=50) //极度肥胖
{
OLED_ShowCN(16*2+8,6,13);
OLED_ShowCN(16*3+8,6,33);
OLED_ShowCN(16*4+8,6,8);
OLED_ShowCN(16*5+8,6,9);
}
}
KEY_Set();
}
}
软件免费下载地址:
1、Proteus仿真软件
文件内容:Proteus7.8安装包、Proteus8.6安装包、Proteus.8.10安装包、Proteus Professional 8.11 SP0安装包
链接:https://pan.baidu.com/s/11LNUZ9BJXWvXf1C4dPc3_w
提取码:2756
3、KEIL5 MDK软件(STM32开发软件)
链接:https://pan.baidu.com/s/1t3eY-3yRdTa7jZMlijq_jg
提取码:ab58