这是我本科毕设搞得一个小任务,现在稍微整理了其中一点内容,下面有相应的程序代码。
程序参考:
采用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