GPS Daten auf SD-Karte speichern (sim808 & AzDelivery Datalogger)

Hallo,

ich möchte mit dem DFRobot sim808 Shield GPS Daten mit dem AzDelivery Datalogger Shield auf der SD Karte speichern.

GPS Sensor funktioniert(bekomme Daten) und der Datalogger funktioniert ebenfalls unabhängig voneinander.

Wenn ich nun ein Sketch schreibe indem ich GPS Daten auf der SD-Karte speichern will, so empfange ich keine GPS Daten mehr. Daten von anderen Sensoren bekomme ich weiterhin.

So wie ich es zurzeit einschätze liegt es daran, dass die beiden Shields die gleichen Pins benutzen.
Datalogger benutzt Pins 10-13 und der sim808 die Pins 0,1(Daten) und 12(ein/ausschalten).

Sobald ich den Befehl: File dataFile = SD.open(“datalog.txt”, FILE_WRITE);
im Sketch habe, so empfange ich keine GPS Daten mehr.

Bin für jede Hilfe dankbar!

#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>
#include <SPI.h>
#include <SD.h>

DFRobot_SIM808 sim808(&Serial);

const int chipSelect = 10;

void setup() {
  //mySerial.begin(9600);
  Serial.begin(9600);
  
  Serial.print("Initializing SD card...");

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    while (1);
  }
  Serial.println("card initialized.");

  //******** Initialize sim808 module *************
  while(!sim808.init()) { 
      delay(1000);
      Serial.print("Sim808 init error\r\n");
  }

  //************* Turn on the GPS power************
  if( sim808.attachGPS())
      Serial.println("Open the GPS power success");
  else 
      Serial.println("Open the GPS power failure");
}

float breite = 0;
float laenge = 0;

void loop() {
   //************** Get GPS data *******************
   if (sim808.getGPS()) {
    
    Serial.print("Breitengrad :");
    breite = sim808.GPSdata.lat;
    Serial.println(breite);

    Serial.print("Längengrad :");
    laenge = sim808.GPSdata.lon;
    Serial.println(laenge);

    //************* Turn off the GPS power ************
    sim808.detachGPS();
  }

  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  
  //weiterer Code für SD Speicherung...
}

Welche seriellen Pins verwendet das GSM-Modul mit der SoftwareSerial ? Ich vermute auch den Pin D10.

Moin Dieter,

in diesem Handbuch haben wir gelesen, dass er die Pins D0 und D1 für die GPS-Daten nutzt. D12 wird zum ein und ausschalten des GPS-Moduls benutzt. Wie kann man denn herausfinden welcher SoftwareSerial genutzt wird? Im Internet finden wir so nichts.

Danke im voraus! :-)

sim808 Handbuch

Welche Pins von SoftwareSerial verwendet werden, steht in der Library “DFrobot_SIM808.h”

Da musst du nachschauen.

Wir finden leider keine Pinbelegung von SoftwareSerial in der Library, vielleicht findest du da ja etwas.
Die Datei findest du im Anhang.

Wäre super wenn wir das zusammen hinbekommen, du rettest vielleicht unser Studium! :smiley:

DFRobot_sim808.h (11.7 KB)

Glizzy: Wir finden leider keine Pinbelegung von SoftwareSerial in der Library, vielleicht findest du da ja etwas. Die Datei findest du im Anhang.

Wäre super wenn wir das zusammen hinbekommen, du rettest vielleicht unser Studium! :-D

Ok, sorry...das sollte in der *.cpp sein.

Wo habt ihr denn das GSM angeschlossen ? Ups...grad noch gesehen, an D0 und D1, das ist allerdings auch nicht gerade optimal.

Wozu dann überhaupt SoftwraeSerial ?

Das ist alles noch etwas Neuland für uns, könnte es der folgende Code sein:

DFRobot_SIM808::DFRobot_SIM808(HardwareSerial *mySerial)
{
    inst = this;	
	serialFlag = 1;
	hgprsSerial = mySerial;
    sim808_init(mySerial, 1);
}

DFRobot_SIM808::DFRobot_SIM808(SoftwareSerial *mySerial)
{
    inst = this;
	serialFlag = 0;
	gprsSerial = mySerial;
   sim808_init(mySerial, 0);
}

Sicherheitshalber habe ich die komplette Datei nochmal angehängt.

DFRobot_sim808.cpp (30 KB)

Da ihr D0 und D1 als Serial verwendet, braucht ihr die SoftwareSerial nicht. Also wozu ist die noch drin.

Poste bitte mal den original Sketch für das GSM.

Wir haben sie drin gelassen, weil sie im Beispiel Sketch auch noch drin war…
Was hat SoftwareSerial denn für eine Aussage?

Hier das Beispielskript:

/*
### Get GPS data
1. This example is used to test SIM808 GPS/GPRS/GSM Shield's reading GPS data.
2. Open the SIM808_GetGPS example or copy these code to your project
3. Download and dial the function switch to Arduino
4. open serial helper
4. Place it outside, waiting for a few minutes and then it will send GPS data to serial

create on 2016/09/23, version: 1.0
by jason

*/
#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>

//#define PIN_TX    10
//#define PIN_RX    11
//SoftwareSerial mySerial(PIN_TX,PIN_RX);
//DFRobot_SIM808 sim808(&mySerial);//Connect RX,TX,PWR,

DFRobot_SIM808 sim808(&Serial);

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

  //******** Initialize sim808 module *************
  while(!sim808.init()) { 
      delay(1000);
      Serial.print("Sim808 init error\r\n");
  }

  //************* Turn on the GPS power************
  if( sim808.attachGPS())
      Serial.println("Open the GPS power success");
  else 
      Serial.println("Open the GPS power failure");
  
}

void loop() {
   //************** Get GPS data *******************
   if (sim808.getGPS()) {
    
    
    Serial.print("latitude :");
    Serial.println(sim808.GPSdata.lat,6);
    
    
    Serial.print("longitude :");
    Serial.println(sim808.GPSdata.lon,6);
   
    
    Serial.print("speed_kph :");
    Serial.println(sim808.GPSdata.speed_kph);
    Serial.print("heading :");
    Serial.println(sim808.GPSdata.heading);

    //************* Turn off the GPS power ************
    sim808.detachGPS();
  }

}

Glizzy: Wir haben sie drin gelassen, weil sie im Beispiel Sketch auch noch drin war.. Was hat SoftwareSerial denn für eine Aussage?

SoftwareSerial wird verwendet, wenn der HardwareSerial (D0 und D1) nicht zur Verfügung steht.

Und das ist beim Uno auch besser, da D0 und D1 für den USB-Port verwendet wird.

Und da Ihr auch auf diesen schreibt, wenn SD bereit ist, funktioniert euer GSM nicht mehr.

Also setzt das bitte auf SoftwareSerial um, aber auf die Pins D2 und D3. das müsst ihr auch so definieren und im Beispielsketch sieht man jetzt, das passiert mit "PIN_TX und PIN_RX".

Also euer Problem ist die Verwendung der seriellen D0 und D1 und dem Schreiben auf USB, dann steigt das GSM aus.

Wir wussten nicht genau ob wir Serial.print() zu mySerial.print() ändern müssen und haben deshalb beide Alternativen getestet. Wir haben nun SoftwareSerial die Pins 2 und 3 zugewiesen, allerdings bekommen wir nun keine Ausgaben mehr… Hast du eine Idee?

Hier ist der verwendete Code:

/*
### Get GPS data
1. This example is used to test SIM808 GPS/GPRS/GSM Shield's reading GPS data.
2. Open the SIM808_GetGPS example or copy these code to your project
3. Download and dial the function switch to Arduino
4. open serial helper
4. Place it outside, waiting for a few minutes and then it will send GPS data to serial

create on 2016/09/23, version: 1.0
by jason

*/
#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>

#define PIN_TX    2
#define PIN_RX    3 
SoftwareSerial mySerial(PIN_TX,PIN_RX);
DFRobot_SIM808 sim808(&mySerial);//Connect RX,TX,PWR,


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

  //******** Initialize sim808 module *************
  while(!sim808.init()) { 
      delay(1000);
      mySerial.print("Sim808 init error\r\n");
  }

  //************* Turn on the GPS power************
  if( sim808.attachGPS())
      mySerial.println("Open the GPS power success");
  else 
      mySerial.println("Open the GPS power failure");
  
}

void loop() {
   //************** Get GPS data *******************
   if (sim808.getGPS()) {
    
    
    mySerial.print("latitude :");
    mySerial.println(sim808.GPSdata.lat,6);
    
    
    mySerial.print("longitude :");
    mySerial.println(sim808.GPSdata.lon,6);
   
    
    mySerial.print("speed_kph :");
    mySerial.println(sim808.GPSdata.speed_kph);
    mySerial.print("heading :");
    mySerial.println(sim808.GPSdata.heading);

    //************* Turn off the GPS power ************
    sim808.detachGPS();
  }

}

Du darfst natürlich nicht alle Anweisungen in "mySerial" ändern. Die Anweisungen, die Informationen des GPS auf dem Bildschirm anzeigen sollen, müssen auch als "Serial"-Anweisung bleiben. Ohne die siehst du doch nichts. Die Anweisungen, die etwas zum GPS schicken, brauchen dann "mySerial".