GPS LOGGER AUF GPS TRACKER

Hallo Leute

Ich habe vor geraumer Zeit einen GPS Logger gebaut. Jetzt
ist mir die Idee gekommen daraus einen GPS Tracker zu machen.
Deshalb habe ich mir das gekauft:

https://www.ebay.de/itm/Smallest-SIM800L-GPRS-GSM-Module-Card-Board-Quad-band-Onboard-TTL-Port-TE605/391599050471?_trkparms=aid%3D555019%26algo%3DPL.BANDIT%26ao%3D1%26asc%3D20161121134545%26meid%3Dbe5558a10485400cb30be6056ee6789b%26pid%3D100505%26rk%3D1%26rkt%3D1%26&_trksid=p2045573.c100505.m3226

Nach einigen suche bin ich dann im Internet auf diesen Code gestossen.

#include <Wire.h>
#include <LiquidTWI2.h>
LiquidTWI2 lcd(0);
#include <SoftwareSerial.h>
SoftwareSerial gps(2, 3); // RX, TX


//String str="";
char str[70];
String gpsString = "";

char *test = "$GPGGA";

String latitude = "No Range      ";
String longitude = "No Range     ";

int temp = 0, i;
boolean gps_status = 0;

void setup()
{
  lcd.setMCPType(LTI_TYPE_MCP23017); //IC MCP23017
  lcd.begin(16, 2);
  Serial.begin(9600);
  gps.begin(9600);

  lcd.print("Vehicle Tracking");

  lcd.setCursor(0, 1);
  lcd.print("    System      ");

  delay(200);
  gsm_init();
  lcd.clear();
  Serial.println("AT+CNMI=2,2,0,0,0");
  lcd.print("GPS Initializing");
  delay(1000);
  lcd.setCursor(0, 1);
  lcd.print("  No GPS Range  ");

  get_gps();
  delay(200);
  lcd.clear();
  lcd.print("GPS Range Found");

  lcd.setCursor(0, 1);
  lcd.print("GPS is Ready");

  delay(200);
  lcd.clear();
  lcd.print("System Ready");

  temp = 0;
}

void loop()
{
  serialEvent();
  if (temp)
  {
    get_gps();
    tracking();
  }
}

void serialEvent()
{
  while (Serial.available())
  {
    if (Serial.find("Track Vehicle"))
    {
      temp = 1;
      break;
    }
    else
      temp = 0;
  }
}

void gpsEvent()
{
  gpsString = "";
  while (1)
  {
    while (gps.available() > 0)          //checking serial data from GPS
    {
      char inChar = (char)gps.read();
      gpsString += inChar;                   //store data from GPS into gpsString
      i++;
      if (i < 7)
      {
        if (gpsString[i - 1] != test[i - 1])    //checking for $GPGGA sentence
        {
          i = 0;
          gpsString = "";
        }
      }
      if (inChar == '\r')
      {
        if (i > 65)
        {
          gps_status = 1;
          break;
        }
        else
        {
          i = 0;
        }
      }
    }
    if (gps_status)
      break;
  }
}

void gsm_init()
{
  lcd.clear();
  lcd.print("Finding Modul..");
  boolean at_flag = 1;
  while (at_flag)
  {
    Serial.println("AT");
    while (Serial.available() > 0)
    {
      if (Serial.find("OK"))
        at_flag = 0;
    }

    delay(1000);
  }

  lcd.clear();
  lcd.print("Module Connected..");
  delay(1000);
  lcd.clear();
  lcd.print("Disabling ECHO");
  boolean echo_flag = 1;
  while (echo_flag)
  {
    Serial.println("ATE0");
    while (Serial.available() > 0)
    {
      if (Serial.find("OK"))
        echo_flag = 0;
    }
    delay(1000);
  }

  lcd.clear();
  lcd.print("Echo OFF");
  delay(1000);
  lcd.clear();
  lcd.print("Finding Network..");
  boolean net_flag = 1;
  while (net_flag)
  {
    Serial.println("AT+CPIN?");
    while (Serial.available() > 0)
    {
      if (Serial.find("+CPIN: READY"))
        net_flag = 0;
    }
    delay(1000);
  }
  lcd.clear();
  lcd.print("Network Found..");
  delay(1000);
  lcd.clear();
}

void get_gps()
{
  gps_status = 0;
  int x = 0;
  while (gps_status == 0)
  {
    gpsEvent();
    int str_lenth = i;
    latitude = "";
    longitude = "";
    int comma = 0;
    while (x < str_lenth)
    {
      if (gpsString[x] == ',')
        comma++;
      if (comma == 2)     //extract latitude from string
        latitude += gpsString[x + 1];
      else if (comma == 4)     //extract longitude from string
        longitude += gpsString[x + 1];
      x++;
    }
    int l1 = latitude.length();
    latitude[l1 - 1] = ' ';
    l1 = longitude.length();
    longitude[l1 - 1] = ' ';
    lcd.clear();
    lcd.print("Lat:");
    lcd.print(latitude);
    lcd.setCursor(0, 1);
    lcd.print("Long:");
    lcd.print(longitude);
    i = 0; x = 0;
    str_lenth = 0;
    delay(2000);
  }
}

void init_sms()
{
  Serial.println("AT+CMGF=1");
  delay(400);
  Serial.println("AT+CMGS=\"+49xxxxxxxxxxxx\"");   // Hier trage ich die Nummer ein
  delay(400);
}

void send_data(String message)
{
  Serial.println(message);
  delay(200);
}

void send_sms()
{
  Serial.write(26);
}

void lcd_status()
{
  lcd.clear();
  lcd.print("Message Sent");
  delay(2000);
  lcd.clear();
  lcd.print("System Ready");
  return;
}

void tracking()
{
  init_sms();
  send_data("Vehicle Tracking Alert:");
  send_data("Your Vehicle Current Location is:");
  Serial.print("Latitude:");
  send_data(latitude);
  Serial.print("Longitude:");
  send_data(longitude);
  send_data("Please take some action soon..\nThankyou");
  send_sms();
  delay(2000);
  lcd_status();
}

Was ich jetzt nicht verstehe ist.

1 Punkt Muss nicht auch das SIM800L ein SoftwareSerial haben .
Habe nur mal gelesen das es mehre SoftwareSerial gibt bei Arduino uno Board.

2 Punkt Welchen befehl muss ich vom Smartphone losschicken um die Koordinaten
übermittel zu bekommen.

Das Problem ist das ich das nicht zuhause Testen kann weil bei uns kein Netz ist und ich immer wegfahren muss um das zu Testen.

Danke Stefan

Hallo,

  1. Ja, das SIM800L braucht auch eine serielle Schnittstelle und du kannst SoftwareSerial dafür nehmen.
    Der Uno hat nicht mehr SoftwareSerial, aber du kannst die Library in mehreren Instanzen laufen lassen.

  2. Dazu gibt es im Web eine Dokumentation. Ich habe aktuell leider keinen Link,der ist aber über Google leicht zu finden.

Wichtig, beachte bitte, das Modul darf nur mit 4,2 Volt betrieben werden.

Hi

Wenn die 1A Stromspitzen im eBay-Link ernst gemeint sind, sollten sowohl ein Elko wie ein keramischer Kondensator ziemlich dicht an diesem Modul angebracht werden.
3.7 - 4.2V ist aber auch ein blöder Spannungsbereich ...

MfG

postmaster-ino:
Hi

Wenn die 1A Stromspitzen im eBay-Link ernst gemeint sind, sollten sowohl ein Elko wie ein keramischer Kondensator ziemlich dicht an diesem Modul angebracht werden.
3.7 - 4.2V ist aber auch ein blöder Spannungsbereich ...

Das funktioniert auch nur sicher mit einem "guten" StepDown-Regler auf 4,2 Volt und einem 220μF Elko.
Alle anderen Spielereien kann man vergessen.

@postmaster-ino
@HotSystems
Das SIM800L modul wird über eine 12 Volt Blei Akku versorgt mit einen
StepDown-Regler der wo auf 4.2 Volt eingestellt ist und die Masse mit dem Arduino verbunden ist.

Das uno ist nur ein Testboard habe auch noch zur auswahl ein Duemilanove, oder gilt da das gleiche.

Danke Stefan

ba1083:
@postmaster-ino
@HotSystems
Das SIM800L modul wird über eine 12 Volt Blei Akku versorgt mit einen
StepDown-Regler der wo auf 4.2 Volt eingestellt ist und die Masse mit dem Arduino verbunden ist.

Das ist gut so.

Das uno ist nur ein Testboard habe auch noch zur auswahl ein Duemilanove, oder gilt da das gleiche.

Was gilt da ?

Hallo HotSystems
Ich meinete das mit der "serielle Schnittstelle"

ba1083:
Hallo HotSystems
Ich meinete das mit der "serielle Schnittstelle"

Ja, soweit mir bekannt, gilt das da auch.
Selbst habe ich das Board noch nicht in der Hand gehabt.

Hallo HotSystems

Aber was ich immer noch nicht verstehe ist.

Wie macht der das dann im Code, mit der serielle Schnittstelle.

Habe mir ja deshalt das SIM800 L Modul gekauft.

Stefan

Du kannst über Softserial andere Pins als TX/RX definieren und zusätzlich über diese kommunizieren.

Gruß Tommy

Hi

In wie fern 'Wie macht der das dann im Code'??
Wenn Du auf der Einen schwätzt, bekommt 'Die Andere' davon Nix mit.
Und umgekehrt.
Auf Beiden wirst Du Daten empfangen können, Die Du 'nur zeitnah abholen musst' - sonst gehen Daten verloren.

Du benutzt die Software-Serielle-Schnittstelle genau so, wie die Hardware-Schnittstelle - was 'unter der Haube abgeht' interessiert deinen Code dabei überhaupt nicht, wenn auch der Arduino 'etwas mehr zu tun hat', aber eben unter der Haube.

MfG

Hallo postmaster-ino
Danke mal für die Info.

Wenn du hier im Forum (oben rechts die Lupe) nach SIM800 suchst, findest du sehr viele Beiträge die das GSM behandeln. Da wirst du auch etwas über die Schnittstelle finden.

Bei 2 SoftwareSerial musst du natürlich auch 2 Instanzen aufbauen. Das wären dann 4 Pins.

Hallo HotSystems

Die 4 Pins habe ich frei , werde jetzt mal die Suche bemühen.

Danke Stefan

ba1083:
....werde jetzt mal die Suche bemühen.....

Hier mal ein Link zu einer SIM800L-Library.

Da sind auch gute Beispiele vorhanden.

ba1083:
Die 4 Pins habe ich frei , werde jetzt mal die Suche bemühen.

Wenn deine Erfahrungen ausreichen, kannst du das auch ohne Library lösen.
Ist etwas kniffliger, aber geht auch.

Hallo HotSystems

So gut bin ich nicht.

Muss jetzt mal schauen wie ich weiter mache.

Danke Stefan