[求助] z-stack问什么不能显示温度的变化

Devill流觞   2016-7-3 18:24 楼主
想实现显示温湿度,并且在温度大于28的时候报警,现在温湿度显示不出来,请帮我看看怎么一回事的,谢谢
/***************************************************************************************************************
* 文 件 名:GenericApp.c
×
* 功    能:   GenericApp用户应用层处理文件,本实验的应用工程可以作为用户开发模板,用户只需要对
*          本工程进行复制和简单的修改,就可以作为用户应用的开发工程。
*           
*               *               本实验的按键功能:
*                     SW1:启动终端设备绑定
*                     SW2:启动匹配描述符请求
*                     
*                       
*
* 注    意:本实验所需硬件资源
*             1、OURS-CC2530RF板3块
*             2、带LCD的智能主板2块和电源板1块         
*           
*
* 版    本:V1.0
* 作    者:WU XIANHAI
* 日    期:2011.2.28
* 奥尔斯电子主页:www.ourselec.com
******************************************************************************************************************/

#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include "hal.h"//添加
#include "GenericApp.h"
#include "DebugTrace.h"
#include "IIC.h"
#if !defined( WIN32 )
  #include "OnBoard.h"
#endif
/* HAL */
#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.h"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#define SB_POWER  P1_3
#define OPEN      1
uint8 Menu1 = 0;
#define HAL_ADC_CHANNEL_0          0x00
#define HAL_ADC_RESOLUTION_14      0x04
#define CLOUSE    0
uint8 FunctionSave = 0;
//输入/输出簇ID列表
const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS] =
{
  GENERICAPP_CLUSTERID
    ,LED_CLUSTERID//添加
};
const SimpleDescriptionFormat_t GenericApp_SimpleDesc =
{
  GENERICAPP_ENDPOINT,              //  int    端口号
  GENERICAPP_PROFID,                //  uint16 Profile ID
  GENERICAPP_DEVICEID,              //  uint16 设备 ID
  GENERICAPP_DEVICE_VERSION,        //  int    设备版本
  GENERICAPP_FLAGS,                 //  int    程序标识
  GENERICAPP_MAX_CLUSTERS,          //  byte   输入命令数
  (cId_t *)GenericApp_ClusterList,  //  byte   输入命令列表地址
  GENERICAPP_MAX_CLUSTERS,          //  byte   输出命令数
  (cId_t *)GenericApp_ClusterList   //  byte   输出命令列表地址
};
endPointDesc_t GenericApp_epDesc;   //设备简单描述
byte GenericApp_TaskID;             // 任务ID
                           
devStates_t GenericApp_NwkState;    //设备在网络中的类型

byte GenericApp_TransID;            // 传输信息量计数
afAddrType_t GenericApp_DstAddr;     //发送信息目的地址
/*********************************************************************
* LOCAL FUNCTIONS
*/
void GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg );
void GenericApp_HandleKeys( byte shift, byte keys );
void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );
void GenericApp_SendTheMessage( void );
void Led_SendTheMessage(char ledLight[]);//添加
extern void ctrPCA9554LED(uint8 led,uint8 operation);
extern void ctrPCA9554FLASHLED4(uint8 FLASHnum);
void Litht_Send();//添加
/**************************************************************************************************
* 函数名称:GenericApp_Init
*
* 功能描述:用户应用层任务初始化
*
* 参    数:task_id - 任务ID
*
* 返 回 值:无
**************************************************************************************************/
void GenericApp_Init( byte task_id )//初始化
{
  GenericApp_TaskID = task_id;                                                  //GenericApp任务ID
  GenericApp_NwkState = DEV_INIT;                                               //设置设备所处的网络状态(初始化状态)
  GenericApp_TransID = 0;                                                       //清零传输信息量的计数
  GenericApp_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;                   //配置设备发送方式
  GenericApp_DstAddr.endPoint = 0;
  GenericApp_DstAddr.addr.shortAddr = 0;
  GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT;                             //配置endpoint
  GenericApp_epDesc.task_id = &GenericApp_TaskID;
  GenericApp_epDesc.simpleDesc
            = (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc;
  GenericApp_epDesc.latencyReq = noLatencyReqs;
  afRegister( &GenericApp_epDesc );                                             //注册端口描述符
  RegisterForKeys( GenericApp_TaskID );                                         //注册所有的按键事件
   
  ZDO_RegisterForZDOMsg( GenericApp_TaskID, End_Device_Bind_rsp );              //注册终端设备绑定接收信息事件
  ZDO_RegisterForZDOMsg( GenericApp_TaskID, Match_Desc_rsp );                   //注册启动匹配描述符请求事件
}
/**************************************************************************************************
* 函数名称:GenericApp_ProcessEvent
*
* 功能描述:用户应用层任务处理函数
*
* 参    数:task_id - 任务ID
*           events - 当前需处理的事件
*
* 返 回 值:未处理的事件
**************************************************************************************************/
UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events )
{
  afIncomingMSGPacket_t *MSGpkt;                                                //定义数据包指针
  afDataConfirm_t *afDataConfirm;                                               //定义数据发送确认信息包指针
  byte sentEP;
  ZStatus_t sentStatus;
  byte sentTransID;      
  (void)task_id;  
  if ( events & SYS_EVENT_MSG )                                                 //用户层处理函数的系统事件
  {
    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );    //获取数据信息
    while ( MSGpkt )
    {
      switch ( MSGpkt->hdr.event )
      {
        case ZDO_CB_MSG:                                                        //ZDO层收到新的任务信息回调处理事件
          GenericApp_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );
          break;
         
        case KEY_CHANGE:                                                        //按键事件
          GenericApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
          break;
        case AF_DATA_CONFIRM_CMD:                                               //收到数据包确认事件
          afDataConfirm = (afDataConfirm_t *)MSGpkt;                            //保存数据包信息
          sentEP = afDataConfirm->endpoint;                                     //终端号
          sentStatus = afDataConfirm->hdr.status;                               //状态
          sentTransID = afDataConfirm->transID;                                 //传输ID
          (void)sentEP;
          (void)sentTransID;
          if ( sentStatus != ZSuccess )                                         //判断接收是否成功
          {
            
          }
          break;
        case AF_INCOMING_MSG_CMD:                                               //接收到命令,然后执行。zigbee协议信息的传递有两种方式:消息和命令,消息长度不限,命令的大小则严格规定
          GenericApp_MessageMSGCB( MSGpkt );
          break;
        case ZDO_STATE_CHANGE:                                                  //网络启动信息事件(启动该事件在ZDObject.c中)
          GenericApp_NwkState = (devStates_t)(MSGpkt->hdr.status);              //获取当前网络中设备类型
          if ( (GenericApp_NwkState == DEV_ZB_COORD)
              || (GenericApp_NwkState == DEV_ROUTER)
              || (GenericApp_NwkState == DEV_END_DEVICE) )
          {
            osal_start_timerEx( GenericApp_TaskID,                              //设置发送信息事件(周期性的发送,周期为 GENERICAPP_SEND_MSG_TIMEOUT == 5000ms)                 
                                GENERICAPP_SEND_MSG_EVT,
                              GENERICAPP_SEND_MSG_TIMEOUT );
          }
          break;
        default:
          break;
      }
      osal_msg_deallocate( (uint8 *)MSGpkt );                                   //释放内存
      MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );  //接收下一个事件
    }
    return (events ^ SYS_EVENT_MSG);
  }
  if ( events & GENERICAPP_SEND_MSG_EVT )                                       //发送信息事件
  {
    GenericApp_SendTheMessage();                                                //调用发送信息函数
    osal_start_timerEx( GenericApp_TaskID,                                      //设置下一次发送事件
                        GENERICAPP_SEND_MSG_EVT,
                      GENERICAPP_SEND_MSG_TIMEOUT );
    return (events ^ GENERICAPP_SEND_MSG_EVT);
  }
  return 0;
}
/**************************************************************************************************
* 函数名称:GenericApp_ProcessZDOMsgs
*
* 功能描述:ZDO新的任务信息回调处理函数
*
* 参    数:inMsg - 回调事件
*           
*
* 返 回 值:无
**************************************************************************************************/
void GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg )
{
  switch ( inMsg->clusterID )
  {
    case End_Device_Bind_rsp:                                                   //当收到终端接收按下 joystick right,收到一个End_Device_Bind_rsp的信息触发该事件
      if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )
      {
        ctrPCA9554LED(3,1);                                                    //打开LED3
        GUI_ClearScreen();                                                     //LCD清屏
        GUI_PutString5_7(25,6,"OURS-CC2530");                                  //在LCD上显示相应的文字
        GUI_PutString5_7(27,22,"GenericApp");   
        LCM_Refresh();
      }
      else                                                                      //绑定失败
      {
         ctrPCA9554LED(4,1);                                                     //打开LED4
      }
      break;
    case Match_Desc_rsp:                                                        //获取设备匹配描述信息事件(当按下 joystick left 触发该事件)                                          
      {
        ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );            //得到与之绑定的设备信息
        if ( pRsp )
        {
          if ( pRsp->status == ZSuccess && pRsp->cnt )
          {
            GenericApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;              //设置地址模式      
            GenericApp_DstAddr.addr.shortAddr = pRsp->nwkAddr;                  //得到短地址
            GenericApp_DstAddr.endPoint = pRsp->epList[0];                      //得到第一个终端的端口号
            
            GUI_ClearScreen();                                                     //LCD清屏
            GUI_PutString5_7(25,6,"OURS-CC2530");                                  //在LCD上显示相应的文字
            GUI_PutString5_7(27,22,"GenericApp");   
            LCM_Refresh();
            ctrPCA9554LED(3,1);
          }
          osal_mem_free( pRsp );                                                //释放内存
        }
      }
      break;
  }
}
/**************************************************************************************************
* 函数名称:GenericApp_HandleKeys
*
* 功能描述:按键事件处理函数
*
* 参    数:shift - shift/alt键 该功能基本未使用
*           keys - 输入按键值
*
* 返 回 值:无
**************************************************************************************************/
void GenericApp_HandleKeys( byte shift, byte keys )
{
  zAddrType_t dstAddr;
  
  if ( shift )
  {
    if ( keys & HAL_KEY_SW_1 )
    {
    }
    if ( keys & HAL_KEY_SW_2 )
    {
    }
    if ( keys & HAL_KEY_SW_3 )
    {
    }
    if ( keys & HAL_KEY_SW_4 )
    {
    }
  }
  else
  {
    if ( keys & HAL_KEY_SW_1 )
    {
     ctrPCA9554LED(5,1);
      // Initiate an End Device Bind Request for the mandatory endpoint
      //此处发起绑定请求,等待其他节点应答,而如果有一个节点也按了Joystick右键,同样发出了绑定请求,
      //则本节点收到一个End_Device_Bind_rsp的信息,并在SerialApp_ProcessZDOMsgs函数中进行了处理
      dstAddr.addrMode = Addr16Bit;                                             //使用短地址模式
      dstAddr.addr.shortAddr = 0x0000; // Coordinator                           //设置短地址 (协调器为0x0000)
      ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),                      //请求绑定终端设备
                            GenericApp_epDesc.endPoint,
                            GENERICAPP_PROFID,
                            GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
                            GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
                            FALSE );
    }
    if ( keys & HAL_KEY_SW_2 )                                                  //启动匹配描述符请求
    {
       ctrPCA9554LED(4,1);
      // Initiate a Match Description Request (Service Discovery)
      dstAddr.addrMode = AddrBroadcast;                                         //设置为广播模式
      dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;                         //使用短地址
      ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,                      //请求设备的匹配描述
                        GENERICAPP_PROFID,
                        GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
                        GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList,
                        FALSE );
    }
    if ( keys & HAL_KEY_SW_3 )
    {
     
    }
    if ( keys & HAL_KEY_SW_4 )                                                
    {
   
    }
    if ( keys & HAL_KEY_SW_5 )                                                
    {
    }
    if ( keys & HAL_KEY_SW_6 )                                                
    {
   
    }
  }
}
/**************************************************************************************************
* 函数名称:GenericApp_MessageMSGCB
*
* 功能描述:接收到新的数据信息处理函数
*
* 参    数:pkt - 接收到的信息包
*           
*
* 返 回 值:无
**************************************************************************************************/
uint32 rcvdcount=0;  //用于累计接收到信息的条数
void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
  int tempera;
  int humidity;
  char s[21];
  float num = 0;
  //uint8 message;//添加
  switch ( pkt->clusterId )                                                     //判断簇ID是否符合 (为 1)
  {
    case GENERICAPP_CLUSTERID:
      rcvdcount++;                                                             // 信息条数加一
#if defined( LCD_SUPPORTED )                                                   //显示相关信息
      //sprintf(s,(char *)"temperature %d  ",rcvdcount); //添加                     //将接收信息计数值写入字符串s中(sprintf 把格式化的数据写入某个字符串)
      sprintf(s, (char*)"%d%d C",  ((INT16)((int)tempera / 10)), ((INT16)((int)tempera % 10)));  //将温度结果转换为字符串
      GUI_PutString5_7(43,27,(char *)s);                      //显示结果
       LCM_Refresh();
       sprintf(s, (char*)"%d%d %%",  ((INT16)((int)humidity / 10)), ((INT16)((int)humidity % 10)));//将湿度结果转换为字符串
     GUI_PutString5_7(43,39,(char *)s);                     //显示结果
    LCM_Refresh();
       sprintf(s,(char *)"%d lx ",(UINT16)num);
       LCM_Refresh();
       GUI_PutString5_7(43,51,(char *)s);                    //显示结果
     if (tempera > 28)   
      GUI_PutString5_7(0,35,(char*)s);
      //GUI_PutString5_7(0,44,"                  ");
      //sprintf(s,(char *)"light %d  ",pkt->cmd.Data);
      GUI_PutString5_7(0,44,(char*)pkt->cmd.Data);
      LCM_Refresh();                        
#elif defined( WIN32 )
      WPRINTSTR( pkt->cmd.Data );
#endif
      break;
      //添加
     
  }
}
/**************************************************************************************************
* 函数名称:GenericApp_SendTheMessage
*
* 功能描述:发送数据信息函数
*
* 参    数:无
*           
*
* 返 回 值:无
**************************************************************************************************/
uint32 sendcount=1;  //用于奇偶发送不同字符
void GenericApp_SendTheMessage( void )
{
  /*int8 tvalue;
  TEMPERATURE temperature;
  tvalue=readTemp();
  temperature.BUF.value[0]=tvalue/10+'0';
  temperature.BUF.value[1]=tvalue%10+'0';
  */
  int tempera;
  int humidity;
  char  s[16];
  float num = 0;
  uint8 data[2];
  data[0] = 0x20;
  data[1] = 0x01;
   GUI_ClearScreen();
  GUI_SetColor(1,0);
  GUI_PutString5_7(16,2,"OURS-CC2530 TEST");   //在LCD上显示相应的文字
  GUI_PutString5_7(10,15," H-T-L Board Test ");//在LCD上显示相应的文字
  GUI_PutString5_7(5,27,"Temp:");//在LCD上显示相应的文字
  GUI_PutString5_7(5,39,"Humi:");//在LCD上显示相应的文字
  GUI_PutString5_7(5,51,"Light:");           //在LCD上显示相应的文字
  LCM_Refresh();
  SB_POWER = OPEN;
  if(write24L01(data,0x01,2))
  {
    ctrPCA9554LED(5,1);  
   while(Menu1 == 2)
   {
    th_read(&tempera,&humidity);                            //读取温度和湿度
   sprintf(s, (char*)"%d%d C",  ((INT16)((int)tempera / 10)), ((INT16)((int)tempera % 10)));  //将温度结果转换为字符串
    GUI_PutString5_7(43,27,(char *)s);                      //显示结果
   LCM_Refresh();
   sprintf(s, (char*)"%d%d %%",  ((INT16)((int)humidity / 10)), ((INT16)((int)humidity % 10)));//将湿度结果转换为字符串
    GUI_PutString5_7(43,39,(char *)s);                     //显示结果
    LCM_Refresh();
     num = HalAdcRead (HAL_ADC_CHANNEL_0, HAL_ADC_RESOLUTION_14);   
     num = num*3.3/8192;  //有一位符号位,取2^13;
     num /= 4;         
     num=num*913;
     sprintf(s,(char *)"%d lx ",(UINT16)num);//转换为Lx
     GUI_PutString5_7(43,51,(char *)s);                    //显示结果
     LCM_Refresh();
     if (tempera > 28)                                //判断,蜂鸣器报警
     ctrPCA9554Buzzer(1);
   else                                                 //否则,蜂鸣器不报警
     ctrPCA9554Buzzer(0);
   }
  }
  SB_POWER = CLOUSE;
  ctrPCA9554LED(5,0);
  FunctionSave = 0;
}


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

回复评论 (1)

OSAL不要使用循环,都是单次触发的。
点赞  2016-7-11 14:04
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复