STM32
直播中

发财树

11年用户 460经验值
私信 关注
[问答]

如何通过nrf24l01实现点对点通信?

如何通过nrf24l01实现点对点通信

回帖(1)

李名扬

2021-12-17 14:22:57
最终要实现的功能:

1、STM32采集温湿度通过串口1发送至AIR800,然后通过AIR800将温湿度上传至阿里云
2、阿里云物联网云平台下发命令通过AIR800控制STM32的LED亮灭(打开或关闭功能,或者定时 自动打开和自动关闭)
3、通过nrf24l01实现点对点通信,阿里云下发数据至air800,STM32(A)串口2接收数据之后进行判断,如果需要控制另一个STM32的LED灯,则会将数据发送至另外一个STM32(B),STM32(B)通过数据判断执行相应的功能
本模块功能:完成最后一步,在STM32上新加NRF24L01,云端借助NRF24l01的点对点通信控制第二个STM32;
整个操作过程如下:
1、STM32串口实验基础上移植oled和dht11
2、STM32添加串口2和RTC–OLED上显示时间日期
3、STM32串口2发送指令打开关闭LED(添加指定时间定时打开和关闭)
4、AIR800接收SM32发送的温湿度上传阿里云并远程控制STM32LED亮灭
5、阿里云下达指令通过NRF24L01控制第二个单片机
一、新加NRF24L01部分代码

1、新建两个文件夹,将将对应的c文件和h文件分别复制过来





2、主函数中添加24L01的头文件调用
对于将对应的 文件添加到工作组中,以及配置文件调用的路径不在列举





3、在24l01.c文件中添加调用图中的头文件,要不会报错





4、引脚初始化部分都已经给我们写好了,直接拿过来用的,那我们该去编写主函数部分内容了
当你打开正点原子的NRF24l01例程时,可能被主函数中的代码给吓坏了,其实都是纸老虎,只提取一部分对咱们有用的即可
如果不想放在同一个文件中,通过按键去选择发送和接收模式,只需要把接收部分直接取出放在另一个文件中下载即可,就是发送模式是一个单独的文件,接收是一个单独的文件,
这一部分是对咱们有用的,初始化以及判断NRF是否就位,以及进行模式的选择(发送和接收,因为发送部分和接收部分放在了一个程序中,所以为了便于区别,所以加了按键选择模式)






while(NRF24L01_Check())        //检查NRF24L01是否在位.       
{
        printf("NRF24L01 Error");
        delay_ms(200);


}                               




        while(1)//在该部分确定进入哪个模式!
{
        key=KEY_Scan(0);
        if(key==KEY_RIGHT)
        {
                mode=0;   
                break;
        }else if(key==KEY_DOWN)
        {
                mode=1;
                break;
        }


}   


再一个就是发送模式和接收模式了


if(mode==0)//RX模式
{
        NRF24L01_RX_Mode();                  //接收 模式
                                                                         
                if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.
                {
                       
                        tmp_buf[9]=0;//加入字符串结束符
                        //接收数据为"anoledk"则表示打开另一个STM32的LED
                        if(tmp_buf[3]=='l'&&tmp_buf[4]=='e'&&tmp_buf[5]=='d'&&tmp_buf[6]=='k')
                        {
                                        LED0=0;
                        }
                        //接收数据为"anoledg"则表示关闭另一个STM32的LED
                        else if(tmp_buf[3]=='l'&&tmp_buf[4]=='e'&&tmp_buf[5]=='d'&&tmp_buf[6]=='g')
                        {
                                        LED0=1;
                        }
                        OLED_ShowString(0,4,tmp_buf);//接收到的内容在oled上进行显示
                        OLED_ShowString(0,2,"RX_data");
                        printf(tmp_buf);
       
                }                                     


}
else//TX模式
{                                                                   
        NRF24L01_TX_Mode();//发送模式                                            
                if(NRF24L01_TxPacket(another_32)==TX_OK)
                {
                        OLED_ShowString(0,4,another_32);
                        OLED_ShowString(0,2,"TX_data");
                }
                            
       
}


5、编写串口2中断函数
只需要在中断函数中新加下面几句代码他就可以判断是否控制另外一个STM32了
//控制另一个STM32


                if(USART2_RX_BUF[0]=='a'&&USART2_RX_BUF[1]=='n'&&USART2_RX_BUF[2]=='o')
                {
                                        memset(another_32,0,sizeof(another_32));//将数组清零
                                strcpy(another_32,USART2_RX_BUF);
                }


6、烧写程序
登陆阿里云利用上次set_time的物模型在线调试,发送“anoledk”或者“anoledg”就可以进行控制了
7、下面是我们在air800调试中搜索到的下发指令





打开led





关闭led










(1)这样大体功能就算结束了,只是调试出了这样的效果,前一段时间调试出来,一直没整理怪乱的,正巧端午放假所有代码重新编写整理了一下;
(2)如果还需要增加其他功能自己添加即可,代码肯定不是多么完美,所以不喜勿喷
(3) 通过云端控制设备,如果阿里云在线调试功能和云下设备打通了数据之后,你就可以去选择用“阿里云的web可视化“,“移动可视化(app)“,以及”二维视图“,”三维视图“都可以进行控制的,只需要把这些数据与其对应起来,就可以进行控制了。
举报

更多回帖

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