通过两个cc2530的点对点功能来实现—智能照明功能 两个cc2530分为照明节点和中控节点
要实现的功能:
1–照明节点每隔0.5秒将灯的亮灭情况上报给中控节点
2–用户可以通过中控节点的按键1可远程控制照明节点上灯的状态翻转
3–中控节点使用本地的led灯来指示远程照明灯的亮灭情况,即远程照明灯亮则本地灯亮,反之亦然。
在做这个项目之前,我们必须要有cc2530的基础,这里博主就默认你们已经了解并学习过cc2530了。然后,去找一个点对点的原始代码包,这边博主也默认你们准备好了,,如果没有,私聊我发给你。
首先
我们了解一下点对点这个包的内容,我们刚打开文件会是这样子的:
在这之后
我们要设置频道,网络id,本机模块地址,发送地址,
两个设备进行通信时,我们的频道和网络id必须相同,然后设置一个本机地址是照明端的,发送地址是中控端,在初始化中,在初始化(一定是初始化照明端地址)。
初始化完后:
地址可以随便写的,可以不用完全抄我的,只不过两个板子的频道和id要一样。
然后,我们来认识一下主要的函数:在basic_rf.h中:
uint8 basicRfInit(basicRfCfg_t *pRfConfig);(这个是初始化基本射频数据结构)我们上面初始化的结构体就是它的参数,这里要注意的是:在调用此函数前,必须先调用HAL层的halBoardInit()函数初始化板载外设和射频硬件,
发送数据至目标数据的节点
destAddr—目标地址
pPayload—要发送的数据缓存区地址
length----发送的数据长度
uint8 basicRfSendPacket(uint16 destAddr, uint8 *pPayload, uint8 length)
//判断Basic RF层是否已经准备好接收数据
//准备好返回true,否则返回false
uint8 basicRfPacketIsReady(void)
//将Basic RF层接收到的数据和RSSI值存入预先分配好的缓冲区
//pRxData—存放接收数据的缓冲区地址
//len-------接收数据长度
//pRssi-----存放RSSI值变量地址
//返回值:实际写入缓冲区的数据字节数
uint8 basicRfReceive(uint8 *pRxData, uint16 len, int16 *pRssi)
//打开数据接收器
void basicRfReceiveOn(void);
//关闭数据接收器
void basicRfReceiveOff(void);
这些就是主要的内容,我们大部分的内容都可以用这些函数解决。
接下来就是通过这些函数,结合基础的cc2530知识,完成照明端的编写,
这里我采用板载led灯作为照明灯,
这是给出我的主循环内容仅供参考:如果要源码评论区
while(1)
{
/* user code start */
led_count++; //LED发送间隔增加
if(basicRfPacketIsReady()) //如果准备好接收
{
if(basicRfReceive(pRxData,APP_PAYLOAD_LENGTH,NULL)>0) //如果接收数据长度大于0
{
if(rcvdata_process(pRxData,&masterCMD,&slaveCMD1,&slaveCMD2))
{
//接收内容错误
}else //接收内容正确
{
if(masterCMD==MCMD_CTRL_LIGHT) //如果接收到控制灯的指令
{
if(slaveCMD1==0x01) //如果是开灯命令
{
LED1=0;
led_state=1;
}else if(slaveCMD1==0x02) //如果是关灯命令
{
LED1=1;//高电平熄灭
led_state=0;
}
}
}
memset(pRxData,0,7);
}
}
if(led_count>=10) //如果时间间隔大于500ms
{
led_count=0; //时间间隔清零
if(led_state==0) //如果LED状态为灭
{
build_payload(pTxData,MCMD_LIGHT_STATUS,SCMD_CLOSE,0x00); //构建发送函数,主指令为照明灯状态,副指令1为开/关
}
if(led_state==1)
{
build_payload(pTxData,MCMD_LIGHT_STATUS,SCMD_OPEN,0x00);
}
basicRfSendPacket(CONTROL_ADDR,pTxData,APP_PAYLOAD_LENGTH); //发送数据包
}
halMcuWaitMs(50);
/* user code end */
}
照明端的主要功能就编写完成了。