基于Basic RF的智能家居控制系统---智能照明功能(照明端)

通过两个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 */
    }

照明端的主要功能就编写完成了。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值