想实现显示温湿度,并且在温度大于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;
}
}
/*********************************************************************
*********************************************************************/