查看: 5939|回复: 17

【说好的教程】Arduino使用Nrf24l01发送两(多)组数据

[复制链接]
  • TA的每日心情
    开心
    2019-2-13 00:00
  • 签到天数: 379 天

    [LV.9]以坛为家II

    发表于 2016-12-5 12:48 | 显示全部楼层 |阅读模式
    昨天突发奇想,看到桌面上的两个闲置着的nrf24l01模块,想到自从买回来就没用过,心里有点愧疚,于是,我从最简单的传输单组数据开始,从传输一组数据到多组数据,下面我将给大家献上源代码
    要和我PY吗?

    1人打赏

  • TA的每日心情
    开心
    2019-2-13 00:00
  • 签到天数: 379 天

    [LV.9]以坛为家II

     楼主| 发表于 2016-12-5 12:53 | 显示全部楼层
    本帖最后由 jianwei569 于 2016-12-5 13:01 编辑

    首先是第一个源代码,我在Geek-Workshop上面看到的,源地址:http://www.geek-workshop.com/thread-13254-1-1.html
    微信截图_20161204202650.png
    先附上nrf24l01的引脚定义图

    接下来就是收发的源代码
    ---------------------------------------发送端-----------------------------------------------------------

    kittenblock中小学创客名师推荐的图形化编程软件

    nRF24L01 Arduino发送端
    
    Ansifa
    2015/3/7
    
    引脚接法:
    nRF24L01   Arduino UNO
    VCC        <->        3.3V
    GND        <->        GND
    CE        <->        D9
    CSN        <->        D10
    MOSI<->        D11
    MISO<->        D12
    SCK        <->        D13
    IRQ        <->        不接
    */
    
    #include <SPI.h>
    #include <Mirf.h>
    #include <nRF24L01.h>
    #include <MirfHardwareSpiDriver.h>
    void setup()
    {
        Serial.begin(9600);
    
        Mirf.cePin = 9;                //设置CE引脚为D9
        Mirf.csnPin = 10;        //设置CE引脚为D10
        Mirf.spi = &MirfHardwareSpi;
        Mirf.init();  //初始化nRF24L01                
    
            //设置接收标识符"Sen01"
        Mirf.setRADDR((byte *)"Sen01");
        //设置一次收发的字节数,这里发一个整数,写sizeof(unsigned int),实际等于2字节
        Mirf.payload = sizeof(unsigned int);
        //发送通道,可以填0~128,收发必须一致。
        Mirf.channel = 3;
        Mirf.config();
    
            //注意一个Arduino写Sender.ino,另一个写Receiver.ino。
            //这里标识写入了Sender.ino
        Serial.println("I'm Sender...");
    }
    unsigned int adata = 0;
    void loop()
    {
            //读取A0值到adata
        adata = analogRead(A0);
    
        //由于nRF24L01只能以byte单字节数组形式发送Mirf.payload个数据,
        //所以必须将所有需要传输的数据拆成byte。
        //下面定义byte数组,存放待发数据,因为Mirf.payload = sizeof(unsigned int);
        //实际下面等于byte data[2];
        byte data[Mirf.payload];
    
        //adata是unsigned int双字节数据,必须拆开。
        //将adata高低八位拆分:
        data[0] = adata & 0xFF;                //低八位给data[0],
        data[1] = adata >> 8;                //高八位给data[1]。
    
        //设置向"serv1"发送数据
        Mirf.setTADDR((byte *)"Rec01");
        Mirf.send(data);
        //while死循环等待发送完毕,才能进行下一步操作。
        while(Mirf.isSending()) {}
        delay(20);
    }


    ---------------------------------------接收端-----------------------------------------------------------

    kittenblock中小学创客名师推荐的图形化编程软件

    nRF24L01 Arduino Receiver接收端
    
    Ansifa
    2015/3/7
    
    引脚接法:
    nRF24L01   Arduino UNO
    VCC <-> 3.3V
    GND <-> GND
    CE  <-> D9
    CSN <-> D10
    MOSI<-> D11
    MISO<-> D12
    SCK <-> D13
    IRQ <-> 不接
    */
    
    #include <SPI.h>
    #include <Mirf.h>
    #include <nRF24L01.h>
    #include <MirfHardwareSpiDriver.h>
    
        //定义一个变量adata存储最终结果,oldadata存储旧结果,防止相同结果刷屏。
        unsigned int adata = 0, oldadata = 0;
    
    void setup()
    {
        Serial.begin(9600);
    
        //---------初始化部分,不可随时修改---------
        Mirf.cePin = 9;     //设置CE引脚为D9
        Mirf.csnPin = 10;   //设置CE引脚为D10
        Mirf.spi = &MirfHardwareSpi;
        Mirf.init();  //初始化nRF24L01
    
        //---------配置部分,可以随时修改---------
        //设置接收标识符"Rev01"
        Mirf.setRADDR((byte *)"Rec01");
        //设置一次收发的字节数,这里发一个整数,
        //写sizeof(unsigned int),实际等于2字节
        Mirf.payload = sizeof(unsigned int);
        //发送通道,可以填0~128,收发必须一致。
        Mirf.channel = 3;
        Mirf.config();
    
        //注意一个Arduino写Sender.ino,另一个写Receiver.ino。
        //这里用来辨别写入了Receiver.ino程序
        Serial.println("I'm Receiver...");
    }
    
    void loop()
    {
        //定义一个暂存数组,大小为Mirf.payload。
        byte data[Mirf.payload];
        if(Mirf.dataReady())    //等待接收数据准备好
        {
            Mirf.getData(data);    //接收数据到data数组
            //data[1]<左移8位与data[0]并,重组数据。
            adata = (unsigned int)((data[1] << 8) | data[0]);
    
            //与上一次结果比较,避免相同结果刷屏,降低串口流量
            if(adata != oldadata)
            {
                oldadata = adata; //本次结果作为历史结果。
                //Serial.print输出数据
                Serial.print("A0=");
                Serial.println(adata);
                //也可以输出双字节数据
                //Serial.write(data[1]);
                //Serial.write(data[0]);
            }
    
        }
    }



    需要说明的是:我的发送端A0接的是PS2摇杆,通过analogRead读取模拟值,然后转换类型发送到接收端
    要和我PY吗?
  • TA的每日心情
    开心
    2019-2-13 00:00
  • 签到天数: 379 天

    [LV.9]以坛为家II

     楼主| 发表于 2016-12-5 13:17 | 显示全部楼层
    接下来就是两组数据收发了------------------------------发送端---------------------------------------------

    kittenblock中小学创客名师推荐的图形化编程软件

    #include <SPI.h>
    #include <Mirf.h>
    #include <nRF24L01.h>
    #include <MirfHardwareSpiDriver.h>
    void setup()
    {
        Serial.begin(9600);
    
        Mirf.cePin = 9;                //设置CE引脚为D9
        Mirf.csnPin = 10;        //设置CE引脚为D10
        Mirf.spi = &MirfHardwareSpi;
        Mirf.init();  //初始化nRF24L01                
    
            //设置接收标识符"Sen01"
        Mirf.setRADDR((byte *)"Sen01");
        //设置一次收发的字节数,这里发一个整数,写sizeof(unsigned int),实际等于2字节
        //Mirf.payload = sizeof(unsigned int);
        Mirf.payload = 4;
        //发送通道,可以填0~128,收发必须一致。
        Mirf.channel = 3;
        Mirf.config();
    
            //注意一个Arduino写Sender.ino,另一个写Receiver.ino。
            //这里标识写入了Sender.ino
        Serial.println("I'm Sender...");
    }
    int convertToPercent(int x)
    {
      int percentX = 0;
      percentX = map(x, 0, 1024, 0, 100);
      return percentX;
    }
    //unsigned int adata = 0;
    //unsigned int bdata=0;
    int adata[]={0,0};
    int x,y;
    void loop()
    {
            //读取A0值到adata
        adata[0] = analogRead(A0);
        adata[1]= analogRead(A1);
        x=convertToPercent(adata[0]);
        y=convertToPercent(adata[1]);
       // Serial.println(x);
        //Serial.println(y);
        //delay(500);
        //bdata = analogRead(A1);
        //由于nRF24L01只能以byte单字节数组形式发送Mirf.payload个数据,
        //所以必须将所有需要传输的数据拆成byte。
        //下面定义byte数组,存放待发数据,因为Mirf.payload = sizeof(unsigned int);
        //实际下面等于byte data[2];
        byte data[Mirf.payload];
        data[0]=x;
        data[1]=y;
       // Serial.println(data[0]);
        //Serial.println(data[1]);
        //delay(500);
       // byte data1[Mirf.payload];  
        //adata是unsigned int双字节数据,必须拆开。
        //将adata高低八位拆分:
        //data[0] = adata & 0xFF;                //低八位给data[0],
        //data[1] = adata >> 8;                //高八位给data[1]。
        //data1[0] = bdata & 0xFF;                //低八位给data[0],
        //data1[1] = bdata >> 8;                //高八位给data[1]。
        //设置向"serv1"发送数据
        Mirf.setTADDR((byte *)"Rec01");
        Mirf.send(data);
        //Mirf.send(data1);
        //while死循环等待发送完毕,才能进行下一步操作。
        while(Mirf.isSending()) {}
        delay(20);
    }


    ----------------------------------接收端-------------------------------------

    kittenblock中小学创客名师推荐的图形化编程软件

    #include <SPI.h>
    #include <Mirf.h>
    #include <nRF24L01.h>
    #include <MirfHardwareSpiDriver.h>
    
        //定义一个变量adata存储最终结果,oldadata存储旧结果,防止相同结果刷屏。
        //unsigned int adata = 0, oldadata = 0;
        //unsigned int bdata=0,bodata=0;
        int adata[2],oldadata[2];
    void setup()
    {
        Serial.begin(9600);
    
        //---------初始化部分,不可随时修改---------
        Mirf.cePin = 9;     //设置CE引脚为D9
        Mirf.csnPin = 10;   //设置CE引脚为D10
        Mirf.spi = &MirfHardwareSpi;
        Mirf.init();  //初始化nRF24L01
    
        //---------配置部分,可以随时修改---------
        //设置接收标识符"Rev01"
        Mirf.setRADDR((byte *)"Rec01");
        //设置一次收发的字节数,这里发一个整数,
        //写sizeof(unsigned int),实际等于2字节
        //Mirf.payload = sizeof(unsigned int);
        Mirf.payload = 4;
        //发送通道,可以填0~128,收发必须一致。
        Mirf.channel = 3;
        Mirf.config();
    
        //注意一个Arduino写Sender.ino,另一个写Receiver.ino。
        //这里用来辨别写入了Receiver.ino程序
        Serial.println("I'm Receiver...");
    }
    
    void loop()
    {
        //定义一个暂存数组,大小为Mirf.payload。
        byte data[Mirf.payload];
        //byte data1[Mirf.payload];
        if(Mirf.dataReady())    //等待接收数据准备好
        {
            Mirf.getData(data);    //接收数据到data数组
            //data[1]<左移8位与data[0]并,重组数据。
            //Mirf.getData(data1);
            //adata = (unsigned int)((data[1] << 8) | data[0]);
           // bdata = (unsigned int)((data1[1] << 8) | data1[0]);
            //与上一次结果比较,避免相同结果刷屏,降低串口流量
            for(int i=0;i<2;i++)
            {
              /*if(adata[3*i+0]==0xf0)
              {
                data =( ( 1)*((adata[3*i+1]*255) + (adata[3*i + 2])));
               }*/
               adata=data;
            }
            if(adata != oldadata)
            {
                oldadata[0] = adata[0]; //本次结果作为历史结果。
                oldadata[1] = adata[1];
                //Serial.print输出数据
                //Serial.print("A0=");
               // Serial.println(adata);
               Serial.print("X="); 
                Serial.println(data[0]); 
                Serial.print("Y=");
                Serial.println(data[1]); 
                //也可以输出双字节数据
                //Serial.write(data[1]);
                //Serial.print("A1=");
                //Serial.write(data[0]);
            }
            /*//Mirf.getData(data);    //接收数据到data数组
            //data[1]<左移8位与data[0]并,重组数据。
            Mirf.getData(data1);
            //adata = (unsigned int)((data[1] << 8) | data[0]);
            bdata = (unsigned int)((data1[1] << 8) | data1[0]);
            //与上一次结果比较,避免相同结果刷屏,降低串口流量
            if(bdata != bodata)
            {
                bodata = bdata; //本次结果作为历史结果。
                //Serial.print输出数据
                Serial.print("A1=");
                Serial.println(bdata);
                //也可以输出双字节数据
                //Serial.write(data[1]);
                //Serial.write(data[0]);
            }*/
        }
    }


    要和我PY吗?
  • TA的每日心情
    擦汗
    2017-8-16 16:44
  • 签到天数: 229 天

    [LV.7]常住居民III

    发表于 2016-12-5 13:27 | 显示全部楼层
    谢谢分享                 
  • TA的每日心情
    开心
    2019-6-26 09:02
  • 签到天数: 703 天

    [LV.9]以坛为家II

    发表于 2016-12-5 13:37 | 显示全部楼层
    谢谢楼主分享  刚好手头上买了两个这个模块
    打赏作者鼓励一下!
  • TA的每日心情

    2017-3-16 10:00
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2017-1-11 06:00 | 显示全部楼层
    Mirf.spi = &MirfHardwareSpi;这句啥意思啊?

    该用户从未签到

    发表于 2017-3-11 14:12 | 显示全部楼层
    谢谢楼主分享  刚好手头上买了两个这个模块
  • TA的每日心情
    无聊
    2018-5-8 13:06
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2018-8-13 23:57 | 显示全部楼层
    靳靳 发表于 2017-1-11 06:00
    Mirf.spi = &MirfHardwareSpi;这句啥意思啊?

    初始化。。。。。。。。。。。。。
  • TA的每日心情
    开心
    2018-12-18 13:36
  • 签到天数: 60 天

    [LV.6]常住居民II

    发表于 2018-8-26 15:29 | 显示全部楼层
    谢谢楼主分享

    该用户从未签到

    发表于 2018-9-8 14:46 | 显示全部楼层
    Mirf.h这个库文件在哪里的..
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    【蓝宙天枢套件评测报告之一】开箱报告
    【蓝宙天枢套件评测报告之
    蓝宙天枢套件评测报告之开箱报告 感谢蓝宙电子以及arduino.cn给我一个评测天枢套件的
    基于wifiduino和blinker的智能加湿器
    基于wifiduino和blinker的
    首先感谢奈何大神每次都会出现在我的求助帖内给予我帮助,这个项目的完工非常感谢他。
    体验OneNET4.0,一起来拼开发板
    体验OneNET4.0,一起来拼
    一、 活动时间2019年04月09日-2019年6月30日 二、活动链接1.登录Arduino中文社区账
    【Arduino】37种传感器模块系列实验(29)---实时时钟模块
    【Arduino】37种传感器模
    37款传感器模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不
    新手帮助,STM32 刷入Arduino的BootLoader。实现免串口下载
    新手帮助,STM32 刷入Ardu
    不少新人从某宝买回来十元一个的STM32C8T6的最小系统板,满网扒教程,最后搞一点点东
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表