hi55234 发表于 2015-2-23 17:16:43

菜鸟玩 NRF24L01

蓝牙成本高、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 循环

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

char tempx="00000";
int x=0;

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

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

Mirf.config();
}
void loop(){
unsigned long time = millis();

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


if(x<10)tempx=x+48;
else if(x>9 && x<100){
tempx=x%10+48;
tempx=x/10+48;
}else if(x>99 && x<999){
tempx=x%10+48;
tempx=(x/10)%10+48;
tempx=x/100+48;
}

Sends(tempx);
x++;
if(x==1000){
x=0;
   for(int col=0;col<5;col++)tempx=48;
}

delay(100);
}


void Sends(char *str)
{
int lens;
lens=strlen(str);

char msg;
int i;
for (i=0;i<lens;i++)
{
msg= int(str);
}
Mirf.send((byte *)&msg);

while(Mirf.isSending()){}



}



接收代码

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
void setup(){
Serial.begin(9600);

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

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

Mirf.config();

}
void loop(){

byte data;
if(!Mirf.isSending() && Mirf.dataReady()){ //存在数据

Mirf.getData(data);


int i;
String Temp;
for (i = 0; i < Mirf.payload; i++) //把收到的信息拼起来,到一个串里面
{
Temp += char(data);
}
Serial.print("Get:");
Serial.print(Mirf.payload);
Serial.print(" ");
Serial.println(Temp);

/**
Mirf.setTADDR((byte *)"clie1");
Mirf.send(data);
**/
}
}


dReamX 发表于 2015-2-23 20:49:03

这也是一个数据传输的解决方案?

smallfivecn 发表于 2015-2-23 23:20:03

经测试可以的!:P

hi55234 发表于 2015-2-24 11:25:49

本帖最后由 hi55234 于 2015-2-24 11:55 编辑

dReamX 发表于 2015-2-23 20:49 static/image/common/back.gif
这也是一个数据传输的解决方案?

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

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

char tempx;
int jsq1=0;
boolean NRF=0;


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

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

Mirf.config();
}


void loop(){


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


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

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

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

delayMicroseconds(1200);

}

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

}


}


void Sends(char *str)
{
int lens;
lens=strlen(str);

char msg;
int i;
for (i=0;i<lens;i++)
{
msg= int(str);
}
Mirf.send((byte *)&msg);

while(Mirf.isSending()){}



}

wsy0315 发表于 2015-2-24 22:30:56

最近也在玩nrf24l01,但是好多不明白的

Cupid 发表于 2015-2-25 07:27:37

收藏:D:D:D:D:D

dReamX 发表于 2015-2-25 13:30:30

跟着楼主既长知识又长学问....

象象 发表于 2015-2-25 13:43:05

我用的就是这个库

雨轩 发表于 2015-5-31 11:21:36

怎么控制六路继电器?
页: [1]
查看完整版本: 菜鸟玩 NRF24L01