GSM und GPS Modul

Hallo Leute

Ich bin aktuell an meiner Projektarbeit für die Technikerschule zugange.
Allerdings komme ich an einen gewissen Punkt nicht weiter.

Es geht um folgene Bauteile:

https://www.reichelt.de/entwicklerboards-gps-breakout-platine-mtk3339-debo-gps-p235482.html?&trstct=pos_0&nbc=1

Das GPRS Shield hat mir mein Dozent zur Verfügung gestellt.

Ich kann unabhängig von einander alles verwenden wie es geplant ist allerdings nicht zusammen mit dem GPRS Shield und dem GPS Modul.

Solange ich eine GPS bzw. GSM.begin Zeile weglasse geht es nur in Verbindung eben nicht.

Wäre über jeden Tipp froh. Ich denke ich stehe irgendwo einfach auf dem Schlauch.
Vielen Dank vorab.

Code ist unterhalb.

Hallo Leute

Ich bin aktuell an meiner Projektarbeit für die Technikerschule zugange. 
Allerdings komme ich an einen gewissen Punkt nicht weiter.

Es geht um folgene Bauteile:

https://www.reichelt.de/entwicklerboards-gps-breakout-platine-mtk3339-debo-gps-p235482.html?&trstct=pos_0&nbc=1

https://www.ebay.de/itm/DTMF-Enabled-SIM900-GPRS-GSM-Shield-for-Arduino-UNO-Rev3-AIRduino-/111211126120

Das GPRS Shield hat mir mein Dozent zur Verfügung gestellt. 

Ich kann unabhängig von einander alles verwenden wie es geplant ist allerdings nicht zusammen mit dem GPRS Shield und dem GPS Modul.

Solange ich eine GPS bzw. GSM.begin Zeile weglasse geht es nur in Verbindung eben nicht.

Wäre über jeden Tipp froh. Ich denke ich stehe irgendwo einfach auf dem Schlauch.
Vielen Dank vorab.

Code ist unterhalb.


[code]
void setup() {

  Wire.begin();
  Wire.beginTransmission(0x68);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);
   
   
   Serial.begin(9600);
   Serial.println(F("Startup"));
   /*while (!GPS.begin(9600)) {
      Serial.println(F("GPS notready"));
      delay(1000);
  }*/
 

 /*// GPS.sendMTKcommand(220, F(",1000"));     // 220 PMTK_API_SET_FIX_CTL (MTK3339)
    GPS.sendMTKcommand(300, F(",1000,0,0,0,0"));  // 300 PMTK_API_SET_FIX_CTL
    GPS.sendMTKcommand(225, F(",0"));       // 225 PMTK_SET_PERIODIC_MODE
    // GPS.sendMTKcommand(353, F(",1,0,0,0,0"));
    GPS.sendMTKcommand(351, F(",1"));       // 351 PMTK_API_SET_SUPPORT_QZSS_NMEA
    GPS.sendMTKcommand(314, F(",0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"));
    delay(5000);*/

   
  if(gsm.begin(9600)){
    Serial.println("\nstatus=Ready");
   }
  else{
    Serial.println("\nstatus=IDLE");
  }
  

 /* u8g.firstPage();  
   do {
    titelbild();
   } while( u8g.nextPage() );*/
   
  
}

Es geht nicht, ist eine SUPER Aussage, mit der wir nicht anfangen können.

Beschreibe doch mal genau, was geht und was nicht geht.
Wie du es getestet hast und was dann passiert.

Bedenke bitte, wir können nicht auf deinen Arbeitstisch sehen.

Mein Fehler, Sorry.

Also ich will mit dem GSM Modul einen Anruf tätigen und eine SMS versenden wenn eine SMS angekommen ist.
Mit dem GPS Modul lese ich Koordinaten aus die dann später mal in der SMS stehen die versendet wird.

Arduino + GPS modul funktioniert. Ich bekomme alle Werte und kann diese verarbeiten.

Arduino + GPRS Shield funktioniert. Ich kann Anrufe tätigen Sms versenden wie ich lustig bin.

Arduino + GPRS Shield + GPS modul funktioniert nicht. Es wird nur das GPRS Shield verarbeitet.
Das GPS Modul wird quasi ausgelassen.
Wenn ich jedoch die Zeile mit dem GSM.begin(9600) ausklammere dann funktioniert das GPS Modul wieder wie gewollt.

Ich habe eventuell vermutet da beide Module mit SoftwareSerial angesteuert werden das es eventuell da Probleme mit der seriellen Kommunikation gibt. Da scheitern meine Kenntnisse allerdings schon.

Zur grundsätzlichen Funktionsweise :

Es soll ein Notfallarmband sein. Sprich jemand fällt hin, was der Gyro Sensor erkennt. Daraufhin wird ein Anruf getätigt. Und bei ankommender SMS schickt das Armband eine SMS mit den Koordinaten zurück.

dedox:
.....
Ich habe eventuell vermutet da beide Module mit SoftwareSerial angesteuert werden das es eventuell da Probleme mit der seriellen Kommunikation gibt. Da scheitern meine Kenntnisse allerdings schon.

Und wozu hast du dann im Anfangs I2C initiiert ?
Das brauchst du doch dann nicht, oder ?

Du kannst auch 2 mal mit SoftwareSerial arbeiten, musst dafür nur 2 Instanzen definieren.

Was du nicht darfst, ist die Verwendung von SoftwareSerial auf dem HardwareSerial-Port.
Das geht sicher schief, erst Recht wenn du beide Module darauf laufen laasen willst.
Nimm jeweils 2 eigene Pins dafür.

Also trenne die beiden Schnittstellen und du hast weniger Probleme.

Und poste den kompletten Sketch.

Fragmente sind meist großer Mist.

Danke HotSystems für deine Antwort.

Das I2C ist für den Gyro Sensor um den Fall zu erkennen.

Das GPRS Modul ist auf Pin 2,3.

Das GPS Modul ist auf Pin 5,6.

Ganzer Code siehe unten

#include <Wire.h>
#include "SIM900.h"
#include "call.h"
#include "sms.h"
#include <Arduino.h>
#include <SoftwareSerial.h>
//#include "U8glib.h"



#define LED_BUILTIN     13
#define GPS_TX        6
#define GPS_RX        5
#define GPS_PPS       4


#include "GPS_MTK333X_SoftwareSerial.h"
GPS_MTK333X_SoftwareSerial GPS(GPS_RX, GPS_TX);


//U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);
SMSGSM sms;
CallGSM call;

#define SDA_PORT PORTC
#define SDA_PIN 4
#define SCL_PORT PORTC
#define SCL_PIN 5

char sms_position;
char sms_text[10]="Hallo1";
//char c[10]="Hallo1";
char buffer[30];
int i;
String Uhrzeit;

int numdata;
boolean started=false;
boolean hilfe=false;

int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
float AX = 0, AY = 0, AZ = 0, GY = 0, GX = 0, GZ = 0;

boolean Fall = false; //stores if a fall has occurred
boolean trigger1 = false; //stores if first trigger (lower threshold) has occurred
boolean trigger2 = false; //stores if second trigger (upper threshold) has occurred
boolean trigger3 = false; //stores if third trigger (orientation change) has occurred

byte trigger1counter = 0; //stores the counters past since trigger 1 was set true
byte trigger2counter = 0; //stores the counters past since trigger 2 was set true
byte trigger3counter = 0; //stores the counters past since trigger 3 was set true
int Winkel = 0;
float lati;
float longi;





void setup() {

  Wire.begin();
  Wire.beginTransmission(0x68);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);
   
   
   Serial.begin(9600);
   Serial.println(F("Startup"));
   /*while (!GPS.begin(9600)) {
      Serial.println(F("GPS notready"));
      delay(1000);
  }*/
 

 /*// GPS.sendMTKcommand(220, F(",1000"));     // 220 PMTK_API_SET_FIX_CTL (MTK3339)
    GPS.sendMTKcommand(300, F(",1000,0,0,0,0"));  // 300 PMTK_API_SET_FIX_CTL
    GPS.sendMTKcommand(225, F(",0"));       // 225 PMTK_SET_PERIODIC_MODE
    // GPS.sendMTKcommand(353, F(",1,0,0,0,0"));
    GPS.sendMTKcommand(351, F(",1"));       // 351 PMTK_API_SET_SUPPORT_QZSS_NMEA
    GPS.sendMTKcommand(314, F(",0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"));
    delay(5000);*/

   
  if(gsm.begin(9600)){
    Serial.println("\nstatus=Ready");
   }
  else{
    Serial.println("\nstatus=IDLE");
  }
  

 /* u8g.firstPage();  
   do {
    titelbild();
   } while( u8g.nextPage() );*/
   
  
}

void loop() {
  
  if (GPS.check() && GPS.isTimeUpdate()) {
        bool f = GPS.isStatusUpdate();
        GPSInfo_t gpsInfo = GPS.value();
        Serial.print(gpsInfo.date, HEX);
        Serial.write(' ');
        Serial.print(gpsInfo.time, HEX);
        Serial.write(' ');
        if (f) {
            Serial.print(gpsInfo.satellites, DEC);
            Serial.write(' ');
            Serial.print(gpsInfo.dop / 100.0);
            Serial.write(' ');
            Serial.println(gpsInfo.latitude / 600000.0, 6);
            float a = (gpsInfo.latitude);
            float lati = (gpsInfo.latitude / 600000.0);
            Serial.println(a);
            Serial.println(lati,6);
            Serial.write(' ');
            Serial.println(gpsInfo.longitude / 600000.0, 6);
            float b = (gpsInfo.longitude);
            float longi = (b / 600000.0);
            Serial.println(b);
            Serial.println(longi,6);
            Serial.write(' ');
            Serial.print(gpsInfo.altitude / 100.0);
            Serial.write(' ');
            Serial.print(gpsInfo.speed * 0.01852);
            Serial.write(' ');
            Serial.print(gpsInfo.course / 100.0);
            Serial.write(' ');
        }
        Serial.println();
    }

  mpu_read();


  AX = (AcX + 3652) / 16384.00;
  AY = (AcY - 1785) / 16384.00;
  AZ = (AcZ - 973) / 16384.00;
  GX = (GyX + 32) / 131.00;
  GY = (GyY - 35) / 131.00;
  GZ = (GyZ - 15) / 131.00;

 
  float Roh_Geschwindigkeit = pow(pow(AX, 2) + pow(AY, 2) + pow(AZ, 2), 0.5);
  int Geschwindigkeit = Roh_Geschwindigkeit * 10; // Mit 10 Multiplizieren um IF-Bedingung mit besseren Werten zu nutzen.
  Serial.println(Geschwindigkeit);
  

  

  if (Geschwindigkeit <= 2 && trigger2 == false) { //if AM breaks lower threshold (0.4g)
    trigger1 = true;
    Serial.println("trigger 1 AKTIVIERT");
  }

  if (trigger1 == true) {
    trigger1counter++;
    if (Geschwindigkeit >= 12) { //if AM breaks upper threshold (3g)
      trigger2 = true;
      Serial.println("trigger 2 AKTIVIERT");
      trigger1 = false; trigger1counter = 0;
    }
  }

  if (trigger2 == true) {
    trigger2counter++;
    //Winkel=acos(((double)x*(double)bx+(double)y*(double)by+(double)z*(double)bz)/(double)AM/(double)BM);
    Winkel = pow(pow(GX, 2) + pow(GY, 2) + pow(GZ, 2), 0.5); //Serial.println(Winkel);
    if (Winkel >= 30 && Winkel <= 400) { //if orientation changes by between 80-100 degrees
      trigger3 = true; trigger2 = false; trigger2counter = 0;
      Serial.println(Winkel);
      Serial.println("trigger 3 ACTIVIERT");
    }
  }

  if (trigger3 == true) {
    trigger3counter++;
    Serial.println(trigger3counter);
    if (trigger3counter >= 10) {
      Winkel = pow(pow(GX, 2) + pow(GY, 2) + pow(GZ, 2), 0.5);
      delay(10);
      Serial.println(Winkel);
      if ((Winkel >= 0) && (Winkel <= 10)) { //if orientation changes remains between 0-10 degrees
        Fall = true; trigger3 = false; trigger3counter = 0;
        Serial.println(Winkel);
      }
      else { //user regained normal orientation
        trigger3 = false; trigger3counter = 0;
        Serial.println("trigger 3 DEACTIVIERT");
      }
    }
  }

  if (trigger1counter >= 6) { //allow 0.5s for AM to break upper threshold
    trigger1 = false; trigger1counter = 0;
    Serial.println("trigger 1 DEAKTIVIERT");
  }

  if (trigger2counter>=6) { //allow 0.5s for orientation change
    trigger2 = false; trigger2counter = 0;
    Serial.println("trigger 2 DEAKTIVIERT");
  }


  if (Fall==true) { 
    Serial.println("FALL DETECTED");
     call.Call("015770885359");
     Fall=false;  
     hilfe=true;
  }
     
   if(hilfe==true){
      
      sms_position=sms.IsSMSPresent(SMS_UNREAD);
         if (!sms_position){} 
        else{
            Serial.print("SMS postion:");
            Serial.println(sms_position,DEC);
            sms.GetSMS(sms_position,"015770885359", sms_text, 100);
            // now we have phone number string in phone_num
            Serial.println("015770885359");
            // and SMS text in sms_text
            Serial.println(sms_text);
            started=true;
        }
        delay(1000);
        
    
    }   
  
  
   if(started==true){ 
      buffer[40] = ("https://www.google.de/maps/place/%f,%f",lati,longi);
        
        
        if (sms.SendSMS("015770885359",buffer)){
        //Serial.println("\nSMS sent OK");
        hilfe=false;
       
       //if NO SPACE ,you need delte SMS  from position 1 to position 20
       //please enable this four lines
       
        sms.DeleteSMS(i);
        started=false;
       }}
  delay(100);
}

    

 




void mpu_read() {
  Wire.beginTransmission(0x68);
  Wire.write(0x3B);  // starte mit Register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(0x68, 14, true); // 14 Register
  AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
  AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
}


/*void draw(void) {
  
  u8g.setFont(u8g_font_unifont);
  u8g.drawStr( 52, 36, "SOS");
  u8g.drawStr( 18, 60, "Anruf waehlt..");
  u8g.drawCircle(64,30,18);
}*/

/*void titelbild(void){
  u8g.setFont(u8g_font_unifont);
  u8g.drawStr( 20, 20, "Projektarbeit");
  u8g.drawStr( 50, 40, "2020");
  u8g.drawStr( 20, 60, "Dennis Dorow");
  
}*/

Sorry, aber durch deinen Sketch steig ich nicht durch.
Da läuft zu viel durcheinander und das ohne ausreichend Dokumentation.

Was ich vermute, deine Module werden unkontrolliert seriell angesprochen und das kann das Problem sein.

Du kannst immer nur eine Sache zur Zeit mit SoftwareSerial machen. Danach die nächste.