实验室智能管理系统(3)——zigbee部分
2017-03-26 20:22
489 查看
我使用的是ZStack-CC2530-2.5.1 修改了Sample app代码
SampleApp.c
SampleApp.h
DHT11.c
DTH11.h
上面主要是指纹模块通讯和DHT11部分
继电器和其他的一部分需修改一下代码 把注释部分去掉
此外需要注意的地方 和ARM通讯的时候需要修改协议栈串口部分的波特率115200和交叉线设置为false
修改串口接收函数
void MT_UartProcessZToolData ( uint8 port, uint8 event )用的是网蜂提供的代码
最后来一张全家福照片
SampleApp.c
/************************************************************************************************** Filename: SampleApp.c Revised: $Date: 2009-03-18 15:56:27 -0700 (Wed, 18 Mar 2009) $ Revision: $Revision: 19453 $ Description: Sample Application (no Profile). Copyright 2007 Texas Instruments Incorporated. All rights reserved. IMPORTANT: Your use of this Software is limited to those specific rights granted under the terms of a software license agreement between the user who downloaded the software, his/her employer (which must be your employer) and Texas Instruments Incorporated (the "License"). You may not use this Software unless you agree to abide by the terms of the License. The License limits your use, and you acknowledge, that the Software may not be modified, copied or distributed unless embedded on a Texas Instruments microcontroller or used solely and exclusively in conjunction with a Texas Instruments radio frequency transceiver, which is integrated into your product. Other than for the foregoing purpose, you may not use, reproduce, copy, prepare derASivative works of, modify, distribute, perform, display or sell this Software and/or its documentation for any purpose. YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED 揂S IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. Should you have any questions regarding your right to use this Software, contact Texas Instruments Incorporated at www.TI.com. **************************************************************************************************/ /********************************************************************* This application isn't intended to do anything useful, it is intended to be a simple example of an application's structure. This application sends it's messages either as broadcast or broadcast filtered group messages. The other (more normal) message addressing is unicast. Most of the other sample applications are written to support the unicast message model. Key control: SW1: Sends a flash command to all devices in Group 1. SW2: Adds/Removes (toggles) this device in and out of Group 1. This will enable and disable the reception of the flash command. *********************************************************************/ /********************************************************************* * INCLUDES */ #include "OSAL.h" #include "ZGlobals.h" #include "AF.h" #include "aps_groups.h" #include "ZDApp.h" #include "SampleApp.h" #include "OnBoard.h" /* HAL */ #include "hal_lcd.h" #include "hal_led.h" #include "hal_key.h" //#include "hal_uart.h" #include "MT_UART.h" //此处用于串口 #include "MT.h" #include "DHT11.h" //温湿度专用 /********************************************************************* * MACROS */ #define AIR P2_0 //光敏传感器检测引脚 /* #define RELAY_1_PIN P1_0 #define RELAY_2_PIN P1_2 #define RELAY_3_PIN P2_0 #define RELAY_4_PIN P1_6 */ /********************************************************************* * CONSTANTS */ /********************************************************************* * TYPEDEFS */ /********************************************************************* * GLOBAL VARIABLES */ // This list should be filled with Application specific Cluster IDs. const cId_t SampleApp_ClusterList[SAMPLEAPP_MAX_CLUSTERS] = { SAMPLEAPP_DHT11_CLUSTERID, }; const SimpleDescriptionFormat_t SampleApp_SimpleDesc = { SAMPLEAPP_ENDPOINT, // int Endpoint; SAMPLEAPP_PROFID, // uint16 AppProfId[2]; SAMPLEAPP_DEVICEID, // uint16 AppDeviceId[2]; SAMPLEAPP_DEVICE_VERSION, // int AppDevVer:4; SAMPLEAPP_FLAGS, // int AppFlags:4; SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters; (cId_t *)SampleApp_ClusterList, // uint8 *pAppInClusterList; SAMPLEAPP_MAX_CLUSTERS, // uint8 AppNumInClusters; (cId_t *)SampleApp_ClusterList // uint8 *pAppInClusterList; }; // This is the Endpoint/Interface description. It is defined here, but // filled-in in SampleApp_Init(). Another way to go would be to fill // in the structure here and make it a "const" (in code space). The // way it's defined in this sample app it is define in RAM. endPointDesc_t SampleApp_epDesc; /********************************************************************* * EXTERNAL VARIABLES */ /********************************************************************* * EXTERNAL FUNCTIONS */ /********************************************************************* * LOCAL VARIABLES */ uint8 SampleApp_TaskID; // Task ID for internal task/event processing // This variable will be received when // SampleApp_Init() is called. devStates_t SampleApp_NwkState; uint8 SampleApp_TransID; // This is the unique message ID (counter) afAddrType_t SampleApp_SensorGw_DstAddr,SampleApp_SensorCtl_DstAddr; uint8 shakeFlag = 0; int tianjiazhiwen; int denglu; uint8 usr_num; /********************************************************************* * LOCAL FUNCTIONS */ void SampleApp_HandleKeys( uint8 shift, uint8 keys ); void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pckt ); void SampleApp_SensorMessage( void ); void SampleApp_SendSensorCmd( uint8 enable ); void SerialCallback( uint8 port, uint8 events ); void UartSendNum( uint8 x ); void SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg); /********************************************************************* * NETWORK LAYER CALLBACKS */ /********************************************************************* * PUBLIC FUNCTIONS */ /********************************************************************* * @fn SampleApp_Init * * @brief Initialization function for the Generic App Task. * This is called during initialization and should contain * any application specific initialization (ie. hardware * initialization/setup, table initialization, power up * notificaiton ... ). * * @param task_id - the ID assigned by OSAL. This ID should be * used to send messages and set timers. * * @return none */ void SampleApp_Init( uint8 task_id ) { tianjiazhiwen = 0; denglu = 1; usr_num = 0x00; SampleApp_TaskID = task_id; SampleApp_NwkState = DEV_INIT; SampleApp_TransID = 0; //串口初始化 MT_UartInit();//串口初始化 MT_UartRegisterTaskID(task_id);//登记任务号 // Setup for the periodic message's destination address SampleApp_SensorCtl_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;//Ctl采用广播形式 协调器发送信息给终端 SampleApp_SensorCtl_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_SensorCtl_DstAddr.addr.shortAddr = 0xFFFF; SampleApp_SensorGw_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;//Gw采用点播 终端发送信息给协调器 SampleApp_SensorGw_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_SensorGw_DstAddr.addr.shortAddr = 0; //发送到协调器 // Fill out the endpoint description. SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_epDesc.task_id = &SampleApp_TaskID; SampleApp_epDesc.simpleDesc = (SimpleDescriptionFormat_t *)&SampleApp_SimpleDesc; SampleApp_epDesc.latencyReq = noLatencyReqs; // Register the endpoint description with the AF afRegister( &SampleApp_epDesc ); // Register for all key events - This app will handle all key events RegisterForKeys( SampleApp_TaskID ); //IO Init P20 P06 //P0SEL &= ~0X40; //P0DIR &= ~0X40; //P0INP |= 0X40; //P2SEL &= ~0X01; //P2DIR &= ~0X01; //P2INP &= ~0x01; //IO Init P13 P15 /* P1SEL &= ~0x45; // 0:GPIO P1DIR |= 0x45; // 0:input 1:output P2SEL &= ~0x01; // 0:GPIO P2DIR |= 0x01; // 0:input 1:output P1_0 = 1; P1_2 = 1; P2_0 = 1; P1_6 = 1;*/ P2SEL &= ~0X01; //设置P2.0为普通IO口 P2DIR &= ~0X01; // 在P2.0口,设置为输入模式 P2INP &= ~0x01; //打开P2.0上拉电阻 } /********************************************************************* * @fn SampleApp_ProcessEvent * * @brief Generic Application Task event processor. This function * is called to process all events for the task. Events * include timers, messages and any other user defined events. * * @param task_id - The OSAL assigned task ID. * @param events - events to process. This is a bit map and can * contain more than one event. * * @return none */ uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ) { afIncomingMSGPacket_t *MSGpkt; (void)task_id; // Intentionally unreferenced parameter if ( events & SYS_EVENT_MSG ) { MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID ); while ( MSGpkt ) { switch ( MSGpkt->hdr.event ) { case CMD_SERIAL_MSG: //串口收到数据后由MT_UART层传递过来的数据,用网蜂方法接收,编译时不定义MT相关内容 { SampleApp_SerialCMD((mtOSALSerialData_t *)MSGpkt); break; } case KEY_CHANGE: { SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys ); break; } case AF_INCOMING_MSG_CMD: { SampleApp_MessageMSGCB( MSGpkt ); break; } case ZDO_STATE_CHANGE: //联网 { SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status); if (SampleApp_NwkState == DEV_ZB_COORD)//协调器联网 { HalLcdWriteString( "Coordinate Start", HAL_LCD_LINE_1 ); //osal_start_timerEx( SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,1000 ); } else if(SampleApp_NwkState == DEV_END_DEVICE) //终端联网 { //HalLcdWriteString( "EndDevice Success to join the network", HAL_LCD_LINE_1 ); uint8 usr_cmd[8] = {0xF5, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xF5};//用户比对1:N HalUARTWrite(0,usr_cmd,8); } break; } default: { break; } } // Release the memory osal_msg_deallocate( (uint8 *)MSGpkt ); // Next - if one is available MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID ); } // return unprocessed events return (events ^ SYS_EVENT_MSG); } /*if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) { //读取传感器并发送 //SampleApp_SendPeriodicMessage(); DHT11(); //温度检测 uint8 T_H[4];//温湿度 T_H[0]=wendu_shi+48; T_H[1]=wendu_ge%10+48; T_H[2]=shidu_shi+48; T_H[3]=shidu_ge%10+48; AF_DataRequest( &SampleApp_SensorGw_DstAddr, &SampleApp_epDesc, //点播发送 SAMPLEAPP_DHT11_CLUSTERID, 4, T_H, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) ); // return unprocessed events return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT); }*/ /* if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) { // Send the periodic message //SampleApp_SendPeriodicMessage();//周期性发送函数 //SampleApp_SendPointToPointMessage();//此处替换成点播函数 uint8 L; if(AIR == 1) { L=1; HalUARTWrite(0,"Got bad Air\n",12); //串口 } else { L=0; HalUARTWrite(0,"No bad Air\n",11); //串口 } AF_DataRequest( &SampleApp_SensorGw_DstAddr, &SampleApp_epDesc, //点播发送 SAMPLEAPP_SHAKE_CLUSTERID, 1, &L, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); // Setup to send message again in normal period (+ a little jitter) osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) ); // return unprocessed events return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT); }*/ return 0; } void SampleApp_HandleKeys( uint8 shift, uint8 keys ) //按键处理 { (void)shift; // Intentionally unreferenced parameter if (SampleApp_NwkState == DEV_END_DEVICE)//协调器按键处理 { if ( keys & HAL_KEY_SW_1 ) { } if ( keys & HAL_KEY_SW_2 ) //按键S2处理 增加用户 { uint8 usr_cmd[8] = {0xF5, 0x09, 0x00, 0x00, 0x00, 0x00, 0x09, 0xF5};//查看用户数量 tianjiazhiwen = 1; //uint8 usr_cmd[8] = {0xF5, 0x05, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF5};//清除数据 //uint8 usr_cmd[8] = {0xF5, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xF5};//用户比对1:N HalUARTWrite(0,usr_cmd,8); } } } void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) //消息处理函数 { //HalUARTWrite(0,"Receive: \n",10); switch ( pkt->clusterId ) { case SAMPLEAPP_DHT11_CLUSTERID: //dht11 { //***********温度打印*************** //HalUARTWrite(0,"Temp is:",8); //提示接收到数据 // HalUARTWrite(0,&pkt->cmd.Data[0],2); //温度 // HalUARTWrite(0,"\n",1); // 回车换行 //***************湿度打印**************** // HalUARTWrite(0,"Humidity is:",12); //提示接收到数据 // HalUARTWrite(0,&pkt->cmd.Data[2],2); //湿度 // HalUARTWrite(0,"\n",1); // 回车换行 //****************与arm通讯***************** uchar zigbee[11]; zigbee[0] = 'F'; zigbee[1] = 'D'; zigbee[2] = 0x01; zigbee[3] = (pkt->cmd.Data[0]-48)*10 + pkt->cmd.Data[1]-48; zigbee[4] = 'E'; zigbee[5] = 'F'; zigbee[6] = 'D'; zigbee[7] = 0x02; zigbee[8] = (pkt->cmd.Data[2]-48)*10 + pkt->cmd.Data[3]-48; zigbee[9] = 'E'; HalUARTWrite(0,zigbee,11); break; } /*case SAMPLEAPP_LED_CLUSTERID: //LED AND FAN { HalUARTWrite(0,"get led cmd:",12); HalUARTWrite(0,pkt->cmd.Data,11); if(pkt->cmd.Data[2] == '0')//led1_open { HalUARTWrite(0,"get cmd 100\n",12); RELAY_1_PIN = 0; } if(pkt->cmd.Data[2] == '1')//led1_close { HalUARTWrite(0,"get cmd 101\n",12); RELAY_1_PIN = 1; } if(pkt->cmd.Data[2] == '2')//led2_open { HalUARTWrite(0,"get cmd 102\n",12); RELAY_2_PIN = 0; } if(pkt->cmd.Data[2] == '3')//led2_close { HalUARTWrite(0,"get cmd 103\n",12); RELAY_2_PIN = 1; } if(pkt->cmd.Data[2] == '4')//led3_open { HalUARTWrite(0,"get cmd 104\n",12); RELAY_3_PIN = 0; } if(pkt->cmd.Data[2] == '5')//led4_close { HalUARTWrite(0,"get cmd 105\n",12); RELAY_3_PIN = 1; } if(pkt->cmd.Data[2] == '6')//fan_open { HalUARTWrite(0,"get cmd 106\n",12); RELAY_4_PIN = 0; } if(pkt->cmd.Data[2] == '7' )//fan_close { HalUARTWrite(0,"get cmd 107\n",12); RELAY_4_PIN = 1; } break; }*/ case SAMPLEAPP_AIR_CLUSTERID: { 17b72 if(pkt->cmd.Data[0]) { //HalUARTWrite(0,"Got bad Air\n",12); //有烟雾 //****************与arm通讯***************** uchar zigbee[11]; zigbee[0] = 'F'; zigbee[1] = 'D'; zigbee[2] = 0x04; zigbee[3] = 'B'; zigbee[4] = 'E'; HalUARTWrite(0,zigbee,11); } else { //HalUARTWrite(0,"No bad Air\n",11); //无烟雾 //****************与arm通讯***************** uchar zigbee[11]; zigbee[0] = 'F'; zigbee[1] = 'D'; zigbee[2] = 0x04; zigbee[3] = 'A'; zigbee[4] = 'E'; HalUARTWrite(0,zigbee,11); } break; } case SAMPLEAPP_SHAKE_CLUSTERID: { if(pkt->cmd.Data[0]) { //HalUARTWrite(0,"Got bad Air\n",12); //有紫外线 //****************与arm通讯***************** uchar zigbee[11]; zigbee[0] = 'F'; zigbee[1] = 'D'; zigbee[2] = 0x03; zigbee[3] = 'B'; zigbee[4] = 'E'; HalUARTWrite(0,zigbee,11); } else { //HalUARTWrite(0,"No bad Air\n",11); //无紫外线 //****************与arm通讯***************** uchar zigbee[11]; zigbee[0] = 'F'; zigbee[1] = 'D'; zigbee[2] = 0x03; zigbee[3] = 'A'; zigbee[4] = 'E'; HalUARTWrite(0,zigbee,11); } break; } case SAMPLEAPP_FINGER_CLUSTERID: { if(pkt->cmd.Data[0] == 'F' && pkt->cmd.Data[1] == 'D') { HalUARTWrite(0,pkt->cmd.Data,11); } else if(pkt->cmd.Data[0] == '2' && pkt->cmd.Data[2] == '0')//denglu { //HalUARTWrite(0,"get cmd 200\n",12); denglu = 0; uint8 usr_cmd[8] = {0xF5, 0x09, 0x00, 0x00, 0x00, 0x00, 0x09, 0xF5};//查看用户数量 HalUARTWrite(0,usr_cmd,8); } else if(pkt->cmd.Data[0] == '2' && pkt->cmd.Data[2] == '1')//add zhiwen { tianjiazhiwen = 1; uint8 usr_cmd[8] = {0xF5, 0x09, 0x00, 0x00, 0x00, 0x00, 0x09, 0xF5};//查看用户数量 //uint8 usr_cmd[8] = {0xF5, 0x05, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF5};//清除数据 //uint8 usr_cmd[8] = {0xF5, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xF5};//用户比对1:N HalUARTWrite(0,usr_cmd,8); } else if(pkt->cmd.Data[0] == '2' && pkt->cmd.Data[2] == '2')//del zhiwen { //uint8 usr_cmd[8] = {0xF5, 0x09, 0x00, 0x00, 0x00, 0x00, 0x09, 0xF5};//查看用户数量 uint8 usr_cmd[8] = {0xF5, 0x05, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF5};//清除数据 HalUARTWrite(0,usr_cmd,8); } else if(pkt->cmd.Data[0] == '2' && pkt->cmd.Data[2] == '3')//del zhiwen { tianjiazhiwen = 0; uint8 usr_cmd[8] = {0xF5, 0x09, 0x00, 0x00, 0x00, 0x00, 0x09, 0xF5};//查看用户数量 HalUARTWrite(0,usr_cmd,8); } else if(pkt->cmd.Data[0] == '2' && pkt->cmd.Data[2] == '4')//del zhiwen { uint8 usr_cmd[8] = {0xF5, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xF5};//用户比对1:N HalUARTWrite(0,usr_cmd,8); } else if(pkt->cmd.Data[0] == '2' && pkt->cmd.Data[2] == '5')//restart { tianjiazhiwen = 0; denglu = 1; uint8 usr_cmd[8] = {0xF5, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xF5};//用户比对1:N HalUARTWrite(0,usr_cmd,8); } else if(pkt->cmd.Data[0] == 0xF5) { HalUARTWrite(0,pkt->cmd.Data,8); } else { uint8 zigbee_error[4] = {0xFF, 0xFF, 0xFF, 0xFF}; HalUARTWrite(0,zigbee_error,4); } break; } default: { break; } } } /********************************************************************* * @fn SampleApp_SensorMessage * * @brief Send the sensor message. * * @param none * * @return none */ void SampleApp_SensorMessage( void )//终端发送消息 { } /********************************************************************* * @fn SampleApp_SendSensorCmd * * @brief Send the sensor cmd. * * @param none * * @return none */ void SampleApp_SendSensorCmd( uint8 enable ) //协调器发送消息 { if(enable == 1) { HalUARTWrite(0,"#2\n",3); AF_DataRequest( &SampleApp_SensorCtl_DstAddr, &SampleApp_epDesc, //广播发送 SAMPLEAPP_RELAY_CLUSTERID, 1, (uint8*)&enable, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); HalUARTWrite(0,"send GDQ cmd\n",12); } else if(enable == 2) { AF_DataRequest( &SampleApp_SensorCtl_DstAddr, &SampleApp_epDesc, //广播发送 SAMPLEAPP_DHT11_CLUSTERID, 1, (uint8*)&enable, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); HalUARTWrite(0,"send DHT11 cmd\n",15); } else { HalUARTWrite(0,"unknown enable\n",15); } } /********************************************************************* *********************************************************************/ void SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg)//串口接收 { uint8 i,len,*str=NULL; //len有用数据长度 str=cmdMsg->msg; //指向数据开头 len=*str; //msg里的第1个字节代表后面的数据长度 uint8 cmd [11]; for(i=1;i<=len;i++) { cmd[i - 1] = *(str + i); //HalUARTWrite(0,&cmd[i - 1],1); } if(cmd[0] == '1' && SampleApp_NwkState == DEV_ZB_COORD) { AF_DataRequest( &SampleApp_SensorCtl_DstAddr, &SampleApp_epDesc, //广播发送 SAMPLEAPP_LED_CLUSTERID, 11, (uint8*)&cmd, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); HalUARTWrite(0,"send led cmd\n",12); } if(cmd[0] == '2' && SampleApp_NwkState == DEV_ZB_COORD) { AF_DataRequest( &SampleApp_SensorCtl_DstAddr, &SampleApp_epDesc, //广播发送 SAMPLEAPP_FINGER_CLUSTERID, 11, (uint8*)&cmd, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); HalUARTWrite(0,"send finger cmd\n",12); HalUARTWrite(0,cmd,11); } if(SampleApp_NwkState == DEV_END_DEVICE) { AF_DataRequest( &SampleApp_SensorGw_DstAddr, &SampleApp_epDesc, //点播发送调试信息 SAMPLEAPP_FINGER_CLUSTERID, 8, cmd, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); } if(tianjiazhiwen == 1 && cmd[0] == 0xF5 && cmd[1] == 0x05 && cmd[4] == 0x00 && cmd[7] == 0xF5 && SampleApp_NwkState == DEV_END_DEVICE)//检查成功清除数据 { uchar zigbee[11]; zigbee[0] = 'F'; zigbee[1] = 'D'; zigbee[2] = 0x09; zigbee[3] = 'A'; zigbee[4] = 'E'; AF_DataRequest( &SampleApp_SensorGw_DstAddr, &SampleApp_epDesc, //点播发送 SAMPLEAPP_FINGER_CLUSTERID, 11, zigbee, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); } if(cmd[0] == 0xF5 && cmd[1] == 0x09 && cmd[4] == 0x00 && cmd[7] == 0xF5 && SampleApp_NwkState == DEV_END_DEVICE)//第一次添加指纹 { uchar zigbee[11]; zigbee[0] = 'F'; zigbee[1] = 'D'; zigbee[2] = 0x0A; zigbee[3] = cmd[3]; zigbee[4] = 'E'; AF_DataRequest( &SampleApp_SensorGw_DstAddr, &SampleApp_epDesc, //点播发送 SAMPLEAPP_FINGER_CLUSTERID, 11, zigbee, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); if(tianjiazhiwen == 1) { usr_num = cmd[3] + 1; uint8 usr_cmd[8] = {0xF5, 0x01, 0x00, usr_num, 0x01, 0x00, 0x01^usr_num^0x01, 0xF5}; AF_DataRequest( &SampleApp_SensorGw_DstAddr, &SampleApp_epDesc, //点播发送调试信息 SAMPLEAPP_FINGER_CLUSTERID, 8, usr_cmd, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); HalUARTWrite(0,usr_cmd,8); } } if(tianjiazhiwen == 1 && cmd[0] == 0xF5 && cmd[4] == 0x07 && cmd[7] == 0xF5 && SampleApp_NwkState == DEV_END_DEVICE)//指纹已存在 { tianjiazhiwen = 0; uchar zigbee[11]; zigbee[0] = 'F'; zigbee[1] = 'D'; zigbee[2] = 0x08; zigbee[3] = 'A'; zigbee[4] = 'E'; AF_DataRequest( &SampleApp_SensorGw_DstAddr, &SampleApp_epDesc, //点播发送 SAMPLEAPP_FINGER_CLUSTERID, 11, zigbee, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); //uint8 usr_cmd[8] = {0xF5, 0x09, 0x00, 0x00, 0x00, 0x00, 0x09, 0xF5};//查看用户数量 //HalUARTWrite(0,usr_cmd,8); } if(tianjiazhiwen == 1 && cmd[0] == 0xF5 && cmd[1] == 0x01 && cmd[4] == 0x00 && cmd[7] == 0xF5 && SampleApp_NwkState == DEV_END_DEVICE)//第2次添加指纹 { uint8 usr_cmd[8] = {0xF5, 0x02, 0x00, usr_num, 0x01, 0x00, 0x02^usr_num^0x01, 0xF5}; AF_DataRequest( &SampleApp_SensorGw_DstAddr, &SampleApp_epDesc, //点播发送调试信息 SAMPLEAPP_FINGER_CLUSTERID, 8, usr_cmd, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); HalUARTWrite(0,usr_cmd,8); } if(tianjiazhiwen == 1 && cmd[0] == 0xF5 && cmd[1] == 0x02 && cmd[4] == 0x00 && cmd[7] == 0xF5 && SampleApp_NwkState == DEV_END_DEVICE)//第3次添加指纹 { uint8 usr_cmd[8] = {0xF5, 0x03, 0x00, usr_num, 0x01, 0x00, 0x03^usr_num^0x01, 0xF5}; AF_DataRequest( &SampleApp_SensorGw_DstAddr, &SampleApp_epDesc, //点播发送调试信息 SAMPLEAPP_FINGER_CLUSTERID, 8, usr_cmd, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); HalUARTWrite(0,usr_cmd,8); } if(tianjiazhiwen == 1 && cmd[0] == 0xF5 && cmd[1] == 0x03 && cmd[4] == 0x00 && cmd[7] == 0xF5 && SampleApp_NwkState == DEV_END_DEVICE)//验证指纹录入成功 { tianjiazhiwen = 0; uchar zigbee[11]; zigbee[0] = 'F'; zigbee[1] = 'D'; zigbee[2] = 0x07; zigbee[3] = 'A'; zigbee[4] = 'E'; AF_DataRequest( &SampleApp_SensorGw_DstAddr, &SampleApp_epDesc, //点播发送 SAMPLEAPP_FINGER_CLUSTERID, 11, zigbee, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); } if(cmd[0] == 0xF5 && cmd[1] == 0x0C && cmd[4] == 0x01 && cmd[7] == 0xF5 && SampleApp_NwkState == DEV_END_DEVICE)//用户比对1:N 指纹校对成功 { uchar zigbee[11]; if(denglu == 1)//登陆界面识别指纹 向arm发送消息 { denglu = 0; zigbee[0] = 'F'; zigbee[1] = 'D'; zigbee[2] = 0x05; zigbee[3] = 'A'; zigbee[4] = 'E'; } else //主界面识别指纹 向arm发送消息 { zigbee[0] = 'F'; zigbee[1] = 'D'; zigbee[2] = 0x06; zigbee[3] = 'A'; zigbee[4] = 'E'; } AF_DataRequest( &SampleApp_SensorGw_DstAddr, &SampleApp_epDesc, //点播发送 SAMPLEAPP_FINGER_CLUSTERID, 11, zigbee, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); } if(cmd[0] == 0xF5 && cmd[1] == 0x0C && cmd[4] == 0x05 && cmd[7] == 0xF5 && SampleApp_NwkState == DEV_END_DEVICE)//用户比对1:N 指纹校对error { uchar zigbee[11]; if(denglu == 1)//登陆界面重新识别指纹 向arm发送消息 { uint8 usr_cmd[8] = {0xF5, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xF5};//用户比对1:N HalUARTWrite(0,usr_cmd,8); zigbee[0] = 'F'; zigbee[1] = 'D'; zigbee[2] = 0x05; zigbee[3] = 'B'; zigbee[4] = 'E'; } else //主界面未能识别指纹 向arm发送消息 { zigbee[0] = 'F'; zigbee[1] = 'D'; zigbee[2] = 0x06; zigbee[3] = 'B'; zigbee[4] = 'E'; } AF_DataRequest( &SampleApp_SensorGw_DstAddr, &SampleApp_epDesc, //点播发送 SAMPLEAPP_FINGER_CLUSTERID, 11, zigbee, &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ); } }
SampleApp.h
/************************************************************************************************** Filename: SampleApp.h Revised: $Date: 2007-10-27 17:22:23 -0700 (Sat, 27 Oct 2007) $ Revision: $Revision: 15795 $ Description: This file contains the Sample Application definitions. Copyright 2007 Texas Instruments Incorporated. All rights reserved. IMPORTANT: Your use of this Software is limited to those specific rights granted under the terms of a software license agreement between the user who downloaded the software, his/her employer (which must be your employer) and Texas Instruments Incorporated (the "License"). You may not use this Software unless you agree to abide by the terms of the License. The License limits your use, and you acknowledge, that the Software may not be modified, copied or distributed unless embedded on a Texas Instruments microcontroller or used solely and exclusively in conjunction with a Texas Instruments radio frequency transceiver, which is integrated into your product. Other than for the foregoing purpose, you may not use, reproduce, copy, prepare derivative works of, modify, distribute, perform, display or sell this Software and/or its documentation for any purpose. YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED 揂S IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. Should you have any questions regarding your right to use this Software, contact Texas Instruments Incorporated at www.TI.com. **************************************************************************************************/ #ifndef SAMPLEAPP_H #define SAMPLEAPP_H #ifdef __cplusplus extern "C" { #endif /********************************************************************* * INCLUDES */ #include "ZComDef.h" /********************************************************************* * CONSTANTS */ // These constants are only for example and should be changed to the // device's needs #define SAMPLEAPP_ENDPOINT 20 #define SAMPLEAPP_PROFID 0x0F08 #define SAMPLEAPP_DEVICEID 0x0001 #define SAMPLEAPP_DEVICE_VERSION 0 #define SAMPLEAPP_FLAGS 0 #define SAMPLEAPP_MAX_CLUSTERS 1 #define SAMPLEAPP_DHT11_CLUSTERID 10 #define SAMPLEAPP_LIGHT_CLUSTERID 11 #define SAMPLEAPP_AIR_CLUSTERID 12 #define SAMPLEAPP_LED_CLUSTERID 13 #define SAMPLEAPP_FIRE_CLUSTERID 14 #define SAMPLEAPP_SHAKE_CLUSTERID 15 #define SAMPLEAPP_IR_CLUSTERID 16 #define SAMPLEAPP_BEEP_CLUSTERID 17 #define SAMPLEAPP_RELAY_CLUSTERID 18 #define SAMPLEAPP_FINGER_CLUSTERID 19 // Send Message Timeout #define SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT 1000 // Every 1 seconds // Application Events (OSAL) - These are bit weighted definitions. #define SAMPLEAPP_SEND_PERIODIC_MSG_EVT 0x0001 // Group ID for Flash Command #define SAMPLEAPP_FLASH_GROUP 0x0001 // Flash Command Duration - in milliseconds #define SAMPLEAPP_FLASH_DURATION 1000 /********************************************************************* * MACROS */ /********************************************************************* * FUNCTIONS */ /* * Task Initialization for the Generic Application */ extern void SampleApp_Init( uint8 task_id ); /* * Task Event Processor for the Generic Application */ extern UINT16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ); /********************************************************************* *********************************************************************/ #ifdef __cplusplus } #endif #endif /* SAMPLEAPP_H */
DHT11.c
#include <ioCC2530.h> #include "OnBoard.h" #define uint unsigned int #define uchar unsigned char #define wenshi P0_6 /*******函数声明*********/ void Delay_us(void); //1 us延时 void Delay_10us(void); //10 us延时 void Delay_ms(uint Time);//n ms延时 void COM(void); // 温湿写入 void DHT11(void) ; //温湿传感启动 //温湿度定义 uchar ucharFLAG,uchartemp; uchar shidu_shi,shidu_ge,wendu_shi,wendu_ge=4; uchar ucharT_data_H,ucharT_data_L,ucharRH_data_H,ucharRH_data_L,ucharcheckdata; uchar ucharT_data_H_temp,ucharT_data_L_temp,ucharRH_data_H_temp,ucharRH_data_L_temp,ucharcheckdata_temp; uchar ucharcomdata; uchar temp[2]={0,0}; uchar temp1[5]="temp="; uchar humidity[2]={0,0}; uchar humidity1[9]="humidity="; /**************************** 延时函数 *****************************/ void Delay_us() //1 us延时 { MicroWait(1); } void Delay_10us() //10 us延时 { MicroWait(10); } void Delay_ms(uint Time)//n ms延时 { unsigned char i; while(Time--) { for(i=0;i<100;i++) Delay_10us(); } } /*********************** 温湿度传感 ***********************/ void COM(void) // 温湿写入 { uchar i; for(i=0;i<8;i++) { ucharFLAG=2; while((!wenshi)&&ucharFLAG++); Delay_10us(); Delay_10us(); Delay_10us(); uchartemp=0; if(wenshi)uchartemp=1; ucharFLAG=2; while((wenshi)&&ucharFLAG++); if(ucharFLAG==1)break; ucharcomdata<<=1; ucharcomdata|=uchartemp; } } void DHT11(void) //温湿传感启动 { wenshi=0; Delay_ms(19); //>18MS wenshi=1; P0DIR &= ~0x40; //重新配置IO口方向 Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); if(!wenshi) { ucharFLAG=2; while((!wenshi)&&ucharFLAG++); ucharFLAG=2; while((wenshi)&&ucharFLAG++); COM(); ucharRH_data_H_temp=ucharcomdata; COM(); ucharRH_data_L_temp=ucharcomdata; COM(); ucharT_data_H_temp=ucharcomdata; COM(); ucharT_data_L_temp=ucharcomdata; COM(); ucharcheckdata_temp=ucharcomdata; wenshi=1; uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_temp+ucharRH_data_L_temp); if(uchartemp==ucharcheckdata_temp) { ucharRH_data_H=ucharRH_data_H_temp; ucharRH_data_L=ucharRH_data_L_temp; ucharT_data_H=ucharT_data_H_temp; ucharT_data_L=ucharT_data_L_temp; ucharcheckdata=ucharcheckdata_temp; } wendu_shi=ucharT_data_H/10; wendu_ge=ucharT_data_H%10; shidu_shi=ucharRH_data_H/10; shidu_ge=ucharRH_data_H%10; } else //没用成功读取,返回0 { wendu_shi=0; wendu_ge=0; shidu_shi=0; shidu_ge=0; } P0DIR |= 0x40; //IO口需要重新配置 }
DTH11.h
#ifndef __DHT11_H__ #define __DHT11_H__ #define uchar unsigned char extern void Delay_ms(unsigned int xms); //延时函数 extern void COM(void); // 温湿写入 extern void DHT11(void); //温湿传感启动 extern uchar temp[2]; extern uchar temp1[5]; extern uchar humidity[2]; extern uchar humidity1[9]; extern uchar shidu_shi,shidu_ge,wendu_shi,wendu_ge; #endif
上面主要是指纹模块通讯和DHT11部分
继电器和其他的一部分需修改一下代码 把注释部分去掉
此外需要注意的地方 和ARM通讯的时候需要修改协议栈串口部分的波特率115200和交叉线设置为false
修改串口接收函数
void MT_UartProcessZToolData ( uint8 port, uint8 event )用的是网蜂提供的代码
void MT_UartProcessZToolData ( uint8 port, uint8 event ) { uint8 flag=0,i,j=0; //flag是判断有没有收到数据,j记录数据长度 uint8 buf[128]; //串口buffer最大缓冲默认是128,我们这里用128. (void)event; // Intentionally unreferenced parameter while (Hal_UART_RxBufLen(port)) //检测串口数据是否接收完成 { HalUARTRead (port,&buf[j], 1); //把数据接收放到buf中 j++; //记录字符数 flag=1; //已经从串口接收到信息 } if(flag==1) //已经从串口接收到信息 { /* Allocate memory for the data */ //分配内存空间,为机构体内容+数据内容+1个记录长度的数据 pMsg = (mtOSALSerialData_t *)osal_msg_allocate( sizeof ( mtOSALSerialData_t )+j+1); //事件号用原来的CMD_SERIAL_MSG pMsg->hdr.event = CMD_SERIAL_MSG; pMsg->msg = (uint8*)(pMsg+1); // 把数据定位到结构体数据部分 pMsg->msg [0]= j; //给上层的数据第一个是长度 for(i=0;i<j;i++) //从第二个开始记录数据 pMsg->msg [i+1]= buf[i]; osal_msg_send( App_TaskID, (byte *)pMsg ); //登记任务,发往上层 /* deallocate the msg */ osal_msg_deallocate ( (uint8 *)pMsg ); //释放内存 } }
最后来一张全家福照片
相关文章推荐
- 实验室智能管理系统(3)——zigbee部分
- 实验室智能管理系统(3)——zigbee部分
- 实验室智能管理系统(3)——zigbee部分
- 实验室智能管理系统(3)——zigbee部分
- 实验室智能管理系统(3)——zigbee部分
- 实验室智能管理系统(3)——zigbee部分
- 实验室智能管理系统(3)——zigbee部分
- 实验室智能管理系统(2)——Arm+QT部分(二)
- 实验室智能管理系统(2)——Arm+QT部分(二)
- 实验室智能管理系统(2)——Arm+QT部分(一)
- 实验室智能管理系统(2)——Arm+QT部分(一)
- 实验室智能管理系统(2)——Arm+QT部分(二)
- 实验室智能管理系统(2)——Arm+QT部分(一)
- 实验室智能管理系统(2)——Arm+QT部分(一)
- 实验室智能管理系统(2)——Arm+QT部分(二)
- 实验室智能管理系统(2)——Arm+QT部分(二)
- 实验室智能管理系统(2)——Arm+QT部分(二)
- 实验室智能管理系统(2)——Arm+QT部分(一)
- 实验室智能管理系统(2)——Arm+QT部分(一)
- 实验室智能管理系统(2)——Arm+QT部分(二)