一.硬件及设计功能
以STM32F103C8T6为中央处理器,GPS模块用采集数据,将数据发送给单片机后,单片机根据定位计算公式得出当前位置的经纬度信息和时间信息。经过LCD显示器处理后得出和时间信息SIM800模块发送短信到设定的手机号上,将检测到的经纬度和心率血氧体温等信息展示在短信上。
原理图如下:
PCB图如下:
二.设计功能
1.电路供电部分:整个电路基本工作电压为5V;通过SIM800模块,将单片机和手机进行短信通信,手机上可以显示采集到的时间和经纬度信息。
2.STM32单片机作为CPU,进行数据的采样以及分析运算。最后通OLED液晶显示屏显示当前的数据信息。
3.通过GPS接收模块,采集到相应的检测到的卫星信号后,可以计算出卫星轨道参数等数据,最后接收机中的微处理器就可以按照定位解算算法进行定位解算,得出机器所在位置的经度、纬度信息。
4.通过ADXL345判断老人是否跌倒,MAX30102心率血氧传感器采集老人当前的心率和血氧值,通过DS18B20进行温度采集。通过这些传感器模块来判断老人当前生理状况。
5.通过GPS模块获取当前的GPS定位,并通过设备上的OLED显示屏可以得到当前测试地的经纬度及时间的信息。
三.程序
int main(void)
{
char i, error_num = 0;
extern const unsigned char BMP1[];
u8 shanshuo=0,count;
u8 count2=0,count3=0;
DelayInit();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
I2C_Configuration(); //IIC初始化
CheckNewMcu();//检测是否为新的单片机
OLED_Init(); //OLED初始化
KEY_Init(); //按键初始化
GPS_rx_flag = 0;
Usart1_Init(9600);
USART3_Init(9600);
DelayMs(200);
OLED_CLS();//清屏
DS18B20_Init();
OLED_DrawBMP(40,0,88,6,(unsigned char *)BMP1);//测试BMP位图显示
for(i=0;i<7;i++)OLED_ShowCN(i*16+12,6,i+10,0);//测试显示中文:正在初始化中!
gsm_init();//gsm初始化
IIC_init();//IIC初始化
adxl345_init();//ADXL345初始化
Init_MAX30102();//MAX30102初始化
memset(STM32_RX1_BUF, 0, STM32_RX1BUFF_SIZE);//清除缓存
STM32_Rx1Counter = 0;
GPS_rx_flag = 1;
while(1)
{
SMS_Receive();//短信接收
KeySettings();
ShowHomePage();
if(setn == 0)//不在设置状态下,读取相关数据
{
if (rev_stop == 1 && count3++>=5) //如果接收完一行
{
if (GPS_RMC_Parse(STM32_RX3_BUF, &GPS)) //解析GPRMC
{
DisplayLongitudeAndLatitude(); //显示经纬度信息
error_num = 0;
gps_flag = 0;
rev_stop = 0;
GpsInitOkFlag=1;
}
else
{
if (error_num++ >= 30) //如果数据无效超过30次
{
error_num = 30;
if(GpsInitOkFlag==1)
{
GpsInitOkFlag = 0;
OLED_ShowStr(40, 4, " ", 2);
OLED_ShowStr(40, 6, " ", 2);
}
}
gps_flag = 0;
rev_stop = 0;
}
count3=0;
}
if(GpsInitOkFlag==0&&count++>=5)//无GPS信号,显示搜索信号
{
count = 0;
shanshuo = !shanshuo;
if(shanshuo==1){for(i=0;i<4;i++)OLED_ShowCN(i*16+48,4,i+17,0);OLED_ShowStr(40, 6, " ... ", 2);}
else { OLED_ShowStr(40, 4, " ", 2);OLED_ShowStr(40, 6, " ", 2);}
}
DisplayTemperature(); //显示温度
FallDetection(); //跌倒检测
GetHeartRateSpO2(); //获取心率血氧
DisplayHeartRateSPO2(); //显示心率血氧
}
AlarmAndSendSMS(); //蜂鸣器报警及其发送短信
if(count2++>2)
{
Twinkle=!Twinkle;
if(FallFlag==1)
{
if(FallTime>0)FallTime--; //当时间减到0,说明跌倒时间持续了5秒(这里只是大概5秒)
}
count2 = 0;
}
}
}