基于 STM32 和 NB-IoT 的可穿戴式老人防摔监测系统

这是我本科毕设搞得一个小任务,现在稍微整理了其中一点内容,下面有相应的程序代码。
程序参考:
采用STM32作为主控,通过串口与ME3616通信,控制ME3616对接OneNET,将采集到的温度数据上报OneNET。
代码在GitHub:
https://github.com/sanjaywu/OneNET_ME3616_DEMO

系统总体设计

基于 STM32 和 NB-IoT 的可穿戴式老人防摔监测系统主要通过软件和硬件的相互配合
来完成相应的功能,各个功能模块通过主控 STM32F103 提供的定时器和中断以及串口等
功能相互配合使系统能够快速有效地完成工作。最终可将采集心率、老人姿态、 GPS 位置、 人体温度等传感器的数据通过 NB-IoT 模组发送给 OneNET 物联网开发平台。
基于 STM32 和 NB-IoT 的可穿戴式老人防摔监测系统_第1张图片
主要功能:

  • ME3616模组数据传输;
  • 温湿度数据的获取;
  • MPU6050陀螺仪数据的获取;
  • mlx90614体温传感器数据的获取;
  • MAX30102心率传感器数据的获取;
  • oled显示;
  • sim900a短信功能;
  • GPS数据获取及处理;

系统程序包含的内容
基于 STM32 和 NB-IoT 的可穿戴式老人防摔监测系统_第2张图片

主程序:

#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "usart2.h"
#include "usart3.h"
#include "time3.h"
#include "time2.h"
#include "led.h"
#include "me3616.h"
#include "FreeRTOS.h"
#include "task.h"
#include "malloc.h"

#include "sht20_i2c.h"
#include "sht20.h"
#include "mpu6050.h"
#include "mlx90614.h"
#include "GPS.h"
#include "sim900a.h"
#include "i2c_max30102.h"
#include "MAX30102.h"
#include "algorithm.h"
#include "oled.h"
#include "i2c_oled.h"

/********************************************/

//extern float Pitch,Roll,Yaw;
extern unsigned char Men_heartRate[];
extern unsigned char Men_Temp[]; 
extern char g_sensor_value_HeartRate[5];
extern char g_sensor_value_temp[8];
extern u8 n_heart_rate_flag;
extern int32_t n_heart_rate; //心率
extern float  temp;

/*******************************************/

extern u8 n_heart_rate_flag;
uint8_t uch_dummy;
int key;
int Warn_flag=0;
int GPS_i = 0;
void hardware_init(void);
unsigned char i_OLED;//汉字在codetab.h中的索引
int main(void)
{	

	extern unsigned char Init_ing_Show[];
	extern unsigned char Init_fini_Show[];
	extern unsigned char nbiot_internet[];	
	
	
	hardware_init();
	printf("me3616 nbiot...\r\n");

	OLED_CLS();//清屏
	OLED_Fill(0x00);//全屏灭	
	for(i_OLED=0;i_OLED<4;i_OLED++)
	{
		OLED_ShowCN(20+i_OLED*16,3,Init_ing_Show,i_OLED);//初始化中
	}
	delay_ms(500);
#if 1
	me3616_power_on();
	delay_ms(1000);
	#ifdef ME3616_OPEN_SLEEP_MODE
	me3616_sleep_config(1);		/* 打开模组休眠模式 */
	#else
	me3616_sleep_config(0);		/* 关闭模组休眠模式 */
	#endif
	delay_ms(100);
	me3616_hardware_reset();
	//*******************GPS*****************************/
	#ifdef ME3616_OPEN_GPS   //打开GPS
	delay_ms(100);
	me3616_onenet_GPS_init();
	for(GPS_i=0;GPS_i<10;GPS_i++)
	{

		if(strstr((const char*)USART3_RX_BUF, "+ZGPS"))	/*查到 SUCCESS,说明模组GPS下载或查询 AGNSS 数据*/
		{
			me3616_at_response(1);
			delay_ms(200);
			me3616_onenet_GPS_AskDATA();
			if(strstr((const char*)USART3_RX_BUF, "READY")){
				printf("me3616 GPS init ok ...\r\n");
				delay_ms(200);
				me3616_onenet_GPS_Run(1);
				break;
			}
			else printf("me3616 GPS init error XXX  \r\n");

		}
		else me3616_onenet_GPS_DowmDATA();
	}
	#endif
	//****************************************************/
	OLED_CLS();//清屏	
	for(i_OLED=0;i_OLED<5;i_OLED++)
	{
		OLED_ShowCN(20+i_OLED*16,3,Init_fini_Show,i_OLED);//测试显示中文
	}
	delay_ms(1000);
	for(i_OLED=0;i_OLED<5;i_OLED++)
	{
		OLED_ShowCN(20+i_OLED*16,3,nbiot_internet,i_OLED);//测试显示中文
	}	
	me3616_connect_onenet_app();
	vTaskStartScheduler();


#else

//	extern const unsigned char BMP1[];
//	extern unsigned char Init_ing_Show[];
//	extern unsigned char Init_fini_Show[];
//	extern unsigned char Wait_heartRate_Test[];
//	extern unsigned char heartRate_Show[];
//	extern unsigned char System_Reset[];
//	extern unsigned char nbiot_internet[];
//	extern unsigned char nbiot_internet_ok[];
	extern unsigned char Men_heartRate[];
	extern unsigned char Men_Temp[];

//	unsigned char m[]= "98";
//	
//	OLED_CLS();//清屏	
//	for(i_OLED=0;i_OLED<5;i_OLED++)
//	{
//		OLED_ShowCN(20+i_OLED*16,3,Init_fini_Show,i_OLED);//测试显示中文
//	}
//	delay_ms(1000);
//	
//	OLED_CLS();//清屏	
//	for(i_OLED=0;i_OLED<5;i_OLED++)
//	{
//		OLED_ShowCN(20+i_OLED*16,3,nbiot_internet,i_OLED);//测试显示中文
//	}
//	delay_ms(1000);
//	OLED_CLS();//清屏
//	OLED_ShowStr(10,3,"NB-IOT IN NET",2);
//	delay_ms(3000);	
//	OLED_CLS();//清屏
//	for(i_OLED=0;i_OLED<6;i_OLED++)
//	{
//		OLED_ShowCN(20+i_OLED*16,3,nbiot_internet_ok,i_OLED);//测试显示中文
//	}
//	delay_ms(1000);
//	OLED_CLS();//清屏	
//	for(i_OLED=0;i_OLED<4;i_OLED++)
//	{
//		OLED_ShowCN(3+i_OLED*16,1,Men_heartRate,i_OLED);//测试显示中文
//		OLED_ShowCN(3+i_OLED*16,4,Men_Temp,i_OLED);//测试显示中文
//	}
//	OLED_ShowStr(3+4*16,1,"980",2);
//	OLED_ShowStr(3+4*16,4,"36.2",2);	
	TIM_Cmd(TIM4, ENABLE);  //使能TIMx外设
	while(1)
	{
	memset(g_sensor_value_HeartRate, 0, sizeof(g_sensor_value_HeartRate));//心率
	sprintf(g_sensor_value_HeartRate, "%d", n_heart_rate);
	g_sensor_value_HeartRate[4] = '\0';
	memset(g_sensor_value_temp, 0, sizeof(g_sensor_value_temp));//心率
	sprintf(g_sensor_value_temp, "%0.1f", temp);
	g_sensor_value_temp[4] = '\0';

	OLED_CLS();//清屏	
	for(i_OLED=0;i_OLED<4;i_OLED++)
	{
		OLED_ShowCN(3+i_OLED*16,1,Men_heartRate,i_OLED);//测试显示中文
		OLED_ShowCN(3+i_OLED*16,4,Men_Temp,i_OLED);//测试显示中文
	}
	OLED_ShowStr(3+4*16,1,(unsigned char *)g_sensor_value_HeartRate,2);
	OLED_ShowStr(3+4*16,4,(unsigned char *)g_sensor_value_temp,2);
		
	}			for(i_OLED=0;i_OLED<4;i_OLED++)
		{
			OLED_ShowCN(3+i_OLED*16,1,Men_heartRate,i_OLED);//测试显示中文
//			OLED_ShowCN(3+i_OLED*16,4,Men_Temp,i_OLED);//测试显示中文
		}
//		OLED_ShowStr(3+4*16,1,Men_Temp,2);
		OLED_ShowStr(3+4*16,4,Men_heartRate,2);
	delay_ms(3000);	
	}
#endif

}
/**************************************************************
函数名称 : hardware_init
函数功能 : 硬件初始化
输入参数 : 无
返回值  	 : 无
备注		 : 无
**************************************************************/
void hardware_init(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	delay_init();

	usart1_init(115200);
	usart3_init(115200);
	USART2_init(115200);
	TIM3_Int_Init(8999, 7199);
	me3616_power_init();
	led_init();	
	Beep_init();
	IIC_Init();
	MPU6050_initialize();     //=====MPU6050初始化	
	DMP_Init();
	IIC_MAX30_Init();
	maxim_max30102_reset();//复位 MAX30102
	maxim_max30102_read_reg(REG_INTR_STATUS_1,&uch_dummy);//read and clear status register
	maxim_max30102_init();//初始化MAX30102
	mlx90614_init();
	sht20_i2c_init();
	IIC_OLED_Init();
	OLED_Init();
	TIM4_Int_Init(9999,7199);
	TIM2_Int_Init(5999,719);
	while(!simCard_test())
		 delay_ms(150);
		
}

me3616.c的程序:

#define ME3616_WAKE_UP_HIGH	GPIO_SetBits(GPIOC, GPIO_Pin_7)
#define ME3616_WAKE_UP_LOW	GPIO_ResetBits(GPIOC, GPIO_Pin_7)

#define ME3616_MIPLNOTIFY_TIME	25

int g_opend_lifetime = 3600;
int g_addobj_objectid_3300 = 3300;
int g_addobj_objectid_3303 = 3303;
int g_addobj_objectid_3304 = 3304;
int g_addobj_objectid_3336 = 3336;
int g_observe_msgid;
int g_observe_flag;
int g_observe_objectid;
int g_observe_instanceid;
int g_observe_resourceid;
int g_discover_msgid;
int g_discover_objectid;

char *g_discover_valuestring_5700 = "\"5700\"";
char *g_discover_valuestring_1314 = "\"5513;5514\"";

int g_notify_resourceid_5700_sensor_value = 5700;
int g_notify_resourceid_5513_sensor_value = 5513;
int g_notify_resourceid_5514_sensor_value = 5514;


//**********************************************
int a = 0;
int b = 0;
int g_observe_msgid_T[10];
//int g_observe_objectid_T[5];

//char g_sensor_value_Pitch[5];
//char g_sensor_value_Roll[5];
//char g_sensor_value_Yaw[5];
char g_sensor_value_FS[5];
char g_sensor_value_Tem[5];
char g_sensor_value_Hul[5];
char g_sensor_value_Lat[15];
char g_sensor_value_Lon[15];

extern char g_sensor_value_temp[8];
extern char g_sensor_value_HeartRate[5];
//extern float Pitch,Roll,Yaw;
extern float  temp;

double GPS_Lat;
double GPS_Lon;
double Baidu_Lat = 36.067118; 
double Baidu_Lon = 114.343343;
//114.361774,36.076296
//114.355126,36.073007
//系楼:36.067118  114.343343
u8 mpu_flag = 0;
extern int key;
extern int Warn_flag;
extern u8 n_heart_rate_flag;
extern int32_t n_heart_rate;//单次获取
//extern int32_t V_heart_rate;//均值

extern unsigned char i_OLED;//汉字在codetab.h中的索引

extern unsigned char Init_ing_Show[];
extern unsigned char Init_fini_Show[];
extern unsigned char System_Reset[];

extern unsigned char nbiot_internet[];
extern unsigned char nbiot_internet_ok[];

u8 me3616_fini_flag = 0;
//*********************************************
u16 g_hardware_times = 0;
u8 g_me3616_miplnotify_flag = 0;
extern u8 mpu_flag;
extern _sht20_data_t sht20_data_t;

/* 任务句柄 */
TaskHandle_t g_me3616_process_back_result_task_handle = NULL;	

/**************************************************************
函数名称 : me3616_power_init
函数功能 : me3616电源初始化
输入参数 : 无
返回值  	 : 无
备注		 : 	GPIO_Pin_4:ME3616 POWER_ON引脚
				GPIO_Pin_5:ME3616 RESET引脚
				GPIO_Pin_7:ME3616 WAKE_UP引脚
**************************************************************/
void me3616_power_init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);/* 使能GPIOC时钟 */
 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	 /* 推挽输出 */
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOC, &GPIO_InitStructure);
	GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7);
}

/**************************************************************
函数名称 : me3616_power_on
函数功能 : me3616 开机
输入参数 : 无
返回值  	 : 无
备注		 : 无
**************************************************************/
void me3616_power_on(void)
{
	GPIO_SetBits(GPIOC, GPIO_Pin_4);	/* 拉高power引脚开机 */
	delay_ms(1000);		
	GPIO_ResetBits(GPIOC, GPIO_Pin_4);	/* 释放power引脚 */
}

/**************************************************************
函数名称 : me3616_hardware_reset
函数功能 : me3616硬件复位
输入参数 : 无
返回值  	 : 无
备注		 : 无
**************************************************************/
void me3616_hardware_reset(void)
{
	GPIO_SetBits(GPIOC, GPIO_Pin_5);	/* 拉高RESET引脚开始复位 */
	delay_ms(600);		
	GPIO_ResetBits(GPIOC, GPIO_Pin_5);	/* 释放RESET引脚 */
	GPIO_ResetBits(GPIOC, GPIO_Pin_12);
	delay_ms(100);
	GPIO_SetBits(GPIOC, GPIO_Pin_12);
	delay_ms(100);
	GPIO_ResetBits(GPIOC, GPIO_Pin_12);
	printf("me3616_hardware_reset_OK!\r\n");
	
}

/**************************************************************
函数名称 : me3616_wake_up
函数功能 : me3616 外部唤醒
输入参数 : 无
返回值  	 : 无
备注		 : 无
**************************************************************/
void me3616_wake_up(void)
{
	GPIO_SetBits(GPIOC, GPIO_Pin_7);	/* 拉高WAKE_UP引脚,唤醒模组 */
	delay_ms(100);
	GPIO_ResetBits(GPIOC, GPIO_Pin_7);
}

/**************************************************************
函数名称 : me3616_at_response
函数功能 : 将收到的AT指令应答数据返回给电脑串口
输入参数 : mode:0,不清零USART3_RX_STA;
			     1,清零USART3_RX_STA;
返回值  	 : 无
备注		 : 无
**************************************************************/
void me3616_at_response(u8 mode)
{
	if(USART3_RX_STA & 0X8000) /* 接收到一次数据了 */
	{ 
		USART3_RX_BUF[USART3_RX_STA&0X7FFF]	= 0;	/* 添加结束符 */
		printf("%s\r\n", USART3_RX_BUF);		/* 发送到串口 */
		if(mode)
		{
			USART3_RX_STA = 0;
		}
	} 
}

/**************************************************************
函数名称 : me3616_clear_recv
函数功能 : 清空接收缓冲区
输入参数 : 无
返回值  	 : 无
备注		 : 无
**************************************************************/
void me3616_clear_recv(void)
{
	u16 i = 0;
	
	for(i = 0; i < USART3_MAX_RECV_LEN; i++)
	{	
		USART3_RX_BUF[i] = 0;	
	}
	USART3_RX_STA = 0;
}

/**************************************************************
函数名称 : me3616_check_cmd
函数功能 : me3616 发送命令后,检测接收到的应答
输入参数 : str:期待的应答结果
返回值  	 : NULL:没有得到期待的应答结果
		   其他,期待应答结果的位置(str的位置)
备注		 : 无
**************************************************************/
char* me3616_check_cmd(char *str)
{
	char *strx = 0;
	if(USART3_RX_STA & 0X8000)					/* 接收到一次数据了 */
	{ 
		USART3_RX_BUF[USART3_RX_STA&0X7FFF] = 0;/* 添加结束符 */
		strx = strstr((const char*)USART3_RX_BUF, (const char*)str);
	} 
	return strx;
}

/**************************************************************
函数名称 : me3616_send_cmd
函数功能 : me3616 发送命令
输入参数 : cmd:发送的命令字符串
		   当cmd<0XFF的时候,发送数字(比如发送0X1A),
		   大于的时候发送字符串.
		   ack:期待的应答结果,如果为空,则表示不需要等待应答
		   waittime:等待时间(单位:10ms)
返回值  	 : 0:发送成功(得到了期待的应答结果)
		   1:发送失败
备注		 : 用此函数发送命令时,命令不需加\r\n
**************************************************************/
u8 me3616_send_cmd(char *cmd, char *ack, u16 waittime)
{	
	USART3_RX_STA = 0;
	if((u32)cmd <= 0XFF)
	{
		while(0 == (USART3->SR & 0X40));/* 等待上一次数据发送完成 */
		USART3->DR = (u32)cmd;
	}
	else
	{	
		usart3_printf("%s\r\n", cmd);//发送命令
	}
	if(ack && waittime)		/* 需要等待应答 */
	{
		while(--waittime)	/* 等待倒计时 */
		{
			if(USART3_RX_STA & 0X8000)/* 接收到期待的应答结果 */
			{
				if(me3616_check_cmd(ack))/* 得到有效数据 */
				{
					break;
				}
                USART3_RX_STA = 0;
			} 
			delay_ms(10);
		}
		if(0 == waittime)
		{
			return 1;
		}
	}
	return 0;
} 

/**************************************************************
函数名称 : me3616_sleep_config
函数功能 : 模组睡眠开关
输入参数 : mode:0,关闭睡眠模式;1:开启睡眠模式
返回值  	 : 0:成功
		   1:失败
备注		 : 配置完之后,需要重启模组才能生效
**************************************************************/
u8 me3616_sleep_config(u8 mode)
{
	u8 res;

	if(mode)
	{
		res = me3616_send_cmd("AT+ZSLR=1", "OK", 300);
		printf("AT+ZSLR=1\r\n");
	}
	else
	{
		res = me3616_send_cmd("AT+ZSLR=0", "OK", 300);
		printf("AT+ZSLR=0\r\n");
	}
	
	return res;
}

/**************************************************************
函数名称 : me3616_onenet_miplcreate
函数功能 : me3616 创建 OneNET instance
输入参数 : 无
返回值  	 : 0:成功
		   1:失败
备注		 : 
**************************************************************/
u8 me3616_onenet_miplcreate(void)
{
	u8 res;
	
	res = me3616_send_cmd("AT+MIPLCREATE", "OK", 300);	
	printf("%s\r\n", "AT+MIPLCREATE");

	return res;
}

/**************************************************************
函数名称 : me3616_onenet_mipladdobj
函数功能 : 创建一个 object(对象)
输入参数 : objectid:整型,object id
		   instancecount:整型,instance数量
		   instancebitmap:二进制字符串,instance bitmap
		   例: “00101” 
		   (5 instances, only instance 1 & 3 are available)
		   attributecount:整型,attribute count
		   (具有 Read/Write 操作的 object 有 attribute)
		   actioncount:整型,action count 
		   (具有 Execute 操作的 object 有 action)
返回值  	 : 0:成功
		   1:失败
备注		 : 无
**************************************************************/
u8 me3616_onenet_mipladdobj(int objectid, int instancecount, const char *instancebitmap,
										int attributecount, int actioncount)
{
	u8 res;
	char cmd_string[64];

	memset(cmd_string, 0, sizeof(cmd_string));

	sprintf(cmd_string, "AT+MIPLADDOBJ=0,%d,%d,%s,%d,%d", objectid, instancecount, instancebitmap, attributecount, actioncount);
	
	printf("%s\r\n", cmd_string);
	
	res = me3616_send_cmd(cmd_string, "OK", 300);

	return res;
}


/**************************************************************
函数名称 : me3616_onenet_miplopen
函数功能 : 设备注册到 OneNET 平台
输入参数 : lifetime:整型,注册到OneNET平台的生存时间,单位:S
返回值  	 : 0:成功
		   1:失败
备注		 : 无
**************************************************************/
u8 me3616_onenet_miplopen(int lifetime)
{
	u8 res;
	char cmd_string[64];

	memset(cmd_string, 0, sizeof(cmd_string));
	sprintf(cmd_string, "AT+MIPLOPEN=0,%d", lifetime);
	
	printf("%s\r\n", cmd_string);
	
	res = me3616_send_cmd(cmd_string, "OK", 300);

	return res;
}

/**************************************************************
函数名称 : me3616_onenet_miplobserve_rsp
函数功能 : 模组响应平台的 observe 请求
输入参数 : msgid:整型,消息id,+MIPLOBSERVE上报的消息id
		   result:整型, observe请求的结果((取消)观察结果,
		   1表示(取消)观察成功
返回值  	 : 0:成功
		   1:失败
备注		 : 无
**************************************************************/
u8 me3616_onenet_miplobserve_rsp(int msgid, int result)
{
	u8 res;
	char cmd_string[64];

	memset(cmd_string, 0, sizeof(cmd_string));

	sprintf(cmd_string, "AT+MIPLOBSERVERSP=0,%d,%d", msgid, result);
	
	printf("%s\r\n", cmd_string);
	
	res = me3616_send_cmd(cmd_string, "OK", 300);

	return res;
}

/**************************************************************
函数名称 : me3616_onenet_mipldiscover_rsp
函数功能 : 模组响应平台的 observe 请求
输入参数 : msgid:整型,消息id,+ MIPLDISCOVER上报的消息id
		   result:整型,DISCOVER请求的结果,
		   1表示read成功,应同时提供read内容
		   length: 整型,响应DISCOVER 请求的valuestring长度
		   valuestring:字符串,响应DISCOVER请求的object对应的属性
返回值  	 : 0:成功
		   1:失败
备注		 : 多个对象属性用“;”来分开,如5900;5750
**************************************************************/
u8 me3616_onenet_mipldiscover_rsp(int msgid, int result, int length,
												const char *valuestring)
{
	u8 res;
	char cmd_string[64];

	memset(cmd_string, 0, sizeof(cmd_string));
	
	sprintf(cmd_string, "AT+MIPLDISCOVERRSP=0,%d,%d,%d,%s", msgid, result, length, valuestring);
	
	printf("%s\r\n", cmd_string);
	
	res = me3616_send_cmd(cmd_string, "OK", 300);

	return res;
}

/**************************************************************
函数名称 : me3616_onenet_miplnotify
函数功能 : 模组向平台请求同步数据
输入参数 : msgid::整型,消息id
		   objectid :整型, 发送notify请求的object id
		   instanceid: 整型, 发送notify请求的instance id
		   resourceid:整型, 发送 notify请求的resource id
		   valuetype: 整型, 发送notify请求的上报数据类型
		   (1 string; 2 opaque; 3 integer; 4 float; 5 bool )
		   len: 整型, 发送notify请求的上报数据长度,
		   只有 opaque 和 string 类型数据时需要配置参数信息,
		   对其他类型数据(如浮点类型)则无需配置参数信息。
		   value: 发送notify请求的上报数据值
		   index:整型,配置文件表示,范围从 N-1 到 0
		   flag:消息标志,1 first message; 2 middle message; 0 last message 
		   (请填 0, 用 index 来区分, 后续所有 AT 命令里的 flag 都填 0)
返回值  	 : 0:成功
		   1:失败
备注		 : value在这里无字符型,在填这个参数时请将对应的类型转换为字符型
**************************************************************/
u8 me3616_onenet_miplnotify(int msgid, int objectid, int instanceid, 
										int resourceid, int valuetype, int len,
										const char *value, int index, int flag)
{
	u8 res;
	char cmd_string[256];

	memset(cmd_string, 0, sizeof(cmd_string));
	
	sprintf(cmd_string, "AT+MIPLNOTIFY=0,%d,%d,%d,%d,%d,%d,%s,%d,%d", msgid, objectid, instanceid, resourceid, valuetype, len, value, index, flag);

	printf("%s\r\n", cmd_string);
	
	res = me3616_send_cmd(cmd_string, "OK", 300);

	return res;
}

/**************************************************************
函数名称 : me3616_onenet_miplupdate
函数功能 : 注册更新命令
输入参数 : lifetime:注册到 OneNET 平台的生存时间
		   mode:1,更新objects 0,不更新objects
返回值  	 : 0:成功
		   1:失败
备注		 : 无
**************************************************************/
u8 me3616_onenet_miplupdate(int lifetime, u8 mode)
{
	u8 res;
	char cmd_string[64];

	memset(cmd_string, 0, sizeof(cmd_string));

	if(mode)
	{
		sprintf(cmd_string, "AT+MIPLUPDATE=0,%d,1", lifetime);
	}
	else
	{
		sprintf(cmd_string, "AT+MIPLUPDATE=0,%d,0", lifetime);
	}
	printf("%s\r\n", cmd_string);
	
	res = me3616_send_cmd(cmd_string, "OK", 300);

	return res;
}

/**************************************************************
函数名称 : me3616_onenet_miplwrite_rsp
函数功能 : 模组响应平台的 WRITE 请求
输入参数 : msgid::整型,消息id,+MIPLWRITE上报的消息id
		   result:整型,write 请求的结果,2表示写入成功
返回值  	 : 0:成功
		   1:失败
备注		 : 无
**************************************************************/
u8 me3616_onenet_miplwrite_rsp(int msgid, int result)
{
	u8 res;
	char cmd_string[64];

	memset(cmd_string, 0, sizeof(cmd_string));

	sprintf(cmd_string, "AT+MIPLWRITERSP=0,%d,%d", msgid, result);
	
	printf("%s\r\n", cmd_string);
	
	res = me3616_send_cmd(cmd_string, "OK", 300);

	return res;
}

/**************************************************************
函数名称 : me3616_onenet_miplread_rsp
函数功能 : 模组响应平台的 READ 请求
输入参数 : msgid:: 整型,消息id ,+MIPLREAD 上报的消息id
		   result:整型, read 请求的结果,
		   1表示成功,应同时提供read内容
		   objectid: 整型, 响应 read 请求的 object id
		   instanceid: 整型, 响应 read 请求的 in stance id
		   resourceid: 整型, 响应 read 请求的 resource id
		   valuetype:  整型, 响应 read 请求的上报数据类型 
		   (1 string; 2 opaque; 3 integer; 4 float; 5 bool )
		   len:整型, 响应 read 请求的上报数据长度,
		   只有 opaque 和 string 类型数据时需要配置参数信息,
		   对其他类型数据(如浮点类型)则无需配置参数信息。
		   value:  整型, 响应 read 请求的上报数据值
		   index:整型,配置文件表示,范围从 N-1 到 0
		   flag:整型,消息标志 ,1 first message; 2 middle message; 0 last message
		   (请填 0, 用 index 来区分, 后续所有 AT 命令里的 flag 都填 0)
返回值  	 : 0:成功
		   1:失败
备注		 : value在这里无字符型,在填这个参数时请将对应的类型转换为字符型
**************************************************************/
u8 me3616_onenet_miplread_rsp(int msgid, int result, int objectid, 
											int instanceid, int resourceid, int valuetype,
											int len, const char *value, int index, int flag)
{
	u8 res;
	char cmd_string[256];

	memset(cmd_string, 0, sizeof(cmd_string));

	sprintf(cmd_string, "AT+MIPLREADRSP=0,%d,%d,%d,%d,%d,%d,%d,%s,%d,%d", msgid, result, objectid, instanceid, resourceid, valuetype, len, value, index, flag);
	
	printf("%s\r\n", cmd_string);
	
	res = me3616_send_cmd(cmd_string, "OK", 300);

	return res;
}

/**************************************************************
函数名称 : me3616_onenet_miplexecute_rsp
函数功能 : 模组响应平台的 execute 请求
输入参数 : msgid:整型,消息id,+MIPLEXEUTERSP上报的消息id
		   result:整型,execute请求的结果,2表示execute成功
返回值  	 : 0:成功
		   1:失败
备注		 : 无
**************************************************************/
u8 me3616_onenet_miplexecute_rsp(int msgid, int result)
{
	u8 res;
	char cmd_string[64];

	memset(cmd_string, 0, sizeof(cmd_string));

	sprintf(cmd_string, "AT+MIPLEXEUTERSP=0,%d,%d", msgid, result);

	printf("%s\r\n", cmd_string);
	
	res = me3616_send_cmd(cmd_string, "OK", 300);

	return res;
}

/**************************************************************
函数名称 : me3616_onenet_miplparameter_rsp
函数功能 : 模组响应平台的设置 paramete 请求
输入参数 : msgid:整型,消息id,+MIPLPARAMETER上报的消息id
		   result:整型, 设置parameter请求的结果,1表示设置参数成功
返回值  	 : 0:成功
		   1:失败
备注		 : 无
**************************************************************/
u8 me3616_onenet_miplparameter_rsp(int msgid, int result)
{
	u8 res;
	char cmd_string[64];

	memset(cmd_string, 0, sizeof(cmd_string));

	sprintf(cmd_string, "AT+MIPLPARAMETERRSP=0,%d,%d", msgid, result);
	
	printf("%s\r\n", cmd_string);
	
	res = me3616_send_cmd(cmd_string, "OK", 300);

	return res;
}

/**************************************************************
函数名称 : me3616_onenet_miplclose
函数功能 : 模组向平台发起注销请求
输入参数 : 无
返回值  	 : 0:成功
		   1:失败
备注		 : 无
**************************************************************/
u8 me3616_onenet_miplclose(void)
{
	u8 res;
	
	res = me3616_send_cmd("AT+MIPLCLOSE=0", "OK", 300);
	printf("AT+MIPLCLOSE=0\r\n");

	return res;
}

/**************************************************************
函数名称 : me3616_onenet_mipldelobj
函数功能 : 删除一个 object(对象)
输入参数 : objectid:object id
返回值  	 : 0:成功
		   1:失败
备注		 : 无
**************************************************************/
u8 me3616_onenet_mipldelobj(int objectid)
{
	u8 res;
	char cmd_string[64];

	memset(cmd_string, 0, sizeof(cmd_string));

	sprintf(cmd_string, "AT+MIPLDELOBJ=0,%d", objectid);
	
	printf("%s\r\n", cmd_string);
	
	res = me3616_send_cmd(cmd_string, "OK", 300);
	
	return res;
}

/**************************************************************
函数名称 : me3616_onenet_mipldelete
函数功能 : 删除 OneNET instance
输入参数 : 无
返回值  	 : 0:成功
		   1:失败
备注		 : 无
**************************************************************/
u8 me3616_onenet_mipldelete(void)
{
	u8 res;
	
	res = me3616_send_cmd("AT+MIPLDELETE=0", "OK", 300);
	printf("AT+MIPLDELETE=0\r\n");

	return res;
}

/**************************************************************
函数名称 : me3616_parse_onenet_miplobserve
函数功能 : 解析平台向模组发起 observe 请求参数
输入参数 : 要解析的参数
返回值  	 : 无
备注		 : 无
**************************************************************/
void me3616_parse_onenet_miplobserve(int *msgid, int *flag, int *objectid, int *instanceid, int *resourceid)
{
	char *token = NULL;

   	/* 用strtok函数解析 */
   	token = strtok(strstr((const char*)USART3_RX_BUF, "+MIPLOBSERVE"), ", ");
   	token = strtok(NULL, ", ");
   	token = strtok(NULL, ", ");
   	*msgid = atoi(token);
   	token = strtok(NULL, ", ");
   	*flag = atoi(token);
   	token = strtok(NULL, ", ");
   	*objectid = atoi(token);
   	token = strtok(NULL, ", ");
   	*instanceid = atoi(token);
   	token = strtok(NULL, ", ");
   	*resourceid = atoi(token);
}

/**************************************************************
函数名称 : me3616_parse_onenet_mipldiscover
函数功能 : 解析平台向模组发起 discover 请求参数
输入参数 : 要解析的参数
返回值  	 : 无
备注		 : 无
**************************************************************/
void me3616_parse_onenet_mipldiscover(int *msgid, int *objectid)
{
   char *token = NULL;
 
   /* 用strtok函数解析 */
   token = strtok(strstr((const char*)USART3_RX_BUF, "+MIPLDISCOVER"), ", ");
   token = strtok(NULL, ", ");
   token = strtok(NULL, ", ");
   *msgid =atoi(token);
   token = strtok(NULL, ", ");
   *objectid =atoi(token);
}

/**************************************************************
函数名称 : me3616_parse_onenet_mipldwrite
函数功能 : 解析平台向模组发起 write 请求参数
输入参数 : 要解析的参数
返回值  	 : 无
备注		 : 无
**************************************************************/
void me3616_parse_onenet_mipldwrite(int *msgid, int *objectid, int *instanceid, 
											int *resourceid, int *valuetype, int *len, 
											char *value, int *flag, int *index)
{
   char *token = NULL;
   
   /* 用strtok函数解析 */
   token = strtok(strstr((const char*)USART3_RX_BUF, "+MIPLWRITE"), ", ");
   token = strtok(NULL, ", ");
   token = strtok(NULL, ", ");
   *msgid =atoi(token);
   token = strtok(NULL, ", ");
   *objectid = atoi(token);
   token = strtok(NULL, ", ");
   *instanceid = atoi(token);
   token = strtok(NULL, ", ");
   *resourceid = atoi(token);
   token = strtok(NULL, ", ");
   *valuetype = atoi(token);
   token = strtok(NULL, ", ");
   *len = atoi(token);
   token = strtok(NULL, ", ");
   sprintf((char*)value, "%s", token);
   token = strtok(NULL, ", ");
   *flag = atoi(token);
   token = strtok(NULL, ", ");
   *index = atoi(token);
}

/**************************************************************
函数名称 : me3616_parse_onenet_miplread
函数功能 : 解析OneNET 平台向模组发起 read 请求参数
输入参数 : 要解析的参数
返回值  	 : 无
备注		 : 无
**************************************************************/
void me3616_parse_onenet_miplread(int *msgid, int *objectid, int *instanceid, int *resourceid)
{
   char *token = NULL;
   
   /* 用strtok函数解析 */
   token = strtok(strstr((const char*)USART3_RX_BUF, "+MIPLREAD"), ", ");
   token = strtok(NULL, ", ");
   token = strtok(NULL, ", ");
   *msgid =atoi(token);
   token = strtok(NULL, ", ");
   *objectid = atoi(token);
   token = strtok(NULL, ", ");
   *instanceid = atoi(token);
   token = strtok(NULL, ", ");
   *resourceid = atoi(token);
}

/**************************************************************
函数名称 : me3616_registered_to_onenet
函数功能 : 设备注册到OneNET平台
输入参数 : 无
返回值  	 : 无
备注		 : 无
**************************************************************/
void me3616_registered_to_onenet(void)
{	
	if(0 == me3616_onenet_miplclose())
	{
		printf("AT+MIPLCLOSE OK\r\n");
	}
	delay_ms(300);
//*********************************************************
	me3616_onenet_mipldelobj(g_addobj_objectid_3300);
	delay_ms(300);
	me3616_onenet_mipldelobj(g_addobj_objectid_3303);
	delay_ms(300);
	me3616_onenet_mipldelobj(g_addobj_objectid_3304);
	delay_ms(300);
	me3616_onenet_mipldelobj(g_addobj_objectid_3336);
	delay_ms(300);

//*********************************************************	
	
	if(0 == me3616_onenet_mipldelete())
	{
		printf("AT+MIPLDELETE OK\r\n");
	}
	delay_ms(300);
	if(0 == me3616_onenet_miplcreate())
	{
		printf("AT+MIPLCREATE OK\r\n");
	}
	delay_ms(300);
/**********************************************************************/
	
	me3616_onenet_mipladdobj(g_addobj_objectid_3300, 3, "\"111\"", 1, 0);
	delay_ms(300);
	me3616_onenet_mipladdobj(g_addobj_objectid_3303, 1, "\"1\"", 1, 0);
	delay_ms(300);
	me3616_onenet_mipladdobj(g_addobj_objectid_3304, 1, "\"1\"", 1, 0);
	delay_ms(300);	
	me3616_onenet_mipladdobj(g_addobj_objectid_3336, 1, "\"1\"", 2, 0);
	delay_ms(300);
	
/**********************************************************************/	
	if(0 == me3616_onenet_miplopen(g_opend_lifetime))
	{
		printf("AT+MIPLOPEN OK\r\n");
	}
	delay_ms(300);
}

/**************************************************************
函数名称 : me3616_onenet_miplnotify_process
函数功能 : 数据上报到OneNET平台
输入参数 : 无
返回值  	 : 无
备注		 : 无
**************************************************************/
void me3616_onenet_miplnotify_process(void)
{

	TIM_SetCounter(TIM3, 0);	/* 计数器清空 */
	TIM_Cmd(TIM3, DISABLE);  	/* 关闭TIMx */
	TIM_SetCounter(TIM2, 0);	/* 计数器清空 */
	TIM_Cmd(TIM2, DISABLE);
	TIM_SetCounter(TIM4, 0);	/* 计数器清空 */
	TIM_Cmd(TIM4, DISABLE);
	g_hardware_times = 0;
				

//*******************************************************************/
	printf("notify to onenet\r\n");
	
	Falldetection();
	memset(g_sensor_value_Tem, 0, sizeof(g_sensor_value_Tem));
	memset(g_sensor_value_Hul, 0, sizeof(g_sensor_value_Hul));
	sht20_get_value();
	sprintf(g_sensor_value_Tem, "%0.1f", sht20_data_t.sht20_temperture);//温湿度
	sprintf(g_sensor_value_Hul, "%0.1f", sht20_data_t.sht20_humidity);
	g_sensor_value_Tem[4] = '\0';
	g_sensor_value_Hul[4] = '\0';
/**********************************************************************/
//		memset(g_sensor_value_Pitch, 0, sizeof(g_sensor_value_Pitch));
//		sprintf(g_sensor_value_Pitch, "%d", (int)Pitch);	
//		g_sensor_value_Pitch[4] = '\0';
//		memset(g_sensor_value_Roll, 0, sizeof(g_sensor_value_Roll));
//		sprintf(g_sensor_value_Roll, "%d", (int)Roll);	
//		g_sensor_value_Roll[4] = '\0';
//		memset(g_sensor_value_Yaw, 0, sizeof(g_sensor_value_Yaw));
//		sprintf(g_sensor_value_Yaw, "%d", (int)Yaw);	
//		g_sensor_value_Yaw[4] = '\0';
/*********************************************************************/
		memset(g_sensor_value_FS, 0, sizeof(g_sensor_value_FS));//老人姿态
		sprintf(g_sensor_value_FS, "%d", mpu_flag);	
		g_sensor_value_FS[4] = '\0';
		memset(g_sensor_value_temp, 0, sizeof(g_sensor_value_temp));//人体温度
		sprintf(g_sensor_value_temp, "%0.2f", temp);	
		g_sensor_value_temp[7] = '\0';
		memset(g_sensor_value_HeartRate, 0, sizeof(g_sensor_value_HeartRate));//心率
		sprintf(g_sensor_value_HeartRate, "%d", n_heart_rate);
		g_sensor_value_HeartRate[4] = '\0';
		
		memset(g_sensor_value_Lat, 0, sizeof(g_sensor_value_Lat));//GPS
		memset(g_sensor_value_Lon, 0, sizeof(g_sensor_value_Lon));
		sprintf(g_sensor_value_Lat, "%f", Baidu_Lat);
		sprintf(g_sensor_value_Lon, "%f", Baidu_Lon);
		g_sensor_value_Lat[14] = '\0';
		g_sensor_value_Lon[14] = '\0';


//*********************************************************************/	

	//报警模式下
	if(Warn_flag == 1)
	{
	me3616_onenet_miplnotify(g_observe_msgid_T[0], g_addobj_objectid_3300, 0, g_notify_resourceid_5700_sensor_value, 4, 4, g_sensor_value_FS, 0, 0);//人体姿态检测
	delay_ms(100);
	
	me3616_onenet_miplnotify(g_observe_msgid_T[5], g_addobj_objectid_3336, 0, g_notify_resourceid_5513_sensor_value, 1, strlen(g_sensor_value_Lat), g_sensor_value_Lat, 1, 1);//纬度
	delay_ms(100);
	me3616_onenet_miplnotify(g_observe_msgid_T[5], g_addobj_objectid_3336, 0, g_notify_resourceid_5514_sensor_value, 1, strlen(g_sensor_value_Lon), g_sensor_value_Lon, 0, 0);//经度
	delay_ms(100);
	}
	else//非报警模式下
	{
		if(temp>=10)
		{
		me3616_onenet_miplnotify(g_observe_msgid_T[1], g_addobj_objectid_3300, 1, g_notify_resourceid_5700_sensor_value, 4, 4, g_sensor_value_temp, 0, 0);//人体温度
		}
		delay_ms(100);
		if((n_heart_rate<170)&&(n_heart_rate>10))
		{
		me3616_onenet_miplnotify(g_observe_msgid_T[2], g_addobj_objectid_3300, 2, g_notify_resourceid_5700_sensor_value, 4, 4, g_sensor_value_HeartRate, 0, 0);//人体心率
		}
	}
	delay_ms(100);
	me3616_onenet_miplnotify(g_observe_msgid_T[3], g_addobj_objectid_3303, 0, g_notify_resourceid_5700_sensor_value, 4, 4, g_sensor_value_Tem, 0, 0);//空气温度
	delay_ms(100);	
	me3616_onenet_miplnotify(g_observe_msgid_T[4], g_addobj_objectid_3304, 0, g_notify_resourceid_5700_sensor_value, 4, 4, g_sensor_value_Hul, 0, 0);//空气湿度
	delay_ms(100);

//***************************************************	
	me3616_onenet_miplupdate(g_opend_lifetime, 1);	

	g_me3616_miplnotify_flag = 0;


	TIM_Cmd(TIM3, ENABLE);  	/* 使能TIMx */
	if(Warn_flag == 0) TIM_Cmd(TIM4, ENABLE);  	/* 使能TIMx */
	if(Warn_flag == 0) TIM_Cmd(TIM2, ENABLE);  	/* 使能TIMx */

}

/**************************************************************
函数名称 : me3616_process_back_result_task
函数功能 : 模组返回结果任务处理任务
输入参数 : parameter
返回值  	 : 无
备注		 : 无
**************************************************************/
void me3616_process_back_result_task(void *parameter)
{
	while(1)
	{

		if(USART3_RX_STA & 0X8000)
		{
			if(strstr((const char*)USART3_RX_BUF, "+MIPLEVENT") && (0 == g_me3616_miplnotify_flag))
			{
				if(strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 25") || strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 8") \
				|| strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 7") || strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 5") \
				|| strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 9") || strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 10") \
				|| strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 12") || strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 13") \
				|| strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 20") || strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 3"))
				{
					me3616_at_response(1);

					g_hardware_times = 0;
					TIM_Cmd(TIM3, DISABLE);  /* 关闭TIMx */

					me3616_hardware_reset();	/* 执行硬件复位重启 */
				}
				else if(strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 14"))
				{
					me3616_onenet_miplupdate(g_opend_lifetime, 1);
				}
				me3616_at_response(1);
			}
//			#ifdef ME3616_OPEN_SLEEP_MODE
//			else if(strstr((const char*)USART3_RX_BUF, "+MIPLEVENT: 0, 4") && (1 == g_me3616_miplnotify_flag))
//			{
//				me3616_onenet_miplnotify_process();
//			}
			#else
			else if(1 == g_me3616_miplnotify_flag)
			{
				me3616_onenet_miplnotify_process();
				
			}
//			#endif
			else if(strstr((const char*)USART3_RX_BUF, "+MIPLOBSERVE"))
			{
			/***************************************************************************
				me3616_parse_onenet_miplobserve(&g_observe_msgid, &g_observe_flag, &g_observe_objectid, &g_observe_instanceid, &g_observe_resourceid);
				me3616_at_response(1);
				delay_ms(300);
				if(me3616_onenet_miplobserve_rsp(g_observe_msgid, 1)==0)
				{
					g_observe_msgid_T[a++] = g_observe_msgid;
					g_observe_objectid_T[b++] = g_observe_objectid;	
				}
			*****************************************************************************/
				me3616_parse_onenet_miplobserve(&g_observe_msgid, &g_observe_flag, &g_observe_objectid, &g_observe_instanceid, &g_observe_resourceid);
				me3616_at_response(1);
				delay_ms(300);

				if((g_observe_objectid == 3300)&&(g_observe_instanceid == 0))
				{
					me3616_onenet_miplobserve_rsp(g_observe_msgid, 1);
					g_observe_msgid_T[a++] = g_observe_msgid;	
				}
				if((g_observe_objectid == 3300)&&(g_observe_instanceid == 1))
				{
					me3616_onenet_miplobserve_rsp(g_observe_msgid, 1);
					g_observe_msgid_T[a++] = g_observe_msgid;	
				}
				if((g_observe_objectid == 3300)&&(g_observe_instanceid == 2))
				{
					me3616_onenet_miplobserve_rsp(g_observe_msgid, 1);
					g_observe_msgid_T[a++] = g_observe_msgid;	
				}
				if((g_observe_objectid == 3303)&&(g_observe_instanceid == 0))
				{
					me3616_onenet_miplobserve_rsp(g_observe_msgid, 1);
					g_observe_msgid_T[a++] = g_observe_msgid;	
				}
				if((g_observe_objectid == 3304)&&(g_observe_instanceid == 0))
				{
					me3616_onenet_miplobserve_rsp(g_observe_msgid, 1);
					g_observe_msgid_T[a++] = g_observe_msgid;	
				}				
				if((g_observe_objectid == 3336)&&(g_observe_instanceid == 0))
				{
					me3616_onenet_miplobserve_rsp(g_observe_msgid, 1);
					g_observe_msgid_T[a++] = g_observe_msgid;	
				}

				
			}
			else if(strstr((const char*)USART3_RX_BUF, "+MIPLDISCOVER"))
			{
				me3616_parse_onenet_mipldiscover(&g_discover_msgid, &g_discover_objectid);
				me3616_at_response(1);
				delay_ms(300);
				if(g_discover_objectid == 3300){
					me3616_onenet_mipldiscover_rsp(g_discover_msgid, 1, 4, g_discover_valuestring_5700);
					me3616_at_response(1);
					delay_ms(300);
				}
				if(g_discover_objectid == 3303){
					me3616_onenet_mipldiscover_rsp(g_discover_msgid, 1, 4, g_discover_valuestring_5700);
					me3616_at_response(1);
					delay_ms(300);
				}
				if(g_discover_objectid == 3304){
					me3616_onenet_mipldiscover_rsp(g_discover_msgid, 1, 4, g_discover_valuestring_5700);
					me3616_at_response(1);
					delay_ms(300);
				}
				if(g_discover_objectid == 3336){
					me3616_onenet_mipldiscover_rsp(g_discover_msgid, 1, 9, g_discover_valuestring_1314);
					me3616_at_response(1);
					delay_ms(300);
					
					TIM_Cmd(TIM2, ENABLE);  //使能TIMx外设
					TIM_Cmd(TIM4, ENABLE);  //使能TIMx外设

					OLED_CLS();//清屏
					for(i_OLED=0;i_OLED<6;i_OLED++)
					{
						OLED_ShowCN(20+i_OLED*16,3,nbiot_internet_ok,i_OLED);//测试显示中文
					}
					delay_ms(500);
					me3616_onenet_miplnotify_process();
					me3616_fini_flag = 1;
				
				}
				
			}
			else if(strstr((const char*)USART3_RX_BUF, "+CIS ERROR"))
			{
				me3616_at_response(1);
				g_hardware_times = 0;
				TIM_Cmd(TIM3, DISABLE);  	/* 关闭TIMx */
				me3616_hardware_reset();	/* 执行硬件复位重启 */
			}
			else if(strstr((const char*)USART3_RX_BUF, "auto-reboot"))/* 模组发生异常重启现象 */
			{
				me3616_at_response(1);
				g_hardware_times = 0;
				TIM_Cmd(TIM3, DISABLE);  /* 关闭TIMx */
			}
			else if(strstr((const char*)USART3_RX_BUF, "+IP"))	/* 查到IP,说明模组开机或者重启后注册上网络了 */
			{
				me3616_at_response(1);
				printf("me3616 network registed...\r\n");
				
				OLED_CLS();//清屏
				OLED_ShowStr(10,3,"NB-IOT IN NET",2);
				delay_ms(100);
				me3616_registered_to_onenet();
			}
			//******************************************GPS***********************************************************/			
			else if(strstr((const char*)USART3_RX_BUF, "$GNGLL"))	/*查到 +ZGPS,说明模组GPS下载或查询 AGNSS 数据*/
			{
				me3616_at_response(1);
				printf("me3616 GPS data processing ...\r\n");
				me3616_onenet_GPS_parse_data( &GPS_Lat, &GPS_Lon);
				delay_ms(300);
				Baidu_Lat = me3616_onenet_GPS_data_Convert(GPS_Lat);
				delay_ms(300);
				Baidu_Lon = me3616_onenet_GPS_data_Convert(GPS_Lon);
				printf("\nBaidu_Lat:%f\r\n",Baidu_Lat);
				printf("\nBaidu_Lon:%f\r\n",Baidu_Lon);

			}
			else if(strstr((const char*)USART3_RX_BUF, "TIMEOUT"))
			{
				me3616_at_response(1);
				me3616_onenet_GPS_Run(1);
			
			}
			//*****************************************************************************************************/
			else
			{
				me3616_at_response(1);
			}
		}
/*****************************************************************************/	
		if(1 == g_me3616_miplnotify_flag)   //定时notify发送数据
		{
			me3616_onenet_miplnotify_process();
				
		}
		
//		t=Falldetection();
		key=KEY_Scan(1);	//得到键值
	   	if(key)
		{						   
			switch(key)
			{				 
				case KEY1_PRES:	//添加报警	 
					Warn_flag = 1;
					GPIO_SetBits(GPIOC, GPIO_Pin_12); //LED灭

					
					break;
				case KEY0_PRES:	//取消报警
					Warn_flag = 0;
					GPIO_ResetBits(GPIOC, GPIO_Pin_12);//LED亮
					
					break;
			}
		}
		
		if(Warn_flag == 1 && me3616_fini_flag == 1)//报警模式
		{
			TIM_Cmd(TIM4, DISABLE);  //关闭TIM4外设
			TIM_Cmd(TIM2, ENABLE);  //开启TIM2外设
			OLED_CLS();//清屏
			OLED_Fill(0x00);//全屏灭
			if(mpu_flag == 1 ){
				GPIO_ResetBits(GPIOF, GPIO_Pin_14);
				send_message_chinese("80014EBA8DCC50120021"); //测试短信
				delay_ms(100);
			}
			else GPIO_SetBits(GPIOF, GPIO_Pin_14);
			
		}
		else if(Warn_flag == 0 && me3616_fini_flag == 1) //非报警
		{	
			GPIO_SetBits(GPIOF, GPIO_Pin_14);
			TIM_Cmd(TIM2, DISABLE);  //关闭TIM2外设
			TIM_Cmd(TIM4, ENABLE);  //开启TIM4外设

		}
/*************************************************************************************************************/			
	}
}

/**************************************************************
函数名称 : me3616_process_back_result_task_init
函数功能 : 创建模组返回结果处理函数
输入参数 : 无
返回值  	 : 无
备注		 : 无
**************************************************************/
void me3616_process_back_result_task_init(void)
{
	if(g_me3616_process_back_result_task_handle == NULL) 
	{
		xTaskCreate(me3616_process_back_result_task,
			"me3616_process_back_result_task",
			1024 * 4 / sizeof(portSTACK_TYPE),
			NULL,
			4,
			&g_me3616_process_back_result_task_handle);
	}
}

/**************************************************************
函数名称 : TIM3_IRQHandler
函数功能 : 定时器3中断服务函数
输入参数 : 无
返回值  	 : 无
备注		 : 定时来notify数据
**************************************************************/
void TIM3_IRQHandler(void)
{	
	if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  /* 检查TIM3更新中断发生与否 */
	{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  /* 清除TIMx更新中断标志 */

//		printf("g_hardware_times=%d\r\n", g_hardware_times);
		g_hardware_times++;
		
		if(g_hardware_times > ME3616_MIPLNOTIFY_TIME)
		{
			g_me3616_miplnotify_flag = 1;
			printf("enter notify, g_hardware_times=%d\r\n", g_hardware_times);

			#ifdef ME3616_OPEN_SLEEP_MODE
			ME3616_WAKE_UP_HIGH;
			usart3_printf("AT");
			ME3616_WAKE_UP_LOW;	
			#endif
			g_hardware_times = 0;
			
		}
	}
}

/**************************************************************
函数名称 : me3616_connect_onenet_app
函数功能 : me3616对接OneNET应用
输入参数 : 无
返回值  	 : 无
备注		 : 放对接OneNET的任务
**************************************************************/
void me3616_connect_onenet_app(void)
{
	me3616_process_back_result_task_init();
}


程序获取地址:
https://download.csdn.net/download/qq_43493099/87149710

你可能感兴趣的:(stm32,单片机,物联网)