NEO 6M standort via NRF24 übertragen

Hallo, ich bin recht neu in der Arduino Welt. Ich möchte für ein Projekt ein GPS Standort in Regelmäßigen Abständen über einen NRF24 übertragen und diese dann dort auswerten. Ich habe schon einiges ausprobiert.. ich bin bereits so weit gekommen dass ich eine Kommunikation herstellen konnte (Beispielcode aus dem Netz weil selbst schreiben noch nicht klappt^^) und in einem weiteren konnte ich bereits den Standort auslesen und auswerten. Beim Kombinieren dieser beiden Codes bin ich auf ein paar Probleme gestoßen. (Datenformate ändern um diese über den NRF24 zu schicken und diese dann auf dem zweiten Arduino auszuwerten...)
Das sieht wohl für Könner schlimm aus aber hier mal mein Code:

// Load in the libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <printf.h>   
// Set the CE & CSN pins
#define CE_PIN   9
#define CSN_PIN 10


//TinyGPS 
TinyGPS gps;

//Set the GPS RX & TX Pins 
SoftwareSerial ss(4, 3);
static const int RXPin = 4, TXPIN = 3;

//Set GPSBaud
static const uint32_t GPSBaud = 9600; 

// This is the address used to send/receive
const byte rxAddr[6] = "00001";

// Create a Radio
RF24 radio(CE_PIN, CSN_PIN); 

void setup() 
{
  
  // Start up the Serial connection
  while (!Serial);
  Serial.begin(9600);
  
  // Start the Radio!
  radio.begin();
  
  // Power setting. Due to likelihood of close proximity of the devices, set as RF24_PA_MIN (RF24_PA_MAX is default)
  radio.setPALevel(RF24_PA_MAX); // RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  
  // Slower data rate for better range
  radio.setDataRate( RF24_2MBPS ); // RF24_250KBPS, RF24_1MBPS, RF24_2MBPS
  
  // Number of retries and set tx/rx address
  radio.setRetries(15, 15);
  radio.openWritingPipe(rxAddr);

  // Stop listening, so we can send!
  radio.stopListening();
}

void loop() {

  //declaration for encoding the GPS Data
   bool newData = false;
  unsigned long chars;
  unsigned short sentences, failed;
    float  flat, flon;


// For one second we parse GPS data and report some key values
  for (unsigned long start = millis(); millis() - start < 1000;)
  {
    while (ss.available())
    {
      char c = ss.read();
      // Serial.write(c); // uncomment this line if you want to see the GPS data flowing
      if (gps.encode(c)) // Did a new valid sentence come in?
        newData = true;
    }
  }
   
  if (newData)
  {
    //declaration
    String Gruss ="This is a Test";
    float flat, flon;

   //get GPS DATA
      unsigned long age;
    gps.f_get_position(&flat, &flon, &age);
    Serial.print("LAT=");
    Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 8);
    Serial.print(" LON=");
    Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 8);
    Serial.print(" SAT=");
    Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
    Serial.print(" PREC=");
    Serial.println(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());


    //Monitor Check
    Serial.println(Gruss);
    Serial.println();
      int BG = (flat);
      int LG = (flon);
        Serial.println(flat,8);
        Serial.println(flon,8);
        Serial.println(BG);
        Serial.println(LG);
        Serial.println();
       
  }

  //GPS Stats
  gps.stats(&chars, &sentences, &failed);
  Serial.print(" CHARS=");
  Serial.print(chars);
  Serial.print(" SENTENCES=");
  Serial.print(sentences);
  Serial.print(" CSUM ERR=");
  Serial.println(failed);
  
  

  
  /*
  Serial.println("** No GPS-Data received, check Field of View **");
*/
  
  if (chars == 0)
    Serial.println("** No characters received from GPS: check wiring **");





  
  // Set up a message and a timestamp to it using millis()
  String str = "Hello world! "; 
  str += String( millis() );
  
  // http://stackoverflow.com/questions/7383606/converting-an-int-or-string-to-a-char-array-on-arduino
  // Length (with one extra character for the null terminator)
  int str_len = str.length() + 1; 
  
  // Prepare the character array (the buffer) 
  char char_array[str_len];
  
  // Copy it over 
  str.toCharArray(char_array, str_len);

  // Ace, let's now send the message
  radio.write(&char_array, sizeof(char_array));
  
  // Let the ourside world know..
  Serial.print("Sent Message: ");
  Serial.print( char_array );
  Serial.println("");

  // Wait a short while before sending the other one
  delay(2000);
}

"

Die Berechnung/Auswertung der charakters läuft immer wieder auf 0 hinaus, sodass ich den Fehler bekomme Check Wiring.. kann mir jemand sagen wieso und wie ich danach am besten die Daten über den NRF bekomme?
Danke schonmal im Vorraus

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.
mfg ein Moderator.

1 Like

Leider schreibst dunix über deinen Controller, den du verwendest.

Hallo, das ganze soll erstmal über einen Arduino Uno laufen. Später wenn es mal laufen sollte wird das ganze verkleinert, sprich arduino nano oder dergleichen.

Da.
Was geht:

const uint64_t rxAddr[6] = { 1, 2,3,4,5,6, };`

radio.openWritingPipe(rxAddr[0]);

Auch für SoftwareSerial (ss) brauchst du im setup ein begin() mit Angabe der Geschwindigkeit.
Beispiel:
ss.begin(9600);

Und wenn du RX und TX dafü definierst, kannst du die auch verwenden !

Danke das hat schonmal sehr geholfen, habe den ss.begin einfach total vergessen.
Jetzt muss ich nur noch rausfinden wie ich die GPS Position übermitteln kann.

Bisher habe ich noch kein GPS genutzt.
Aber dein Sketch dazu ist noch immer sehr verwirrend.
Mal liest du die SoftwareSerial aus und mal die GPS.
Da komme ich nicht klar.

Nicht ganz Optimized high speed nRF24L01+ driver class documentation: RF24 Class Reference
Entweder

uint8_t addresses[][6] = {"1Node", "2Node"};
radio.openWritingPipe(addresses[0]);

oder

uint8_t address[] = { 0xCC, 0xCE, 0xCC, 0xCE, 0xCC };
radio.openWritingPipe(address);

Was genau ändert sich dadurch? Zzt. Klappt die Kommunikation über den nrf. Ich versuche jetzt die Längen- bzw Breitengrade über diesen zu übertragen.

Ich sagte ja, das sieht für Könner bestimmt schlimm und unübersichtlich aus ^^ Kannst du das näher erklären?

Kannst du denn die GPS-Daten im seriellen Monitor anzeigen ?
Wenn ja, poste bitte wie die aussehen.

Hallo @HotSystems
entschuldige das Warten. Hier habe ich mal ein Update. Ich bin bereits ein gutes Stück weiter gekommen und habe, so wie das so machmal ist, fast alles neu geschrieben xD.
hier mal mein Transmitter Code:

// Load in the libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <printf.h>   
// Set the CE & CSN pins
#define CE_PIN   9
#define CSN_PIN 10


//TinyGPS 
TinyGPS gps;

//Set the GPS RX & TX Pins 
SoftwareSerial ss(4, 3);
static const int RXPin = 4, TXPIN = 3;

//Set GPSBaud
static const uint32_t GPSBaud = 9600; 

// This is the address used to send/receive
const byte rxAddr[5] = {'R','X','A','A','A'};

// Create a Radio
RF24 radio(CE_PIN, CSN_PIN); 

void setup() 
{
  
  // Start up the Serial connection
  while (!Serial);
  Serial.begin(9600);
  ss.begin(GPSBaud);
  // Start the Radio!
  radio.begin();
  
  // Power setting. Due to likelihood of close proximity of the devices, set as RF24_PA_MIN (RF24_PA_MAX is default)
  radio.setPALevel(RF24_PA_MIN); // RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  
  // Slower data rate for better range
  radio.setDataRate( RF24_250KBPS ); // RF24_250KBPS, RF24_1MBPS, RF24_2MBPS
  
  // Number of retries and set tx/rx address
  radio.setRetries(15, 15);
  radio.openWritingPipe(rxAddr);

  // Stop listening, so we can send!
  radio.stopListening();
}

void loop() {

  //declaration 
  bool newData = false;
  unsigned long chars;
  unsigned short sentences, failed;
  float  flat, flon;
  

// For one second we parse GPS data and report some key values
  for (unsigned long start = millis(); millis() - start < 1000;)
  {
    while (ss.available())
    {
      char c = ss.read();
      // Serial.write(c); // uncomment this line if you want to see the GPS data flowing
      if (gps.encode(c)) // Did a new valid sentence come in?
        newData = true;
    }
  }
   
   if (newData)
        {
   //declaration
   float flat, flon;

   //get GPS DATA for Monitor
   unsigned long age;
   gps.f_get_position(&flat, &flon, &age);
   Serial.print("LAT=");
   Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 8);
   Serial.print(" LON=");
   Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 8);
   Serial.print(" SAT=");
   Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
   Serial.print(" PREC=");
   Serial.println(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
   Serial.println("");
     
 //Monitor Check
            

   void send();
    float dataToSend [2];
    dataToSend[0] =flon ;
    dataToSend[1] =flat;
    radio.write(&dataToSend,sizeof(dataToSend));
}


  //get GPS Stats
  gps.stats(&chars, &sentences, &failed);
  /*
  Serial.print(" CHARS=");
  Serial.print(chars);
  Serial.print(" SENTENCES=");
  Serial.print(sentences);
  Serial.print(" CSUM ERR=");
  Serial.println(failed);
  */
  if (chars == 0){
    Serial.println("** No characters received from GPS: check wiring **");
  }

  delay(1000);
}

Hier mein Reciever Code:

// Load up the libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <printf.h> 
// define the pins
#define CE_PIN   9
#define CSN_PIN 10

//TinyGPS 
TinyGPS gps;

//Set the GPS RX & TX Pins 
SoftwareSerial ss(4, 3);
static const int RXPin = 4, TXPIN = 3;

//Set GPSBaud
static const uint32_t GPSBaud = 9600; 

// Create a Radio
RF24 radio(CE_PIN, CSN_PIN); 

// The tx/rx address
const byte rxAddr[5] = {'R','X','A','A','A'};


//declaration

float flat;
float flon;
bool newData = false;

void setup()
{

  // Start the serial
  Serial.begin(9600);
  while(!Serial);
  Serial.println("NRF24L01P Receiver startet, warte auf Datenempfang");
  
  // Start the radio, again set to min & slow as I'm guessing while testing theire really close to each other
  ss.begin(9600);
  ss.begin(GPSBaud);
  radio.begin();
  radio.setPALevel(RF24_PA_MIN);   // RF24_PA_MIN ,RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate( RF24_250KBPS ); // RF24_250KBPS, RF24_1MBPS, RF24_2MBPS
  
  // Set the reading pipe and start listening
  radio.openReadingPipe(1, rxAddr);
  radio.startListening();

 
}

void loop()
{
  
if (radio.available()){
  Serial.println("");
  Serial.println("GPS-Daten:");
  Serial.println("");
  float dataReceived[2];
  radio.read(&dataReceived,sizeof(dataReceived));
  flat = dataReceived[0];
  flon = dataReceived[1];  


  //Monitor Check 
Serial.println("Längengrad:");
Serial.print(dataReceived[0],8);
Serial.println("");
Serial.println("Breitengrad:");
Serial.print(dataReceived[1],8);
Serial.println("");
newData = false;
}
}

Den Receiver Code bearbeite ich zZt. noch damit ich den zweiten GPS Standort dort auch noch auslesen kann.
Im Monitor werden mir jetzt genau die Längen und Breitengrade angezeigt und ich sende diese genau so rüber an den Zweiten (mit einer Genauigkeit von 8 Nachkommastellen) und kann sie dort ebenso ausgeben.

1 Like

Prima, dann funktioniert es jetzt mit der Übertragung.
Danke für deine Rückmeldung.

In deinem ersten Sketch hast du die Variablen Deklaration in der loop() vorgenommen.
Warum ?
Das solltest du besser vor dem Setup vornehmen. So werden die ja bei jedem Loopdurchlauf gelöscht. Soll das so sein ?

1 Like

Also tatsächlich musste ich die deklaration an diese stelle Packen, andernfalls fehlt dem Progrmm diese beim durchlaufen des loops. Kann man möglicherweise besser lösen aber für meine zwecke reicht es vollkommen ^^ aber danke für deine Rückmeldungen und Hilfe :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.