• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
狩猎者Shawn
帮助1

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

系统总体设计

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

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

系统程序包含的内容
学新通

主程序:

#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 类型数据时需要配置<len>参数信息,
		   对其他类型数据(如浮点类型)则无需配置<len>参数信息。
		   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 类型数据时需要配置<len>参数信息,
		   对其他类型数据(如浮点类型)则无需配置<len>参数信息。
		   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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgaeeha
系列文章
更多 icon
同类精品
更多 icon
继续加载