ZigBee学习五 无线温度检测

1)修改公用头文件GenericApp.h

typedef union h
{
  uint8 TEMP[4];
  struct RFRXBUF
  {
    unsigned char Head;
    unsigned char value[2];
    unsigned char Tail;
  }BUF;
}TEMPERATURE;

2)协调器编程

协调器编程时,只需要修改一下消息处理函数GenericApp_MessageMSGCB()即可:

修改coordinator.c文件

byte GenericApp_TransID; // This is the unique message ID (counter)

afAddrType_t GenericApp_DstAddr;

//unsigned char uartbuf[128];
/*********************************************************************
* LOCAL FUNCTIONS
*/
static void GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg );
static void GenericApp_HandleKeys( byte shift, byte keys );
static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pckt );
static void GenericApp_SendTheMessage( void );

//static void rxCB(uint8 port,uint8 event);

void GenericApp_Init( uint8 task_id )
{
  halUARTCfg_t uartConfig;
  GenericApp_TaskID = task_id;
  GenericApp_NwkState = DEV_INIT;
  GenericApp_TransID = 0;

  ... ...

  GenericApp_epDesc.simpleDesc= (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc;
  GenericApp_epDesc.latencyReq = noLatencyReqs;

  afRegister( &GenericApp_epDesc );

  uartConfig.configured   = TRUE;
  uartConfig.baudRate    = HAL_UART_BR_115200;
  uartConfig.flowControl    = FALSE;
  uartConfig.callBackFunc  = NULL;

  HalUARTOpen(0,&uartConfig);

}

//该函数是一个空函数。因为本实验并没有进行事件处理,所有不需要任何代码

uint16 GenericApp_ProcessEvent( uint8 task_id, uint16 events )
{

... ...

  switch ( MSGpkt->hdr.event )
  {
    case ZDO_CB_MSG:
      break;

    case KEY_CHANGE:
      break;

    case AF_DATA_CONFIRM_CMD:

      break;

    case AF_INCOMING_MSG_CMD:

      GenericApp_MessageMSGCB( MSGpkt );
      break;

    case ZDO_STATE_CHANGE:
      break;

    default:
      break;
  }

... ...

}

/*

static void rxCB(uint8 port,uint8 event)
{
  HalUARTRead(0,uartbuf,16);  //读取数据并存放到uartbuf数组中
  if(osal_memcmp(uartbuf,"www.wlwmaker.com",16)) //使用osal_memcmp()函数判断接收到的数据是否是字符串"www.wlwmaker.com",如果是,执行{}
  {
    HalUARTWrite(0,uartbuf,16); //调用HalUARTWrite()函数将接收到的字符输出到串口
  }
}

*/

static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{

    unsigned char buffer[2] = {0x0A,0x0D};
    TEMPERATURE temperature;

    switch ( pkt->clusterId )
    {

      case GENERICAPP_CLUSTERID:
        osal_memcpy(&temperature,pkt->cmd.Data,sizeof(temperature));
        HalUARTWrite(0,(uint8 *)&temperature,sizeof(temperature));
        HalUARTWrite(0,buffer,2);
        break;

    }

}

3)终端节点编程

建立驱动文件Sensor.h和Sensor.c

Sensor.h文件

#ifndef SENSOR_H
#define SENSOR_H
#include <hal_types.h>

extern int8 readTemp(void);

#endif

Sensor.c文件

#include "Sensor.h"
#include <ioCC2530.h>

#define HAL_ADC_REF_115V 0x00
#define HAL_ADC_DEC_256 0x20
#define HAL_ADC_CHN_TEMP 0x0e

int8 readTemp(void)
{
  static uint16 reference_voltage;
  static uint8 bCalibrate = TRUE;
  uint16 value;
  int8 temp;

  ATEST =0x01;
  TR0 |= 0x01;
  ADCIF = 0;
  ADCCON3 = (HAL_ADC_REF_115V|HAL_ADC_DEC_256|HAL_ADC_CHN_TEMP);
  while(!ADCIF);

  ADCIF = 0;
  value = ADCL;
  value |= ((uint16)ADCH)<<8;

  value >>=4;
  if(bCalibrate)
  {
    reference_voltage = value;
    bCalibrate = FALSE;
  }
  temp = 22 + ((value - reference_voltage)/4);
  return temp;
}

修改enddevice.c文件

只需修改消息发送函数就行了

static void GenericApp_SendTheMessage( void )
{
  //char theMessageData[] = "EndDevice";
  uint8 tvalue;
  TEMPERATURE temperature;
  temperature.BUF.Head = '&';
  tvalue = readTemp();
  temperature.BUF.value[0] = tvalue /10 +'0';
  temperature.BUF.value[1] = tvalue %10 +'0';
  temperature.BUF.Tail = 'C';

  afAddrType_t my_DstAddr;
  my_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;//单播发送
  my_DstAddr.endPoint = GENERICAPP_ENDPOINT; //目的端口号
  my_DstAddr.addr.shortAddr = 0x0000; //协调器网络地址

  if ( AF_DataRequest( &my_DstAddr, &GenericApp_epDesc,
    GENERICAPP_CLUSTERID,
    sizeof(temperature ),
    (byte *)&temperature,
    &GenericApp_TransID,
    AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
    {
      // Successfully requested to be sent.
      HalLedBlink(HAL_LED_1,0,50,500);
    }else
    {
      // Error occurred in request to send.
    }
}

ZigBee学习五 无线温度检测的更多相关文章

  1. ZigBee学习四 无线+UART通信

    ZigBee学习四 无线+UART通信 1) 协调器编程 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique messag ...

  2. zigbee学习之路(一):zigbee介绍

    一.前言 大家好,我是一名在校的大学生,最近对zigbee非常感兴趣,于是自己从网上买了一款秉火cc2530的zigbee开发板,想通过这个平台来和大家分享自己学习和研究的经历,下面就来简单的介绍下z ...

  3. zigbee学习:示例程序SampleApp中按键工作流程

    zigbee学习:示例程序SampleApp中按键工作流程 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:IAR8. ...

  4. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  5. ZigBee学习一 任务处理函数_ProcessEvent

    ZigBee学习一 任务处理函数_ProcessEvent //任务处理函数UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events ){ ...

  6. TweenMax动画库学习(五)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  7. zigbee学习:示例程序SampleApp中通讯流程

    zigbee学习:示例程序SampleApp中通讯流程 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 参考链接: http://wjf88223.bl ...

  8. SVG 学习<五> SVG动画

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  9. Android JNI学习(五)——Demo演示

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

随机推荐

  1. AngularJs学习笔记-表单处理

    表单处理 (1)Angular表单API 1.模板式表单,需引入FormsModule 2.响应式表单,需引入ReactiveFormsModule   (2)模板式表单 在Angular中使用for ...

  2. Activiti学习记录(四)

    1 连线 注意:如果将流程图放置在和java类相同的路径,需要配置: 1.1 部署流程定义+启动流程实例 ProcessEngine processEngine = ProcessEngines.ge ...

  3. react组件间的传值方法

    关于react的几个网站: http://react.css88.com/ 小书:http://huziketang.mangojuice.top/books/react/ http://www.re ...

  4. split 分割压缩文件

    1.普通tar压缩命令 tar -zcvf cm-11.tar.gz cm-11 //将cm-11文件夹压缩成cm-11.tar.gz 2.压缩后的文件太大,需要将cm-11.tar.gz分割成N个指 ...

  5. SpringBoot日志输出至Logstash

    1.springboot项目pom.xml文件下添加如下配置 2.resources目录下创建logback-spring.xml文件 <?xml version="1.0" ...

  6. foreach遍历数组

    foreach遍历一维数组 <?php //PHP数组遍历:foreach //定义数组 $arr=array(1,2,3,4,5,6,7,8,9,10); //foreach循环 foreac ...

  7. A1055 The World's Richest(25 分)

    A1055 The World's Richest(25 分) Forbes magazine publishes every year its list of billionaires based ...

  8. HihoCoder - 1636 Pangu and Stones(区间DP)

    有n堆石子,每次你可以把相邻的最少L堆,最多R堆合并成一堆. 问把所有石子合并成一堆石子的最少花费是多少. 如果不能合并,输出0. 石子合并的变种问题. 用dp[l][r][k]表示将 l 到 r 之 ...

  9. vector函数用法

    vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问元素,还可以使用指针的 ...

  10. EasyUI与Bootstrap完美结合

    注意点:版本问题.两者都是基于jQuery来构建,所以对于版本的选择要注意下