极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12122|回复: 8

菜鸟玩 NRF24L01

[复制链接]
发表于 2015-2-23 17:16:43 | 显示全部楼层 |阅读模式
蓝牙成本高、wifi不会玩,就先看看NRF24L01吧






来自贴吧的教程:
http://tieba.baidu.com/p/3092150056


IRQ –悬空 @@@@ MISO – D12,
MOSI – D11 @@@ SCK – D13,
CSN – D7, @@@@ CS – D8,
VCC - 3.3V @@@@ GND - GND

发送代码: 00000——00999 循环

  1. #include <SPI.h>
  2. #include <Mirf.h>
  3. #include <nRF24L01.h>
  4. #include <MirfHardwareSpiDriver.h>

  5. char tempx[6]="00000";
  6. int x=0;

  7. void setup(){
  8. Serial.begin(9600);
  9. Mirf.spi = &MirfHardwareSpi;
  10. Mirf.init();

  11. Mirf.setRADDR((byte *)"clie1"); // 标记本地名,用于接收
  12. Mirf.payload = 5; //对话的长度,用于约定双方对话的缓冲窗口大小,这个代表5个字节
  13. Mirf.channel = 3; // 信道,测试了一下,不同的信道也能接收但即时性很差,不知是不是存在自动寻道匹配机制

  14. Mirf.config();
  15. }
  16. void loop(){
  17. unsigned long time = millis();

  18. Mirf.setTADDR((byte *)"serv1"); // 标记对方的地址
  19. //Sends("hello"); //发送了一个5字节的hello


  20. if(x<10)tempx[4]=x+48;
  21. else if(x>9 && x<100){
  22.   tempx[4]=x%10+48;
  23.   tempx[3]=x/10+48;
  24. }else if(x>99 && x<999){
  25.   tempx[4]=x%10+48;
  26.   tempx[3]=(x/10)%10+48;
  27.   tempx[2]=x/100+48;
  28. }

  29. Sends(tempx);
  30. x++;
  31. if(x==1000){
  32.   x=0;
  33.    for(int col=0;col<5;col++)tempx[col]=48;
  34. }

  35. delay(100);
  36. }


  37. void Sends(char *str)
  38. {
  39. int lens;
  40. lens=strlen(str);

  41. char msg[lens];
  42. int i;
  43. for (i=0;i<lens;i++)
  44. {
  45. msg[i]= int(str[i]);
  46. }
  47. Mirf.send((byte *)&msg);

  48. while(Mirf.isSending()){}



  49. }
复制代码



接收代码

  1. #include <SPI.h>
  2. #include <Mirf.h>
  3. #include <nRF24L01.h>
  4. #include <MirfHardwareSpiDriver.h>
  5. void setup(){
  6. Serial.begin(9600);

  7. Mirf.spi = &MirfHardwareSpi;
  8. Mirf.init();

  9. Mirf.setRADDR((byte *)"serv1"); // 本地名
  10. Mirf.payload = 5; // 长度
  11. Mirf.channel = 3; // 信道

  12. Mirf.config();

  13. }
  14. void loop(){

  15. byte data[Mirf.payload];
  16. if(!Mirf.isSending() && Mirf.dataReady()){ //存在数据

  17. Mirf.getData(data);


  18. int i;
  19. String Temp;
  20. for (i = 0; i < Mirf.payload; i++) //把收到的信息拼起来,到一个串里面
  21. {
  22. Temp += char(data[i]);
  23. }
  24. Serial.print("Get:");
  25. Serial.print(Mirf.payload);
  26. Serial.print(" ");
  27. Serial.println(Temp);

  28. /**
  29. Mirf.setTADDR((byte *)"clie1");
  30. Mirf.send(data);
  31. **/
  32. }
  33. }
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-2-23 20:49:03 | 显示全部楼层
这也是一个数据传输的解决方案?
回复 支持 反对

使用道具 举报

发表于 2015-2-23 23:20:03 | 显示全部楼层
经测试可以的!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-24 11:25:49 | 显示全部楼层
本帖最后由 hi55234 于 2015-2-24 11:55 编辑
dReamX 发表于 2015-2-23 20:49
这也是一个数据传输的解决方案?


5字节,串口转NRF24L01,要想一次性发送更多,就增加 tempx、Mirf.payload的长度就可以了

  1. #include <SPI.h>
  2. #include <Mirf.h>
  3. #include <nRF24L01.h>
  4. #include <MirfHardwareSpiDriver.h>

  5. char tempx[6];
  6. int jsq1=0;
  7. boolean NRF=0;


  8. void setup(){
  9. Serial.begin(9600);
  10. Mirf.spi = &MirfHardwareSpi;
  11. Mirf.init();

  12. Mirf.setRADDR((byte *)"clie1"); // 标记本地名,用于接收
  13. Mirf.payload = 5; //对话的长度,用于约定双方对话的缓冲窗口大小,这个代表5个字节
  14. Mirf.channel = 3; // 信道,测试了一下,不同的信道也能接收但即时性很差,不知是不是存在自动寻道匹配机制

  15. Mirf.config();
  16. }


  17. void loop(){


  18. Mirf.setTADDR((byte *)"serv1"); // 标记对方的地址
  19. //Sends("hello"); //发送了一个5字节的hello


  20. while (Serial.available() > 0) {
  21.     NRF=1;

  22.    if(jsq1<5){ //只接受前5个字节

  23.   tempx[jsq1]=Serial.read();  
  24.   jsq1++;
  25.    }else Serial.read(); //超过5字节的都丢弃

  26. delayMicroseconds(1200);

  27.   }

  28. if(NRF){
  29.          NRF=0; //nrf发送数据次数与串口接收数据次数一对一
  30.          for(int col=jsq1;col<5;col++)tempx[col]=32; //不足5字节的补上空格,算是一种视觉上的清空
  31.          jsq1=0;
  32.          Sends(tempx);
  33.      //for(int col=0;col<5;col++)tempx[col]=0;//不需要清空,因为新的填充会自然清空

  34. }


  35. }


  36. void Sends(char *str)
  37. {
  38. int lens;
  39. lens=strlen(str);

  40. char msg[lens];
  41. int i;
  42. for (i=0;i<lens;i++)
  43. {
  44. msg[i]= int(str[i]);
  45. }
  46. Mirf.send((byte *)&msg);

  47. while(Mirf.isSending()){}



  48. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2015-2-24 22:30:56 | 显示全部楼层
最近也在玩nrf24l01,但是好多不明白的
回复 支持 反对

使用道具 举报

发表于 2015-2-25 07:27:37 | 显示全部楼层
收藏
回复 支持 反对

使用道具 举报

发表于 2015-2-25 13:30:30 | 显示全部楼层
跟着楼主既长知识又长学问....
回复 支持 反对

使用道具 举报

发表于 2015-2-25 13:43:05 | 显示全部楼层
我用的就是这个库
回复 支持 反对

使用道具 举报

发表于 2015-5-31 11:21:36 | 显示全部楼层
怎么控制六路继电器?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-28 16:22 , Processed in 0.043770 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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