单片机学习小组
直播中

欲望都市

9年用户 863经验值
擅长:可编程逻辑
私信 关注

如何实现ZigBee远程无线点灯?

如何实现ZigBee远程无线点灯?

回帖(1)

李玉华

2022-2-8 09:42:03
一、任务要求:

大棚种植区改造过程中提出新的需求,要求部分设备需要支持短距离无线
通讯控制风扇功能,该功能需要选手通过编程自行设计并实现。
任务要求:
 使用两块黑色 ZigBee 开发板,分别命名为 A、B 并用标签纸贴上。
 为板 B 上装一个继电器并连接一个灯泡。
 点击板 A 的 SW1 按键可以控制板 B 连接的灯的启动或关闭。
二、任务逻辑分析:


三、逻辑代码实现:
ZigBee A板的主要代码:


#include "hal_defs.h"
#include "hal_cc8051.h"
#include "hal_int.h"
#include "hal_mcu.h"
#include "hal_board.h"
#include "hal_led.h"
#include "hal_rf.h"
#include "basic_rf.h"
#include "hal_uart.h"
#include "sensor_drv/sensor.h"
#include
#include
#include


#include "hal_button.h"
/*****点对点通讯地址设置******/
#define RF_CHANNEL                16         // 频道 11~26
#define PAN_ID                    0x1616     //网络id
#define MY_ADDR                   0x2020     //本机模块地址
#define SEND_ADDR                 0x3030     //发送地址
/**************************************************/


#define APP_PAYLOAD_LENGTH        1
#define LIGHT_TOGGLE_CMD          0


static uint8 pTxData[APP_PAYLOAD_LENGTH];   //发射缓存区
static uint8 pRxData[APP_PAYLOAD_LENGTH];   //接收缓存区,发送时不需要使用
static basicRfCfg_t basicRfConfig;
// 无线RF初始化


void ConfigRf_Init(void)
{
    basicRfConfig.panId       =   PAN_ID;
    basicRfConfig.channel     =   RF_CHANNEL;
    basicRfConfig.myAddr      =   MY_ADDR;
    basicRfConfig.ackRequest  =   TRUE;
    while(basicRfInit(&basicRfConfig) == FAILED);
    basicRfReceiveOn();
}


static void appSwitch()
{
  if(halButtonPushed() == HAL_BUTTON_1)
  {
    //函数功能:给目的短地址发送指定长度的数据,发送成功刚返回SUCCESS,失败则返回FAILED
    //LIGHT_ADDR目的短地址;pTxData 指向发送缓冲区的指针; APP_PAYLOAD_LENGTH发送数据长度
    basicRfSendPacket(SEND_ADDR, pTxData, APP_PAYLOAD_LENGTH);
  }
}


/********************MAIN************************/
void main(void)
{
    halBoardInit();//选手不得在此函数内添加代码
    ConfigRf_Init();//选手不得在此函数内添加代码
   
    memset(pTxData,0,APP_PAYLOAD_LENGTH);       //清除空缓存区的数据
    pTxData[0] = LIGHT_TOGGLE_CMD;              //默认状态为关闭
   
    // 由于模块只需要发射,所以把接收屏蔽掉以降低功耗。
    basicRfReceiveOff();
   
    while(1)
    {
    /* user code start */     
      appSwitch();  //发射模块 按键S1对应P1_2
      


    /* user code end */
    }
}


ZigBee B 板的主要代码:


#include "hal_defs.h"
#include "hal_cc8051.h"
#include "hal_int.h"
#include "hal_mcu.h"
#include "hal_board.h"
#include "hal_led.h"
#include "hal_rf.h"
#include "basic_rf.h"
#include "hal_uart.h"
#include "sensor_drv/sensor.h"
#include
#include
#include


#include "hal_relay.h"


/*****点对点通讯地址设置******/
#define RF_CHANNEL                16           // 频道 11~26
#define PAN_ID                    0x1616       //网络id
#define MY_ADDR                   0x3030       //本机模块地址
//#define SEND_ADDR                 0x3030     //发送地址


#define APP_PAYLOAD_LENGTH        1          //缓存区长度
#define LIGHT_TOGGLE_CMD          0          //控制灯的命令
/**************************************************/
static uint8 pTxData[APP_PAYLOAD_LENGTH];   //发送缓存区,接收时不需要使用
static uint8 pRxData[APP_PAYLOAD_LENGTH];
static basicRfCfg_t basicRfConfig;
// 无线RF初始化


void ConfigRf_Init(void)
{
    basicRfConfig.panId       =   PAN_ID;
    basicRfConfig.channel     =   RF_CHANNEL;
    basicRfConfig.myAddr      =   MY_ADDR;
    basicRfConfig.ackRequest  =   TRUE;
    while(basicRfInit(&basicRfConfig) == FAILED);
    basicRfReceiveOn();
}


static void appLight()
{
  while(!basicRfPacketIsReady()); //检查模块是否已经可以接收下一个数据,如果准备好刚返回 TRUE


        //把收到的数据复制到pRxData中
        if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)>0) {
            if(pRxData[0] == LIGHT_TOGGLE_CMD) {//判断接收到的数据是否就是LIGHT_TOGGLE_CMD
              halRelayToggle();     //改装成P1.7控制继电器开关灯泡
            }
        }
}


/********************MAIN************************/
void main(void)
{
    halBoardInit();//选手不得在此函数内添加代码
    ConfigRf_Init();//选手不得在此函数内添加代码
   
    while(1)
    {
    /* user code start */     
     appLight();      //接收模块 灯泡对应P1_7
    /* user code end */
    }
}


四、开发中注意的事项:
1、ZigBee A板和B板的频道和网络ID必须一致;
2、注意区分 A板和B板的地址;
3、使用某个GPIO引脚,一定得初始化该引脚;
举报

更多回帖

发帖
×
20
完善资料,
赚取积分