一、任务要求:
大棚种植区改造过程中提出新的需求,要求部分设备需要支持短距离无线
通讯控制风扇功能,该功能需要选手通过编程自行设计并实现。
任务要求:
使用两块黑色 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引脚,一定得初始化该引脚;
一、任务要求:
大棚种植区改造过程中提出新的需求,要求部分设备需要支持短距离无线
通讯控制风扇功能,该功能需要选手通过编程自行设计并实现。
任务要求:
使用两块黑色 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引脚,一定得初始化该引脚;
举报