物联网系列专业课程之:智云硬件层驱动设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Internet+EducationSolutions智云硬件层驱动设计中智讯(武汉)科技有限公司EducationSolutions目录ContentsInternet+智云硬件Hal层驱动框架采集类传感器驱动设计控制类传感器驱动设计安防类传感器驱动设计智云硬件层设计实例16:27/3智云硬件HAL软件框架(ZigBee)基于CC2530处理器的智云节点采用ZStack协议栈,参考工程如下:dht11.c/.h温湿度传感器的驱动UserApp.c/.hZXBee协议驱动代码sensor_init()#传感器硬件初始化sensor_update()#定时主动上报传感器数值sensor_control()#传感器控制逻辑sensor_check()#监测传感器报警状态值usr_process_command_call()#解析收到的控制命令MyEventProcess()#自定义处理事件AppCommon.cZStacksapi接口实现zb_HandleOsalEvent()#OSAL事件zb_ReceiveDataIndication()#接收到无线数据包process_package()#ZXBee数据包解析_process_command_call()#解析收到的控制命令16:27/4ZXBee驱动框架传感器初始化sensor_init()开始入网成功是否设置定时器开启用户任务事件事件发生是否用户任务事件处理MyEventProcess()设置定时器开启用户任务事件接收数据是否接收数据处理usr_process_command_call()上报传感器值/执行控制等操作ZXBee驱动基于sapi框架开发,详细的程序流程图如上所示16:27/5ZXBee驱动框架(event&ZB_ENTRY_EVENT)事件:1.判断/设置节点类型2.设置网络信号LED灯闪烁3.调用sensor_init()函数进行传感器初始化(event&0x000F)事件:1.进入用户自定义事件(0x0001~0x000F),该函数在UserApp.c文件内MyEventProcess()函数实现voidzb_HandleOsalEvent(uint16event)检测是否正确入网,入网成功后网络信号LED灯长亮voidzb_StartConfirm(uint8status)处理接收到的无线数据包处理并分解ZXBee无线数据包,提取命令键值对voidzb_ReceiveDataIndication(uint16source,uint16command,uint16len,uint8*pData)staticvoidprocess_package(char*pkg,intlen)1.处理ZXBee无线数据包内的命令键值对(通用命令)2.调用usr_process_command_call(ptag,pval,pout)函数处理用户命令staticint_process_command_call(char*ptag,char*pval,char*pout)16:27/6ZXBee用户程序设计智云平台为ZigBeeZStack协议栈上层应用提供分层的软件设计结构,将传感器的私有操作部分封装到UserApp.c文件中函数名称函数说明sensor_init()传感器硬件初始化sensor_update()传感器数据定时上报sensor_check()传感器报警状态实时监测sensor_control()传感器/执行器控制函数usr_process_command_call()解析接收到的传感器控制命令函数MyEventProcess()自定义事件处理函数,启动定时器触发事件MY_REPORT_EVTEducationSolutions目录ContentsInternet+智云硬件Hal层驱动框架采集类传感器驱动设计控制类传感器驱动设计安防类传感器驱动设计智云硬件层设计实例16:27/8采集类传感器设计示例案例:设计智能温湿度采集终端根据ZXBee协议定义,协议设定如下:传感器属性参数权限说明温湿度温度值A0R温度值,浮点型:0.1精度湿度值A1R湿度值,浮点型:0.1精度上报状态D0(OD0/CD0)R(W)D0的Bit0表示温度上传状态、Bit1表示湿度上传状态上报间隔V0RW修改主动上报的时间间隔16:27/9采集类传感器设计示例温湿度传感器程序逻辑sensor_init()初始化MY_REPORT_EVT事件接收到无线数据数据解析A0=?读取温度值并上报A1=?读取湿度值并上报D0=?读取上传状态并上报V0=?读取上传间隔并上报CD0/OD0控制上传状态V0控制上传时间间隔D0参数V0参数上报A0温度、A1湿度值自动上传开始16:27/10采集类传感器用户主要函数函数名称函数说明sensor_init()传感器硬件初始化sensor_update()传感器温湿度数据定时上报updateA0()更新并获取温度值updateA1()更新并获取湿度值usr_process_command_call()解析接收到的传感器控制命令函数MyEventProcess()自定义事件处理函数,启动定时器触发事件MY_REPORT_EVT16:27/11采集类传感器设计示例无线ZigBee节点上电启动后,根据ZStack协议栈逻辑,首先会初始化温湿度传感器sensor_init()函数在UserApp.c中实现,主要是完成温湿度传感器初始化工作,并启动定时器,触发用户事件MY_REPORT_EVTUserApp.cvoidsensor_init(void){dht11_io_init();//初始化传感器代码//启动定时器,触发事件:MY_REPORT_EVTosal_start_timerEx(sapi_TaskID,MY_REPORT_EVT,(uint16)((osal_rand()%10)*1000));}AppCommon.cvoidzb_HandleOsalEvent(uint16event){if(event&ZB_ENTRY_EVENT){......sensor_init();}}16:27/12采集类传感器设计示例MY_REPORT_EVT事件是在UserApp.c中实现的MY_REPORT_EVT事件首先会更新上报一次温湿度传感器的数值,然后在myReportInterval(默认值为30秒)时间后再次启动MY_REPORT_EVT事件,使得每隔myReportInterval时间无线ZigBee节点会自动更新上报一次温湿度传感器的数值UserApp.cvoidMyEventProcess(uint16event){if(event&MY_REPORT_EVT){sensor_update();//启动定时器,触发事件:MY_REPORT_EVTosal_start_timerEx(sapi_TaskID,MY_REPORT_EVT,(uint16)(myReportInterval*1000));}}16:27/13UserApp.cvoidsensor_update(void){……//根据D0的位状态判定需要主动上报的数值if((D0&0x01)==0x01){//若温度上报允许,则pData的数据包中添加温度数据updateA0();len=sprintf((char*)p,A0=%.1f,A0);……}if((D0&0x02)==0x02){//若湿度上报允许,则pData的数据包中添加湿度数据updateA1();len=sprintf((char*)p,A1=%.1f,A1);……}//将需要上传的数据进行打包操作,并通过zb_SendDataRequest()发送到协调器if(p-pData1){……zb_SendDataRequest(0,cmd,p-pData,pData,0,AF_ACK_REQUEST,AF_DEFAULT_RADIUS);HalLedSet(HAL_LED_1,HAL_LED_MODE_BLINK);//通信LED闪烁一次}}采集类传感器设计示例温湿度传感器数值主动上报函数update(),该函数实现是在UserApp.c文件中16:27/14UserApp.cfloatupdateA0(void){dht11_update();A0=dht11_temp();//获取温度值returnA0;}floatupdateA1(void){dht11_update();A1=dht11_humidity();//获取湿度值returnA1;}采集类传感器设计示例温湿度的数值更新函数为:updateA0(),updateA1(),在UserApp.c中实现16:27/15采集类传感器设计示例无线ZigBee节点入网成功后,会监测上层发送过来的数据包,数据包会在文件AppCommon.c-process_package(char*pkg,intlen)函数内对数据包做一定的解析,将解析出来的指令传递给文件UserApp.c-intusr_process_command_call(char*ptag,char*pval,char*pout)函数,该函数根据指令来响应请求。16:27/16UserApp.cintusr_process_command_call(char*ptag,char*pval,char*pout){......if(0==strcmp(CD0,ptag)){D0&=~val;}if(0==strcmp(OD0,ptag)){D0|=val;}if(0==strcmp(D0,ptag)){if(0==strcmp(?,pval)){ret=sprintf(pout,D0=%u,D0);}}if(0==strcmp(A0,ptag)){if(0==strcmp(?,pval)){updateA0();//更新温度数值ret=sprintf(pout,A0=%.1f,A0);}}UserApp.cif(0==strcmp(A1,ptag)){if(0==strcmp(?,pval)){updateA1();//更新湿度数值ret=sprintf(pout,A1=%.1f,A1);}}if(0==strcmp(V0,ptag)){if(0==strcmp(?,pval)){ret=sprintf(pout,V0=%u,V0);}else{updateV0(pval);}}returnret;}采集类传感器设计示例EducationSolutions目录ContentsInternet+智云硬件Hal层驱动框架采集类传感器驱动设计控制类传感器驱动设计安防类传感器驱动设计智云硬件层设计实例16:27/18控制类传感器设计示例案例:设计智能继电器开关终端根据ZXBee协议定义,协议设定如下:传感器属性参数权限说明继电器继电器开合D1(OD1/CD1)R(W)D1的Bit表示各路继电器开合状态,OD1为开、CD1为合16:27/19控制类传感器设计示例继电器控制器程序逻辑sensor_init()初始化MY_REPORT_EVT事件接收到无线数据数据解析D1=?获取继电器状态并上报CD1/OD1控制继电器上报D1继电器状态自动上传开始16:27/20控制类传感器用户主要函数函数名称函数说明sensor_init()传感器硬件初始化sensor_update()传感器数据定时上报sensor_control()传感器/执行器控制函数usr_process_command_call()解析接收到的传感器控制命令函数MyEventProcess()自定义事件处理函数,启动定时器触发事件MY_REPORT_EVT16:27/21控制类传感器设计示例在UseApp.c文件中实现解析控制命令函数usr_process_command_call(),

1 / 31
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功