GPS NEO6m + Softwareserial + NRF24L01+ funzt nicht

Hallo zusammen.

Gleich das nächste Problem.
Ich habe einen Nano mit einem GPS NEO6m, welches über Softwareserial an PIN 9 und 10 hängt. Hardwareserial brauche ich für die USB Serial Kommunikation. Das funktioniert jetzt.
Dann ist (u.a.) noch ein nRF24l01+ Funkmodul mit angeschlossen. Und das macht jetzt Probleme. Aus irgendeinem Grund kann ich keine Daten vom GPS bekommen, wenn das nRF24l01+ initialisiert ist. Habe es per Trail&Fail rausbekommen. Wenn ich die initialisierung des RF24 auskommentiere, dann geht das GPS.
Hat das Problem schon mal jemand gehabt?

Gibt es evtl. Probleme mit den Pins? RF24 (6,7…11,12,13) und NEO (9,10)?

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <DHT.h>


//definition
int Pin_RF_CE = 6;
int Pin_RF_CSN = 7;
[b]int Pin_GPS_TX = 9;
int Pin_GPS_RX = 10;[/b]

int Pin_DHT22 = 8;
int Pin_Relay_RPI = 5;
int Pin_Relay_Light = 4;
int Pin_Relay_Alarm = 3;
int Pin_empty = 2;
int Pin_PIR = 10;
int Pin_LRD = A0;
int Pin_Buzzer = A1;

int swtich_what = 0;
unsigned long ldr_timer = millis();

// TO DO

// Buzzer : D* -> Beep if unauthorized access is detected

// PIR

[b]// nRF24L01
  String PiData;
  //for nrf24 debug
  int serial_putc( char c, FILE * ) {
    Serial.write( c );
    return c;
  }
  
  //for nrf24 debug
  void printf_begin(void) {
    fdevopen( &serial_putc, 0 );
  }
  RF24 radio(Pin_RF_CE, Pin_RF_CSN);
  //we only need a write pipe, but am planning to use it later
  const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
  // here we can send up to 30 chars
  char SendPayload[31] = "";
  char receivePayload[32];
  unsigned long dht_timer = millis();[/b]


[b]// GPS Neo 6m : VCC to 5V, GND to GND, RX to 10, TX to 9
  //SoftwareSerial mySerial(Pin_GPS_RX, Pin_GPS_TX);
  SoftwareSerial mySerial(Pin_GPS_RX, Pin_GPS_TX);
  TinyGPS gps;
  void gpsdump(TinyGPS &gps);
  void printFloat(double f, int digits = 2);
  unsigned long currentMillis = 0;[/b]
  
// LDR : D*
// Relay -> Light outside front : D*
// Relay -> Alarm : D*
// Relay -> Raspberry Pi : D*
// DHT 22 : 10kOhm (+ & D), D*
  #define DHTTYPE DHT22   // DHT 22  (AM2302)
  DHT dht(Pin_DHT22, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino


void gpsdump(TinyGPS &gps) {
  long lat, lon;
  float flat, flon;
  unsigned long age, date, time, chars;
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned short sentences, failed;

  // On Arduino, GPS characters may be lost during lengthy Serial.print()
  // On Teensy, Serial prints to USB, which has large output buffering and
  //   runs very fast, so it's not necessary to worry about missing 4800
  //   baud GPS characters.

  gps.f_get_position(&flat, &flon, &age);
  Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
    Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  gps.get_datetime(&date, &time, &age);
  Serial.print("Date(ddmmyy): "); Serial.print(date); Serial.print(" Time(hhmmsscc): ");
    Serial.print(time);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  Serial.print("Date: "); Serial.print(static_cast<int>(month)); Serial.print("/"); 
    Serial.print(static_cast<int>(day)); Serial.print("/"); Serial.print(year);
  Serial.print("  Time: "); Serial.print(static_cast<int>(hour+8));  Serial.print(":"); //Serial.print("UTC +08:00 Malaysia");
    Serial.print(static_cast<int>(minute)); Serial.print(":"); Serial.print(static_cast<int>(second));
    Serial.print("."); Serial.print(static_cast<int>(hundredths)); Serial.print(" UTC +08:00 Malaysia");
  Serial.print("  Fix age: ");  Serial.print(age); Serial.println("ms.");

  Serial.print("Alt(cm): "); Serial.print(gps.altitude()); Serial.print(" Course(10^-2 deg): ");
    Serial.print(gps.course()); Serial.print(" Speed(10^-2 knots): "); Serial.println(gps.speed());
  Serial.print("Alt(float): "); printFloat(gps.f_altitude()); Serial.print(" Course(float): ");
    printFloat(gps.f_course()); Serial.println();
  Serial.print("Speed(knots): "); printFloat(gps.f_speed_knots()); Serial.print(" (mph): ");
    printFloat(gps.f_speed_mph());
  Serial.print(" (mps): "); printFloat(gps.f_speed_mps()); Serial.print(" (kmph): ");
    printFloat(gps.f_speed_kmph()); Serial.println();

  gps.stats(&chars, &sentences, &failed);
  Serial.print("Stats: characters: "); Serial.print(chars); Serial.print(" sentences: ");
    Serial.print(sentences); Serial.print(" failed checksum: "); Serial.println(failed);
}




//_____________________________________________________________________________________________________

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

  mySerial.begin(9600);
  delay(1000);
  Serial.println("uBlox Neo 6M");
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println();

[b]//  printf_begin();
//  //nRF24 configurations
//  radio.begin();
//  radio.enableDynamicPayloads();
//  radio.setChannel(20);
//  radio.setAutoAck(true);
//  radio.enableAckPayload();
//  radio.setRetries(15, 15);
//  radio.setDataRate(RF24_250KBPS);
//  radio.setPALevel(RF24_PA_LOW);
//  radio.setCRCLength(RF24_CRC_8);
//  radio.setPayloadSize(32);
//  radio.openWritingPipe(pipes[0]);
//  radio.openReadingPipe(1, pipes[1]);
//  radio.startListening();
//  radio.printDetails(); //for Debugging[/b]

  dht.begin(); 

  pinMode(Pin_Buzzer, OUTPUT);
  pinMode(Pin_LRD, INPUT);
  pinMode(Pin_DHT22, INPUT);
  

}

void loop() {
  bool timeout = 0;
  unsigned long send_time, rtt = 0;
  bool newdata = false;
  unsigned long start = millis();
  

  //SERIAL RECEIVER
  while (Serial.available() > 0) {
    String serial_receive = Serial.readString();
    Serial.println("Received Serial: " + serial_receive);
    if ( serial_receive == "get_sensor_data" ) {
      Serial.println("DHT|" + String(dht.readTemperature()) + "|" + String(dht.readHumidity()) );
      delay(50);
      Serial.println("LDR|" + String(get_LDR_value()));
      delay(50);
    }
    else if ( serial_receive == "get_gps_data" ) {
[b]      unsigned long start = millis();
      Serial.println("Get GPS Data...");
      while (millis() - start < 10000) {
        if (mySerial.available()) {
          char c = mySerial.read();
          //Serial.print(c);  // uncomment to see raw GPS data
          if (gps.encode(c)) {
             gpsdump(gps);
             break;
          }
        }
      }[/b]
    }
  }

//  currentMillis = millis();
//
//  //wait response
//  radio.startListening();
//  delay(20);
//  while ( radio.available() && !timeout) {
//    uint8_t len = radio.getDynamicPayloadSize();
//    Serial.print("Received Len ");
//    Serial.println(len);
//    if (len == 0) {
//      break;
//    }
//    radio.read( receivePayload, len);
//
//    Serial.print("Received ");
//    Serial.println(receivePayload);
//    //Send data back
//    radio.stopListening();
//    delay(50);
//    radio.write( receivePayload, strlen(receivePayload));
//
//    String arduino_id = getValue(receivePayload, '|', 0);
//    Serial.println(arduino_id);
//    delay(20);
//    if (arduino_id == "12") {
//      swtich_what = atoi (getValue(receivePayload, '|', 1).c_str ()); //light_status - 1 = on, 0 = off, -1 = no change
//      Serial.println(swtich_what);
//
//      //HEATING FAN
////      if (swtich_what == 3) {
////        relay_heating_fan_status = atoi (getValue(receivePayload, '|', 2).c_str ()); //fan_status - 1 = on, 0 = off, -1 = no change
////        Serial.println(relay_heating_fan_status);
////        if (relay_heating_fan_status == 1) {
////          digitalWrite(relay_heating_fan, HIGH);
////        }
////        else if (relay_heating_fan_status == 0) {
////          digitalWrite(relay_heating_fan, LOW);
////        }
////      }
//    }
//    memset(receivePayload, 0, sizeof(receivePayload));
//    delay(10);
//  } // End while

}

(PS: Code gekürzt, da der Post sonst zu lang gewesen wäre. Die fetten Stellen sind die relevanten.)

Setze deinen Sketch und Fehlermeldung mal in Code-Tags, so kann man den mobil nicht vernünftig bis garnicht lesen.
Das kannst du auch noch nachträglich machen.
Sketch markieren und Schaltfläche </> klicken.

Du verwendest Pin D10 doppelt.
Für Software-Serial und als Input für den Pir.
Da gibt es Probleme, mehr kann ich aktuell nicht sehen.

Hallo HotSystems.

Oh ich habe quote statt code genommen. Hab es geändert.

Eine Fehlermeldung gibt es nicht. Wenn ich den nrf24l01+ initiallisiere (ist oben Auskommentiert) dann erhalte ich vom NEO keine Daten. Kommentiere ich es aus (wie oben) dann erhalte ich die Daten vom NEO.

Der Pir war noch nicht angeschlossen und es gab auch noch keinen Code dazu. Daran kann es nicht liegen. Aber danke für den Hinweis.

HeAdLeSs:
Hallo HotSystems.

Oh ich habe quote statt code genommen. Hab es geändert.

Eine Fehlermeldung gibt es nicht. Wenn ich den nrf24l01+ initiallisiere (ist oben Auskommentiert) dann erhalte ich vom NEO keine Daten. Kommentiere ich es aus (wie oben) dann erhalte ich die Daten vom NEO.

Der Pir war noch nicht angeschlossen und es gab auch noch keinen Code dazu. Daran kann es nicht liegen. Aber danke für den Hinweis.

Doch, auch ohne Pir und weiterem Code kann es Problem geben, da der Eingangspin floatet und damit auch auf HIGH gehen kann.
Ich sehe mir den Sketch gleich nochmal an.

Ich vermute, irgendwas liefert noch auf D10 ein Signal.
Du kannst doch zum Testen für Software-Serial auch andere Pins verwenden.

Ich habe die Pins jetzt explizit auf Input/Output gesetzt

  pinMode(Pin_GPS_TX, OUTPUT);
  pinMode(Pin_GPS_RX, INPUT);

Brachte aber keine Veränderung.

Es stimmt auch nicht so ganz das der Arduino vom NEO nichts bekommt. Er scheint noch ein paar Daten zu erhalten, bevor er 'abstirbt'. Ich vermute bevor irgendwas initialisiert wird.

Ein Auszug aus dem Serial Monitor:

uBlox Neo 6M
Testing TinyGPS library v. 13

STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1 = 0xf0f0f0f0e1 0xf0f0f0f0d2
RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
TX_ADDR = 0xf0f0f0f0e1
RX_PW_P0-6 = 0x20 0x20 0x00 0x00 0x00 0x00
EN_AA = 0x3f
EN_RXADDR = 0x02
RF_CH = 0x14
RF_SETUP = 0x23
CONFIG = 0x0b
DYNPD/FEATURE = 0x3f 0x06
Data Rate = 250KBPS
Model = nRF24L01+
CRC Length = 8 bits
PA Power = PA_LOW
DHT|25.20|14.20
LDR|997

LDR|995
DHT|25.20|14.20
LDR|995
DHT| NAN| NAN
LDR|996
DHT|25.20|14.10
Received Serial: get_gps_data
Get GPS Data...
$GPRMC,115038.00,A,5210.99493,N,01146.68919,E,0.028,,180318,,,D
DHT|25.20|14.10
LDR|995
Received Serial: get_gps_data
Get GPS Data...
DHT|25.20|14.40
LDR|995
Received Serial: get_gps_data
Get GPS Data...
Received Serial: get_gps_data
Get GPS Data...

Das sieht man das er noch ein paar Daten ausspuckt und danach nie wieder.

Ich habe auch radio.stopListening(); versucht. Hat auch nichts gebracht.

Ich habe keine Digital Pins mehr frei. Und es ist schon verlötet ^^ :frowning: Würde jetzt ungern noch mal anfangen mit Rumlöten.
Man kann aber Analoge Pins auch als digitale nehmen, richtig?

Die RX/TX-Pins für Software-Serial brauchst du nicht extra zu definieren, das passiert so in der Library.
Ja, die Analogen Pins ( nicht A6 und A7) kannst du auch als digitale verwenden.

Das du schon alles verlötet hast, ist natürlich schlecht.
Sowas macht man, wenn alles fertig ist und funktioniert.
Es sei denn, es ist ein Prototyp, an dem weiter entwickelt wird.

Um den Fehler zu finden, kommst du wohl nicht drum herum.

Du hast recht. Es lag an den Pins. Bin jetzt auf A2 und A3 und es funktioniert jetzt. Kurios. Naja.

Ich weiß, eigentlich testet man es erst einmal. Aber kann ja keiner ahnen das es so nicht funktioniert :slight_smile:

Danke für deine Hilfe!

HeAdLeSs:
Du hast recht. Es lag an den Pins. Bin jetzt auf A2 und A3 und es funktioniert jetzt. Kurios. Naja.

Ich weiß, eigentlich testet man es erst einmal. Aber kann ja keiner ahnen das es so nicht funktioniert :slight_smile:

Danke für deine Hilfe!

Alles klar.
Prima dass es jetzt funktioniert und danke für die Rückmeldung.