Be1ieve 发表于 2013-8-19 09:32:05

nRF24 收發模塊測試

忽然一堆人在玩nRF24L01,手癢就跟著跳進來

下面代碼是參考RF24的例子改成用Mirf庫,收發端共用同一個代碼
接收端可以只接電源,發送端啟動後要在串口輸入C切換

/**
*
* Pins:
* Hardware SPI: UNO / LEONARDO
* MISO -> D12 / ICSP 1
* MOSI -> D11 / ICSP 4
* SCK -> D13 / ICSP 3
*
*/

#include <SPI.h> // required by Mirf library
#include <Mirf.h> // required by Mirf library
#include <nRF24L01.h> // required by Mirf library
#include <MirfHardwareSpiDriver.h> // required by Mirf library


byte* SERVER_ADDR = (byte*)"srv01"; // 5 bytes addr
byte* CLIENT_ADDR = (byte*)"cli01"; // 5 bytes addr
boolean clientMode = false; // start mode using serverMode
unsigned long TIMEOUT = 2000; // server response timeout for 2s
unsigned long sendTime; // time when client send data

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

Mirf.cePin = 8; // default using pin 8
Mirf.csnPin = 7; // default using pin 7
Mirf.channel = 1; // default value
Mirf.payload = 5; // define data length
Mirf.spi = &MirfHardwareSpi;
Mirf.init();

/*
   * Mirf will always listen to RADDR.
   * And set TADDR to the RADDR of the other end.
   */
Mirf.setRADDR(SERVER_ADDR); // 5 bytes addr
Mirf.setTADDR(CLIENT_ADDR); // 5 bytes addr
Mirf.config();

Serial.print("\r\nConfigure as server.");
Serial.println("Change to client by input 'C'.");
}

void loop(){
byte buffer = {0xFF,0x00,0x00,0x00,0xFF}; // 5 bytes data

if(Serial.available()){ // read input first
    char c = toupper(Serial.read());
    if(c == 'C' && !clientMode){ // set to client mode
      Serial.print("Configure as client mode.");
      Serial.println("Change to server by input 'S'.");
      clientMode = true;
      
      Mirf.setRADDR(CLIENT_ADDR); // 5 bytes addr
      Mirf.setTADDR(SERVER_ADDR); // 5 bytes addr
    }
    else if(c == 'S' && clientMode){ // set to server mode
      Serial.print("Configure as server mode.");
      Serial.println("Change to client by input 'C'.");
      clientMode = false;
      
      Mirf.setRADDR(SERVER_ADDR); // 5 bytes addr
      Mirf.setTADDR(CLIENT_ADDR); // 5 bytes addr
    }
}

if(clientMode){
    buffer = 0xEF; buffer = 0xFF; // client heart beat: FFEFFFxxFF
    sendTime = millis();
    Mirf.send(buffer);
    while(Mirf.isSending()); // wait for sending
    Serial.println("Send client heart beat!");
    while(!Mirf.dataReady()){
      if((millis() - sendTime) > TIMEOUT){
      Serial.println("Server response timeout!");
      return;
      }
    }
    Mirf.getData(buffer);
    if(buffer != 0xFF || buffer != 0xFF) // drop error reading
      return;
    if(buffer == 0xEF && buffer == 0x00){ // server heart beat: FFEF00xxFF
      Serial.println("Got server heart beat!");
    }
    delay(1000); // send heart beat after 1s
}

else if(!Mirf.isSending() && Mirf.dataReady()){ // Server Mode and recieved
    Mirf.getData(buffer);
    if(buffer != 0xFF || buffer != 0xFF) // drop error reading
      return;
    // client heart beat: FFEFFFxxFF, server heart beat: FFEF00xxFF
    if(buffer == 0xEF && buffer == 0xFF){
      Serial.println("Got client heart beat!");
      buffer = 0x00; // format: FFEF00xxFF
      Mirf.send(buffer);
      while(Mirf.isSending()); // wait for sending
      Serial.println("Send server heart beat!");      
    }
}
}
页: [1]
查看完整版本: nRF24 收發模塊測試