找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

Arduino学习16-连接nRF24L01无线收发模块

查看数: 25017 | 评论数: 23 | 收藏 2
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2016-4-18 03:33

正文摘要:

nRF24L01是一款工作在 2.4~2.5GHz 世界通用ISM频段的单片无线收发器芯片,输出功率、频道选择和协议的设置可以通过SPI接口进行设置。有极低的电流消耗,当工作在发射模式下发射功率为-6dBm时电流消耗为9.0mA,接收模 ...

回复

无效楼层,该帖已经被删除
ID:594522 发表于 2019-8-3 11:11
gdgzwqz 发表于 2017-8-1 22:53
我下载了再次,扣了我再次5分!!!!!!冤枉啊!!!!!!!!!

下载好的能不能分享一下
ID:329997 发表于 2019-1-19 20:05
楼主您好!我今天也碰巧搞这个模块,不过好像存在些问题,接线没有问题。C:\Users\Administrator\DesktopC:\Users\Administrator\Desktop
ID:442524 发表于 2018-12-27 09:03
下载一个看看
ID:442524 发表于 2018-12-9 10:35
学习一下           
ID:380141 发表于 2018-8-27 10:10
我也点“后退”结果造成重复下载被重复扣了5分!!!
ID:221153 发表于 2017-12-15 23:28
I'm Receiver...
没有然后了
ID:221153 发表于 2017-12-15 23:18
用的库里带的事例,一直这样
Beginning ...
Finished sending
Timeout on response from server!
Finished sending
Timeout on response from server!
Finished sending
Timeout on response from server!
Finished sending
Timeout on response from server!
Finished sending
Timeout on response from server!
Finished sending
无效楼层,该帖已经被删除
ID:238632 发表于 2017-10-11 16:52
请问下怎样实现两个边发送 边接收
ID:55085 发表于 2017-8-1 22:53
我下载了再次,扣了我再次5分!!!!!!冤枉啊!!!!!!!!!
ID:55085 发表于 2017-8-1 22:52
不小心重复了下载,怎么又扣分哪!!!!!!!

评分

参与人数 1黑币 +80 收起 理由
admin + 80 补偿

查看全部评分

ID:198286 发表于 2017-5-28 19:33
丢包多数是信号强度不够,你看设置有问题没,简单办法可以试试降低速率,如果可以就是这样的问题
ID:191906 发表于 2017-5-17 00:53
支持一个,我用RF24丢包好严重,不懂是什么问题
ID:189188 发表于 2017-4-18 09:40
这个是别人写的多通道发送端程序,更改地址,但是只有03号地址才能用为啥?
  1. /*
  2.     nRF24L01 Arduino Receiver接收端
  3.     图表输出版本
  4.      
  5.     Ansifa
  6.     2015/3/7
  7.      
  8.     引脚接法:
  9.     nRF24L01   Arduino UNO
  10.     VCC <-> 3.3V
  11.     GND <-> GND
  12.     CE  <-> D9
  13.     CSN <-> D10
  14.     MOSI<-> D11
  15.     MISO<-> D12
  16.     SCK <-> D13
  17.     IRQ <-> 不接
  18.     */
  19. #include"Multiple.h"

  20. Multiple nrf(9,10,13,11,12);//构建函数,参数分别为CE,CSN,CLK,MOSI,MISO

  21. uint8_t tx_addr[] = { 0x03, 0xFF, 0xFF, 0xFF, 0xFF};//发送地址
  22. uint8_t tx_data[32]={3,0,2,5,8};//发送的数据,32位
  23. //uint8_t channel;//接收通道
  24. //uint8_t tmp;

  25. void setup() {
  26.   nrf.send_mode(tx_addr);//设置为发送模式,参数为发送地址
  27. }

  28. void loop() {
  29.    
  30.   tx_data[2]++;
  31.   nrf.send(tx_addr,tx_data);//发送数据,参数:发送地址,数据
  32.   delay(1000);

  33. }
复制代码
ID:190397 发表于 2017-4-17 13:00
有一对多的代码吗?
ID:190306 发表于 2017-4-17 09:06
很不错的教程,学习了
ID:189188 发表于 2017-4-13 14:42
参照了您的写法,一对一成功了,请问一对多如何改写
ID:165849 发表于 2017-2-22 01:05
1) 终于成功测试成功。  不过网上的MIRF 库有多个版本的,我用上老的版本·
https://github.com/aaronds/arduino-nrf24l01

2)  设置CE CSN引脚也很方便可以用以下指令
Mirf.cePin = 9;   
Mirf.csnPin = 10

3) 范例开始的这段漏了  
#include
#include
#include
#include ,  
后来查了一下应该是
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
ID:156727 发表于 2016-12-22 01:13
相当不错的教程
无效楼层,该帖已经被删除
ID:156727 发表于 2016-12-22 01:11
教程真的不错。
ID:114115 发表于 2016-4-18 03:41
问题解答:
楼主你好,我想请教下,如果一次发送多个传感器的数据该怎么改呢?我试着改了一下你的程序,但是只能接收到第一个传感器的数据,第二个传感器的数据一直不对,能帮我看下吗?谢谢了
发送端程序
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
void setup()
{
    Serial.begin(9600);

    Mirf.cePin = 8;                //设置CE引脚为D9
    Mirf.csnPin = 7;        //设置CE引脚为D10
    Mirf.spi = &MirfHardwareSpi;
    Mirf.init();  //初始化nRF24L01               

        //设置接收标识符"Sen01"
    Mirf.setRADDR((byte *)"Sen01");
    Mirf.payload = sizeof(unsigned int);
    Mirf.channel = 3;
    Mirf.config();

        //注意一个Arduino写Sender.ino,另一个写Receiver.ino。
        //这里标识写入了Sender.ino
    Serial.println("I'm Sender...");
}
unsigned int adata = 0;
unsigned int bdata = 0;
void loop()
{
        //读取A0值到adata
    adata = analogRead(A0);
    bdata = analogRead(A1);

    //由于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]。
  data[2] = bdata & 0xFF;                //低八位给data[0],
    data[3] = bdata >> 8;
    //设置向"serv1"发送数据
    Mirf.setTADDR((byte *)"Rec01");
    Mirf.send(data);
    //while死循环等待发送完毕,才能进行下一步操作。
    while(Mirf.isSending()) {}
    Serial.println(adata);
    Serial.print("*****");
    Serial.println(bdata,DEC);
    delay(3000);
}

接收端程序:

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

    //定义一个变量adata存储最终结果,oldadata存储旧结果,防止相同结果刷屏。
    unsigned int adata = 0, bdata = 0;

void setup()
{
    Serial.begin(9600);

    //---------初始化部分,不可随时修改---------
    Mirf.cePin = 8;     //设置CE引脚为D9
    Mirf.csnPin = 7;   //设置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]);
  bdata = (unsigned int)((data[3] << 8) | data[2]);



          Serial.println(adata);
    Serial.print("*****");
    Serial.println(bdata,DEC);
    }
}

求指教,十分感谢!

-----------------------------------------------

答:
你在可以这样修改:

发送端程序
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
void setup()
{
    Serial.begin(9600);

    Mirf.cePin = 8;                //设置CE引脚为D9
    Mirf.csnPin = 7;        //设置CE引脚为D10
    Mirf.spi = &MirfHardwareSpi;
    Mirf.init();  //初始化nRF24L01               

        //设置接收标识符"Sen01"
    Mirf.setRADDR((byte *)"Sen01");
    Mirf.payload = sizeof(unsigned int);//在这把2 修改成4
    Mirf.channel = 3;
    Mirf.config();

        //注意一个Arduino写Sender.ino,另一个写Receiver.ino。
        //这里标识写入了Sender.ino
    Serial.println("I'm Sender...");
}
unsigned int adata = 0,bdata = 0;

void loop()
{
        //读取A0值到adata
    adata = analogRead(A0);
    bdata = analogRead(A1);

    //由于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]。
    data[2] = bdata & 0xFF;                //低八位给data[0],
    data[3] = bdata >> 8;
    //设置向"serv1"发送数据
    Mirf.setTADDR((byte *)"Rec01");
    Mirf.send(data);
    //while死循环等待发送完毕,才能进行下一步操作。
    while(Mirf.isSending()) {}
    Serial.println(adata);
    Serial.print("*****");
    Serial.println(bdata,DEC);
    delay(3000);
}

接收端程序:

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

    //定义一个变量adata存储最终结果,oldadata存储旧结果,防止相同结果刷屏。
    unsigned int adata = 0, bdata = 0;

void setup()
{
    Serial.begin(9600);

    //---------初始化部分,不可随时修改---------
    Mirf.cePin = 8;     //设置CE引脚为D9
    Mirf.csnPin = 7;   //设置CE引脚为D10
    Mirf.spi = &MirfHardwareSpi;
    Mirf.init();  //初始化nRF24L01

    //---------配置部分,可以随时修改---------
    //设置接收标识符"Rev01"
    Mirf.setRADDR((byte *)"Rec01");
    //设置一次收发的字节数,这里发一个整数,
    //写sizeof(unsigned int),实际等于2字节
    Mirf.payload = sizeof(unsigned int);//在这把2 修改成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];
    if(Mirf.dataReady())    //等待接收数据准备好
    {
        Mirf.getData(data);    //接收数据到data数组
        //data[1]<左移8位与data[0]并,重组数据。
        adata = (unsigned int)((data[1] << 8) | data[0]);
        bdata = (unsigned int)((data[3] << 8) | data[2]);
   
      
            
          Serial.println(adata);
    Serial.print("*****");
    Serial.println(bdata,DEC);
    }
}

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表