zigbee学习心得——实例分析(温湿度采集及控制)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我这里面只用到了voidwenshi_receive( void );一个函数,然后将函数和其中所用到的两个变量TH,RH,分别代表温度和湿度设为全局变量。
先打开SimpleSensor.c这个小工程,用官方程序调试的时候可以看出,也就是不断地发数据到协调器,自然就要找到与发数据相关的函数:
那其实发送之前要先与协调器绑定吧,好比打电话也要先拨通电话吧。
myApp_StartReporting();
}
else
{
// Continue to discover a collector
osal_start_timerEx( sapi_TaskID, MY_FIND_COLLECTOR_EVT, myBindRetryDelay);
}
}
直接点,若绑定成功,就会返回一个ZB_SUCCESS的状态,此时方会调用myApp_StartReporting();函数,否则就继续搜索节点。
——SAPI_Init( taskID ); /*用户自定义任务函数,他的任务ID为taskID*/ ?——
/*其中的一个等式*/s api_TaskID = task_id;
也就是说可以通过osal_start_timerEx添加一个周期性的任务,其周期为XXXPeriod,比如片内温度采集:myTempReportPeriod,电压测量myBatteryCheckPeriod,那XXXEVT,也就相当于一个任务Task里面一个独立的事件Event了。
osal_start_timerEx(sapi_TaskID, MY_REPORT_WENDU_EVT, myWENDUReportPeriod );
//回调
}
这样子
额,pData[0] = WENDU_REPORT;,既然说这个是要让协调器识别的,那么协调器(SimpleCollectorEB.c)里面也要有相同的参数。
找到与绑定相关的函数:
void zb_BindConfirm( uint16 commandId,uint8 status )
{
if( ( status == ZB_SUCCESS ) && ( myAppState == APP_START ) )
{
myAppState = APP_BOUND;
//Start reporting sensor values
osal_start_timerEx( sapi_TaskID, MY_SHIDU_BATT_EVT, mySHIDUReportPeriod);
这样就添加好了自己读取温湿度信息的任务了,然后具体怎么实现这两个任务:接下来:
而Sensor.c里面有一个Handle函数用于处理时间的:见介绍和实体:
/*****************************************************************************
网易
新闻微博邮箱相册阅读有道摄影爱拍优惠券云笔记闪电邮手机邮印像派网易识字
更多
博客
手机博客博客搬家博客VIP服务
LiveWriter写博word写博邮件写博短信写博
群博客博客油菜地博客话题博客热点博客圈子找朋友
发现
小组
风格
网易真人搭配社区iStyle
网易真人搭配社区iStyle
网易真人搭配社区iStyle
{
// Read battery value
// If battery level low, report battery value
pData[0] = BATTERY_REPORT;
pData[1] = myApp_ReadBattery();
zb_SendDataRequest( 0xFFFE, SENSOR_REPORT_CMD_ID, 2, pData, 0,AF_ACK_REQUEST, 0 );
这里说一下为什么要这么做
因为等下调用任务处理函数zb_HandleOsalEvent();的时候判断语句是这种形式的:
if( event & MY_REPORT_TEMP_EVT )
按位与,所以..
顺便说一下,我最初做这个东西看漏了这条语句,传输过程会突然断开连接,这个bug搞了我十多天。。
周期时间:(对照范例)
HalLedSet( HAL_LED_1, HAL_LED_MODE_ON );
}
直观地从函数看上去也就相当于添加一个周期性的任务;
从上一篇文章讲过这个TaskID的问题,也就添加一个任务嘛,回到整个工程的主函数,看看怎么回事,这里面就不详细地列出来了,有需要的读者可以一探究竟。过程是这样的:
主函数:ZSEG intmain( void )—— /*系统初始化*/osal_init_system();——osalInitTasks(); /*任务初始化*/
//再设这样一个时间,无限循环
}
------------------------------------------------------------------------------------------------------------------------------
这里再说一下发送的过程,首先从刚才osal_start_timerEx();设一个发送温度值的系统事件,在一个myTempReportPeriod的周期之后,通过zb_HandleOsalEvent的调用,再通过if ( event & MY_REPORT_TEMP_EVT )的条件判断执行温度值发送的事件pData[0]用于告诉协调器是温度报告,pData[1]用于告诉协调器节点报告出来的温度值是多少,再通过zb_SendDataRequest函数发送出去,而发送的形式是通过0xFFFE,绑定的形式发送(这个下面有讲)字长为2个unsigned char类型,发送完毕后再继续调用osal_start_timerEx添加一个相同的温度采集系统事件,不断地重复这个过程。
*@fn zb_HandleOsalEvent
*
*@brief The zb_HandleOsalEventfunction is called by the operating
* system when a task event is set
*
*@param event - Bitmask containingthe events that have been set
*
*@return none
*/
void zb_HandleOsalEvent( uint16 event )
{
uint8 pData[2];//用于存放数据和分类信息的
if( event & MY_START_EVT )
{
zb_StartRequest();
}
if( event & MY_REPORT_TEMP_EVT )
//这不就是从上面介绍的osal_start_timerEx();函数set的事件么?!
{
// Read and report temperature value
pData[0] =TEMP_REPORT;
//类型存放在pData[0]里面
pData[1] = myApp_ReadTemperature();
static uint16 myStartRetryDelay =10000; // milliseconds
static uint16 myTempReportPeriod = 5000; // milliseconds
添加:
static uint16 myWENDUReportPeriod =6000; // milliseconds
zb_BindDevice( TRUE, SENSOR_REPORT_CMD_ID, (uint8 *)NULL );
}
}
先添加自己刚设的事件:
if ( event & MY_REPORT_WENDU_EVT )
{
// Read and report temperature value
pData[0] =WENDU_REPORT;
玩摄影,玩LOFTER
玩胶片,玩LOFTER
玩绘画,玩LOFTER
创建博客登录
加关注
错误!超链接引用无效。|错误!超链接引用无效。
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》|错误!超链接引用无效。
豪醒的博客
不只是一个人的旅程
导航
首页
日志
相册
博友
//相当于添加一个可以让协调器识别你发过去的是什么的标签
receive();
//调用wenshi.c里面的全局函数receive(); wenshi.c是我自己写的一个C
pData[1] = TH;
//代表温度
zb_SendDataRequest( 0xFFFE, SENSOR_REPORT_CMD_ID, 2, pData, 0,AF_ACK_REQUEST, 0 );
static uint16 mySHIDUReportPeriod =7000; // milliseconds
这样子(这里的周期是毫秒级的,比如5000代表的就是5秒传一次MCU的温度)
再回到刚才的myApp_StartReporting(void )添加:
osal_start_timerEx( sapi_TaskID, MY_WENDU_BATT_EVT, myWENDUReportPeriod);
关于我
日志
zigbee学习心得2——协议栈任务
Fork - VFork一张图说明区别
zigbee学习心得——实例分析(温湿度采集及控制)
2012-08-05 16:58:58|分类:zigbee|标签:cc2430zigbee温湿度cc2430|字号大中小订阅
就像这样,先添加于温湿度传感器相关的.c和.h文件,还有串口相关的,c和.h也就是写好可以给另外的文件调用的函数了。
对于myApp_StartReporting();:
void myApp_StartReporting( void )
{
osal_start_timerEx( sapi_TaskID, MY_REPORT_TEMP_EVT,myTempReportPeriod);
osal_start_timerEx( sapi_TaskID, MY_REPORT_BATT_EVT,myBatteryCheckPeriod);
//读出来的温度值存到pData[1],myApp_ReadTemperature();是读取温度值的函数
zb_SendDataRequest(0xFFFE, SENSOR_REPORT_CMD_ID, 2, pData, 0, AF_ACK_REQUEST, 0 );
//发送出去
osal_start_timerEx(sapi_TaskID, MY_REPORT_TEMP_EVT, myTempReportPeriod );
那么我们也可以这么添加自己的事件:
再看看XXXEVT和XXXPeriod的定义:
// Application osal event identifiers
// Bit mask of events ( from 0x0000 to0x00FF )
#define MY_START_EVT 0x0001
#define MY_REPORT_TEMP_EVT 0x0002
#define MY_REPORT_BATT_EVT 0x0004
#define MY_FIND_COLLECTOR_EVT 0x0008
自己跟着做:
#define MY_REPORT_WENDU_EVT 0x0010
#define MY_REPORT_SHIDU_EVT 0x0020
------------------------------------------------------------------------------------------------------------------------------
if( event & MY_REPORT_BATT_EVT ) //道理和上面一样
osal_start_timerEx( sapi_TaskID, MY_REPORT_BATT_EVT,myBatteryCheckPeriod );
}
if( event & MY_FIND_COLLECTOR_EVT )
{Baidu Nhomakorabea
// Find and bind to a collector device
相关文档
最新文档