SIM900 + Neo 6m GPS modul

Moin

habe ein Problem, benutze 2x SoftwareSerial

SoftwareSerial SIM900(7, 8); SoftwareSerial GPS(3, 4);

starte im void setup() beide

SIM900.begin(9600); GPS.begin(9600);

Möchte per sms die gps Daten zugesendet bekommen.

Mein Problem ist, ich kann die nicht einzeln nacheinander auslesen.

habe schon versucht mit listen(); zu arbeiten aber komme nicht weiter.

Hat jmd eine Idee?

   SIM900.listen();
    if (SIM900.available() > 0)
    {
      inchar = SIM900.read();
      if (inchar == '#')
      {
        delay(10);

        inchar = SIM900.read();
        if (inchar == 'g')
        {
          delay(10);
          inchar = SIM900.read();
          if (inchar == 'p')
          {
            GPS.listen();
            while (GPS.available() > 0)
              if (gps.encode(ss.read()))
                gpsdaten();
            if ( z == true) {
              SIM900.listen();
              sendSMS();
            }
          }
          else if (inchar == '1')
          {
            Serial.print("1");
          }
          delay(10);
          SIM900.println("AT+CMGD=1,4"); // delete all SMS
        }
      }
    }
  }

Poste bitte den kompletten Sketch. Mit Fragmenten können wir nichts anfangen.

#include <SoftwareSerial.h>
#include <TinyGPS++.h>



static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;

char inchar; // Will hold the incoming character from the GSM shield


SoftwareSerial SIM900(7, 8);
SoftwareSerial ss(RXPin, TXPin);



TinyGPSPlus gps;


void setup()
{
  pinMode(2, INPUT);
  pinMode(4, OUTPUT);




  Serial.begin(9600);


  SIM900.begin(9600);
  ss.begin(GPSBaud);

  SIM900.print("AT+CMGF=1\r"); // set SMS mode to text
  delay(100);
  SIM900.print("AT+CNMI=2,2,0,0,0\r");
  // blurt out contents of new SMS upon receipt to the GSM shield's serial out
  delay(100);
  Serial.println("Ready...");
}

boolean A ;
boolean B ;
boolean z = false;

void displayInfo()
{
  //Serial.print(F("Location: "));


  A = gps.location.lat();
  // Serial.print(F(","));
  B = gps.location.lng();

  z = true;
}


void sendSMS() {
  //  lcd.setCursor(0, 1);
  SIM900.print("AT+CMGF=1\r");
  Serial.println("SMS wird gesendet");
  delay(100);
  SIM900.println("AT + CMGS = \"---------------\"");
  delay(100);
  SIM900.println(A + B);
  delay(100);
  SIM900.println((char)26);
  delay(100);
  SIM900.println();
  delay(5000);
}

void loop()
{
  if (z == false) {
    Serial.println("vor listen SIM900");
    SIM900.listen();
    Serial.println("nach listen SIM900");
    if (SIM900.available() > 0)
    {
      Serial.println("nach avail");
      inchar = SIM900.read();
      if (inchar == '#')
      {
        delay(10);

        inchar = SIM900.read();
        if (inchar == 'g')
        {
          delay(10);
          inchar = SIM900.read();
          if (inchar == 'p')
          {
            Serial.println("Nach sms empfang");
            ss.listen();
            while (ss.available() > 0)
              Serial.println("nach ss avaib");
            if (gps.encode(ss.read()))
              Serial.println("nach encode");
            displayInfo();
            if ( z == true) {
              SIM900.listen();
              Serial.println(A);
              Serial.println(B);
              // sendSMS();
            }
          }
          else if (inchar == '1')
          {
            Serial.print("1");
          }
          delay(10);
          SIM900.println("AT+CMGD=1,4"); // delete all SMS
        }
      }
    }
  }
}

SerialMonitor:

vor listen SIM900
nach listen SIM900
nach avail
Nach sms empfang
0
0

DAS Problem nun erhalte keine GPS Daten zum Schluss

Dann baue deinen Sketch mal so auf, dass du nur den GPS drin hast. Funktioniert es dann ?

Bei der TinyGPS-Library ist sicher ein Beispiel dabei, nachdem du es testen kannst.

Eins zur Zeit funktioniert heißt

Wenn ich nur GPS abfrage funktioniert ist genau so anders rum

Kombiniert zsm gehen die beiden nicht

Greifen beide auf tx rx zur gleichen Zeit zu obwohl ich sie extra definiert habe und abfrage.

Habe es schon mit den listen Befehl versucht ohne Erfolg.

Sie sollen am besten nacheinander zu greifen

Wenn ich zu Hause bin, sehe ich mir den genauer Sketch an.

Edit: Grad eben mal überflogen.

Den Pin D4 hast du doppelt verwendet, als Output, warum ?

Den darfst du nur einem definieren.

Habe das umgeändert auf 0 und 1 also gps läuft auf 0 und 1 und sim900 auf 7 und 8 keine Änderung

Und D0 und D1 darfst du nicht verwenden, die werden vom USB-Wandler verwendet.
Zumindest bei Uno, Nano und kompatiblen.

Okay ich werde morgen mich mal ran setzten und andere pins verwenden. Werde dann bescheid geben

Habe den Code nun bisschen umgeschrieben bekomme hin das er einzeln die ports ließt.

Der code reagiert nun auf eine SMS und geht dann ins DisplayInfo() rein. Dort sollte er die GPS Daten auslesen und in die Variable A bzw B speichern bzw. im Seriellen Monitor ausgeben.

Dieses tut er auch aber GPS Signal lautet dann 0.00000 0.0000000/b]
Serieller Monitor
Ready…
SMS wird gesendetLocation: 0.000000
,0.000000
wo liegt mein Fehler hat jmd eine Idee?
```
**#include <SoftwareSerial.h>
#include <TinyGPS++.h>

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;

TinyGPSPlus gps;

char inchar; // Will hold the incoming character from the GSM shield

SoftwareSerial SIM900(7, 8);
SoftwareSerial ss(RXPin, TXPin);

int A;
int B;

void setup()
{

Serial.begin(9600);

SIM900.begin(9600);
  ss.begin(GPSBaud);

SIM900.print(“AT+CMGF=1\r”); // set SMS mode to text
  delay(100);
  SIM900.print(“AT+CNMI=2,2,0,0,0\r”);
  // blurt out contents of new SMS upon receipt to the GSM shield’s serial out
  delay(100);
  Serial.println(“Ready…”);
}

void sendSMS() {
  //  lcd.setCursor(0, 1);
  SIM900.print(“AT+CMGF=1\r”);
  Serial.println(“SMS wird gesendet”);
  delay(100);
  SIM900.println("AT + CMGS = “+4917632289652"”);
  delay(100);
  SIM900.println(“AUTO befinden sich :”);
  delay(100);
  SIM900.println((char)26);
  delay(100);
  SIM900.println();
  delay(5000);
}

int b3 = true;

void displayInfo()
{
  ss.listen();
  Serial.print(F("Location: "));

for (int i = 0; i < 50; i++) {
    Serial.println(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.println(gps.location.lng(), 6);
  }
}

void loop()
{
  SIM900.listen();
  if (SIM900.isListening()) {

if (SIM900.available() > 0) {
      if (b3 == true) {
        //Serial.println(“AB 1”);
        //Ließt die Daten aus als ‘char’ heißt glaube ich nur eins zur Zeit
        inchar = SIM900.read();
        //Serial.println(inchar);
        if (inchar == ‘#’) {
          delay(10);
          // Serial.println("---------------------------------------");
          // b3 = false;
          inchar = SIM900.read();
          if (inchar == ‘g’) {
            delay(10);
            inchar = SIM900.read();
            if (inchar == ‘p’) {
              delay(10);
              inchar = SIM900.read();
              if (inchar == ‘s’) {
                Serial.print(“SMS wird gesendet”);
                ss.listen();
                delay(1000);
                //sendGPSSMS();
              }
              delay(10);
              SIM900.println(“AT+CMGD=1,4”); // delete all SMS
              b3 = true;
            }
          }
        }
      }
    }
    // This sketch displays information every time a new sentence is correctly encoded.

//ss.listen();
    if (ss.isListening()) {
      while (ss.available() > 0)
        if (gps.encode(ss.read()))
          ss.listen();
      displayInfo();
      Serial.println(A);

if (millis() > 5000 && gps.charsProcessed() < 10)
      {
        Serial.println(F(“No GPS detected: check wiring.”));
        while (true);
      }
    }
  }
}**
```
mit ein einfachen GPS Code ist GPS vorhanden liegt also nicht an der Verbindung :slight_smile:

Weiß keiner weiter?

enrique1995: Weiß keiner weiter?

Ich kenne mich mit GPS nicht aus, aber wenn du schreibst, es funktioniert mit einem einfachen GPS-Sketch, dann muss es an deinem Zusammenbau des Sketches liegen.

Trenne doch einfach mal den Sketch in Funktionen auf, dann kannst du es besser testen.

Beispiel:

void Loop() {
SMS();
GPS();
}

void SMS() {
// hier deinen SMS-Code einsetzen
}

void GPS() {
// hier deinen GPS-Code einsetzen
}

So kannst du leichter deine einzelnen Funktionen testen und alles was du dann nicht brauchst mit "//" entfernen.