Positionsmeldung mit GPS und SMS (GPS/GSM SIM 808) - Teil 3 - AZ-Delivery

Im ersten Teil der Blog-Reihe haben wir den Osterhasen die Ostereier mit GPS-Unterstützung verstecken lassen. Im zweiten Teil stellte uns das Suchen dann vor die Herausforderung, zunächst unsere aktuelle Position zu bestimmen und dann Kurs und Entfernung zum Ziel zu berechnen. Das hat hoffentlich allen Beteiligten Spaß gemacht.

Bevor der GPS-Empfänger nun bis zum nächsten Jahr in der Schublade verschwindet, werden wir ihn für ein Tracking System einsetzen, denn das SIM 808 kann nicht nur die GPS-Position über seine COM-Schnittstelle an den Micro Controller übermitteln, sondern über das integrierte GSM-System auch als SMS verschicken. Zusätzlich zur bislang verwendeten Hardware benötigen wir nur eine Sim-Karte, die ohne Kennwortschutz und mit ausreichend Guthaben von quasi jedem Anbieter stammen kann. Nehmen Sie möglichst eine Karte passend zu Ihrem Handy-Vertrag, denn ggf. sind SMS im gleichen Netz bzw. beim gleichen Anbieter kostenlos oder zumindest preiswerter.

Was brauchen wir? Wie für die ersten beiden Teile:

Anzahl Bauteil
1 Micro Controller, z.B. den Uno R3 kompatiblen MC
1 LCD, z.B. das LCD-Keypad-Shield
1 GPS/GSM Modul SIM 808 (diesmal mit Sim-Karte)
Akku oder Batterie


Im Wesentlichen beruhen die beiden Sketche in diesem Blog auf der Positionsbestimmung aus Teil 1, ergänzt um Anteile aus den beiden Beispiel-Sketches SIM808_SendSMS und SIM808_SMSread, die bei der Einbindung der Bibliothek DFRobot_sim808.h installiert wurden.

Für unseren Tracker gibt es verschiedene Ansätze, die für die unterschiedlichen Einsatzmöglichkeiten jeweils geeignet sind. Als ersten Fall betrachten wir die regelmäßige Positionsmeldung nach Ablauf eines festgelegten Zeitintervalls, alternativ könnte die Änderung der Position um eine bestimmte Distanz möglich sein, also unser SIM 808 meldet die Position des Lastwagens jede Stunde oder alle 100 km.  

Im zweiten Fall soll die Positionsmeldung ereignisorientiert erfolgen. Möglich ist dies erstens durch die Verwendung unseres Micro Controllers mit Hilfe von Sensoren z.B. für Lage und Beschleunigung (Unfall?) oder Ein-/Ausschalten der Zündung des Fahrzeugs. Oder zweitens soll die Position auf Anforderung gesendet werden, also wir schicken von unserem Smartphone eine SMS an das SIM 808, und erhalten eine Antwort innerhalb weniger Sekunden (jeweils Verbindung vorausgesetzt).

Für den ersten Fall ergänzen wir den Positions-Sketch um Anteile des Beispiel-Sketches SIM808_SendSMS. Dabei sind die Anteile von SoftwareSerial und der Initialisierung des SIM808 bereits in unserem Positions-Sketch vorhanden. Konzentrieren wir uns auf die fett gedruckten Zeilen:

 

#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>
//Mobile phone number,need to change
#define PHONE_NUMBER "187*******39"
//The content of messages sent
#define MESSAGE "hello,world"
//#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");
  }
  Serial.println("Sim808 init success");
  Serial.println("Start to send message ...");

  //******** define phone number and text **********
  sim808.sendSMS(PHONE_NUMBER,MESSAGE);
}

void loop() {
  //nothing to do
}
 

Wir müssen also die Telefonnummer PHONE_NUMBER unseres Smartphones, an das die Nachricht gesendet werden soll, eingeben, die MESSAGE definieren (siehe auch 2. Sketch) und die Zeile mit der Methode sim808.sendSMS in unseren Sketch kopieren. Mit den Variablen previousSMS und SMSinterval steuern wir das Zeitintervall für die regelmäßigen SMS-Positionsmeldungen.

Download Sketch:

 

/*****************************************************************************
GPS mit LCD-Anzeige
basierend auf Bibliothek DFRobot_sim808 und Beispiel SIM808_GetGPS von jason.ling@dfrobot.com
Angepasst für UNO, Nano und kompatible MCUs und LCD1602 Keypad Shield
Offset für MEZ = 1 Stunde, ggf. anpassen für MESZ --> Offset=2
Uhrzeit und Tag werden kurz nach Mitternacht angepasst, jedoch Monat und Jahr nicht.

Anschlüsse:
TX des GPS verbinden mit A3 = GPIO 17 des LCD Keypad
RX des GPS verbinden mit A4 = GPIO 18 des LCD Keypad

Die Umlaute der Texte wurden durch die Escape-Sequenzen ersetzt.
lcd.print("\xE1"); // gibt ein ä aus
lcd.print("\xEF"); // gibt ein ö aus
lcd.print("\xF5"); // gibt ein ü aus
lcd.print("\xE2"); // gibt ein ß aus
lcd.print("\xDF"); // gibt ein ° aus
lcd.print("\x22"); // gibt ein " aus
lcd.print("\xE4"); // gibt ein µ aus
lcd.print("\xF4"); // gibt ein Ω aus
*****************************************************************************/
#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>
#define PIN_TX 17
#define PIN_RX 18

//Mobile phone number, need to change
#define PHONE_NUMBER "0049_yourPhoneNumber"
char MESSAGE[160] = "";

SoftwareSerial mySerial(PIN_TX,PIN_RX);
DFRobot_SIM808 sim808(&mySerial); //Connect RX,TX,PWR
//DFRobot_SIM808 sim808(&Serial);

// LCD has no I2C-Adapter, data transfer with Pins D4 to D7
#include <LiquidCrystal.h>
//LCD pin to Arduino
//const int pin_BL = 15;
const int pin_EN = 9;
const int pin_RS = 8;
const int pin_D4 = 4;
const int pin_D5 = 5;
const int pin_D6 = 6;
const int pin_D7 = 7;

LiquidCrystal lcd( pin_RS, pin_EN, pin_D4, pin_D5, pin_D6, pin_D7);

// Offset for Time, here UTC zu MEZ / MESZ
// Summertime MESZ: 2, Wintertime MEZ: 1
#define Offset 1

// unterbrechungsfreie Zeitsteuerung
unsigned long previousMillis = 0;
const long interval = 1000;
unsigned long previousSMS = 0;
const long SMSinterval = 300000;

// Buttons
int buttonInput = -1;
int buttonSelect = 0;

int YEAR = 2021;
int MONTH = 0;
int DAY = 0;
int DAYLCL = 0;
int HOUR = 0;
int HOURLCL = 0;
int MINUTE = 0;
int SECOND = 0;
float LAT = 0.0;
int LATDD = 0;
float LATMMmmmm = 0.0;
int LATMM = 0;
int LATDDWP = 0;
float LATMMmmmmWP = 0.0;
float LATSSs = 0.0;
float LON = 0.0;
int LONDDD = 0;
float LONMMmmmm = 0.0;
int LONMM = 0;
int LONDDWP = 0;
float LONMMmmmmWP = 0.0;
float LONSSs = 0.0;

void setup() {
  mySerial.begin(9600);
  Serial.begin(9600);
  lcd.begin(16,2); // initialize the lcd
  lcd.clear();
  lcd.setCursor(0,0); //Zählung beginnt bei Null, erst Zeichen, dann Zeile
  lcd.print("AZ-Delivery.com");
  lcd.setCursor(0,1); // 0=Erstes Zeichen, 1=zweite Zeile

  //******** 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() {
  buttonInput = Button();
  switch (buttonInput) {
    case 0: Serial.println("0");buttonSelect=0; break;
    case 1: Serial.println("1");buttonSelect=1; break;
    case 2: Serial.println("2");buttonSelect=2; break;
    case 3: Serial.println("3");buttonSelect=3; break;
    case 4: Serial.println("4");buttonSelect=4; break;
    default: break;
  }



  if (millis() - previousMillis >= interval) {
    //************** Get GPS data *******************
    if (sim808.getGPS()) {
    YEAR = 2021;
    MONTH = sim808.GPSdata.month;
    DAY = sim808.GPSdata.day;
    DAYLCL = DAY;
    HOUR = sim808.GPSdata.hour;
    HOURLCL = HOUR + Offset;
    MINUTE = sim808.GPSdata.minute;
    SECOND = sim808.GPSdata.second;
    if (HOURLCL>24) {
      HOURLCL = HOURLCL-24;
      DAYLCL = DAYLCL + 1; }
    Serial.print(sim808.GPSdata.year);
    Serial.print("/");
    Serial.print(MONTH);
    Serial.print("/");
    Serial.print(DAY);
    Serial.print(" ");
    Serial.print(HOUR);
    Serial.print(":");
    Serial.print(MINUTE);
    Serial.print(":");
    Serial.println(SECOND);
    LAT = sim808.GPSdata.lat;
    LATDD = int(LAT);
    LATMMmmmm = (LAT - LATDD)*100;
    LATMM = int(LATMMmmmm);
    LATSSs = (LATMMmmmm - LATMM)*60;
    LON = sim808.GPSdata.lon;
    LONDDD = int(LON);
    LONMMmmmm = (LON - LONDDD)*100;
    LONMM = int(LONMMmmmm);
    LONSSs = (LONMMmmmm - LONMM)*60;
    Serial.print("latitude: ");
    Serial.print(LATDD);
    Serial.print("°");
    Serial.print(LATMMmmmm,4);
    Serial.println("'N");
    Serial.print("longitude: ");
    if (LON<100.0) Serial.print("0");
    if (LON<10.0) Serial.print("0");
    Serial.print(LONDDD);
    Serial.print("°");
    Serial.print(LONMMmmmm,4);
    Serial.println("'E");
    //The content of messages sent
    sprintf(MESSAGE, "SIM 808 %02d.%02d.%4d,%02d:%02d,%02d.%02d.%02d N,%03d.%02d.%02d E",DAY,MONTH,YEAR,HOUR,MINUTE,LATDD,LATMM,int(LATSSs),LONDDD,LONMM,int(LATSSs));

    //******** define phone number and text **********

    if (millis()-previousSMS>SMSinterval) {
      Serial.print("uncomment for SMS");
      // sim808.sendSMS(PHONE_NUMBER,MESSAGE);
      previousSMS = millis();
    }
    else {
      Serial.println(MESSAGE);
    }

    if (buttonSelect==0) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(LATDD);
      lcd.print("\xDF");
      int LATMM = int(LATMMmmmm);
      float LATSSs = (LATMMmmmm-LATMM)*60;
      lcd.print(LATMM);
      lcd.print("'");
      lcd.print(LATSSs,1);
      lcd.print("\x22\ N");
      lcd.setCursor(0,1);
      if (LON<100.0) lcd.print("0");
      if (LON<10.0) lcd.print("0");
      lcd.print(LONDDD);
      lcd.print("\xDF");
      int LONMM = int(LONMMmmmm);
      float LONSSs = (LONMMmmmm-LONMM)*60;
      if (LONMM<10) lcd.print("0");
      lcd.print(LONMM);
      lcd.print("'");
      if (LONSSs<10.0) lcd.print("0");
      lcd.print(LONSSs,1);
      lcd.print("\x22\ E"); }

    else if (buttonSelect==1) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("EUR: ");
      if (DAYLCL<10) lcd.print("0");
      lcd.print(DAYLCL);
      lcd.print(".");
      if (MONTH<10) lcd.print("0");
      lcd.print(MONTH);
      lcd.print(".");
      lcd.print(sim808.GPSdata.year);
      lcd.setCursor(5,1);
      if (HOURLCL<10) lcd.print("0");
      lcd.print(HOURLCL);
      lcd.print(":");
      if (MINUTE<10) lcd.print("0");
      lcd.print(MINUTE);
      lcd.print(":");
      if (SECOND<10) lcd.print("0");
      lcd.print(SECOND);
    }
    else if (buttonSelect==2) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("UTC: ");
      lcd.print(sim808.GPSdata.year);
      lcd.print("/");
      if (MONTH<10) lcd.print("0");
      lcd.print(MONTH);
      lcd.print("/");
      if (DAY<10) lcd.print("0");
      lcd.print(DAY);
      lcd.setCursor(5,1);
      if (HOUR<10) lcd.print("0");
      lcd.print(HOUR);
      lcd.print(":");
      if (MINUTE<10) lcd.print("0");
      lcd.print(MINUTE);
      lcd.print(":");
      if (SECOND<10) lcd.print("0");
      lcd.print(SECOND);
    }
    else if (buttonSelect==3) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(LATDD);
      lcd.print("\xDF");
      lcd.print(LATMMmmmm,4);
      lcd.print("' N");
      lcd.setCursor(0,1);
      if (LON<100.0) lcd.print("0");
      if (LON<10.0) lcd.print("0");
      lcd.print(LONDDD);
      lcd.print("\xDF");
      if (LONMMmmmm<10.0) lcd.print("0");
      lcd.print(LONMMmmmm,4);
      lcd.print("' E"); }
      else if (buttonSelect==4) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("AZ-Delivery.com"); }
      //
      // //************* Turn off the GPS power ************
      // sim808.detachGPS();
      previousMillis = millis();
    }
  }
}

int Button() {
  int A0;
  // all buttons are connected to A0 via voltage divider
  // Values of ADC are between 0 and 1023
  // if necessary, values must be changed slightly
  A0 = analogRead(0); //
  if (A0 < 60) {
    return 0;
  }
  else if (A0 >= 60 && A0 < 250) {
    return 1;
  }
  else if (A0 >= 250 && A0 < 450){
    return 2;
  }
  else if (A0 >= 450 && A0 < 700){
    return 3;
  }
  else if (A0 >= 700 && A0 < 900){
    return 4;
  }
  else {
    return -1;
  }
} //end Button()

Im zweiten Fall müssen wir das SIM 808 in den Empfangsmodus versetzen. Dazu nutzen wir die fettgedruckten Teile des Beispiel-Sketches SIM808_SMSread:

 

#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>
#define MESSAGE_LENGTH 160
char message[MESSAGE_LENGTH];
int messageIndex = 0;
char phone[16];
char datetime[24];
//#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()) {
    Serial.print("Sim808 init error\r\n");
    delay(1000);
  }
  delay(3000);
  Serial.println("Init Success, please send SMS message to me!");
}

void loop() {
  //*********** Detecting unread SMS ************************
  messageIndex = sim808.isSMSunread();
  Serial.print("messageIndex: ");
  Serial.println(messageIndex);

  //*********** At least, there is one UNREAD SMS ***********
  if (messageIndex > 0) {
    sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);

    //******In order not to full SIM Memory, is better to delete it*******
    sim808.deleteSMS(messageIndex);
    Serial.print("From number: ");
    Serial.println(phone);
    Serial.print("Datetime: ");
    Serial.println(datetime);
    Serial.print("Recieved Message: ");
    Serial.println(message);
  }
}

Anders als im ersten Sketch senden wir die Positionsmeldung nicht an eine vordefinierte Nummer, sondern an die Telefonnummer phone, von dem eine (beliebige) SMS (message ) als Trigger empfangen wurde.

Kleine Enttäuschung: Selbstverständlich habe ich versucht, einen vierstelligen Code zu senden und vor der Antwort-SMS auf Richtigkeit zu prüfen, aber wie im ersten Beitrag der Serie schon angemerkt, die Bibliothek ist sehr zeitkritisch und die zusätzliche if-Abfrage hat dazu geführt, dass die Übermittlung der GPS-Position abgebrochen wurde. Vielleicht schaffen Sie es?

Am längsten habe ich für die Zeile 163 benötigt: das Zusammensetzen der Nachricht MESSAGE:

sprintf(MESSAGE, "SIM 808 %02d.%02d.%4d,%02d:%02d,%02d.%02d.%02d N,%03d.%02d.%02d E",DAY,MONTH,YEAR,HOUR,MINUTE,LATDD,LATMM,int(LATSSs),LONDDD,LONMM,int(LATSSs));

Download Sketch:

 /****************************************************************************
GPS mit LCD-Anzeige
basierend auf Bibliothek DFRobot_sim808 und Beispiel SIM808_GetGPS von jason.ling@dfrobot.com
Angepasst für UNO, Nano und kompatible MCUs und LCD1602 Keypad Shield
Offset für MEZ = 1 Stunde, ggf. anpassen für MESZ --> Offset=2
Uhrzeit und Tag werden kurz nach Mitternacht angepasst, jedoch Monat und Jahr nicht.

Anschlüsse:
TX des GPS verbinden mit A3 = GPIO 17 des LCD Keypad
RX des GPS verbinden mit A4 = GPIO 18 des LCD Keypad

Die Umlaute der Texte wurden durch die Escape-Sequenzen ersetzt.
lcd.print("\xE1"); // gibt ein ä aus
lcd.print("\xEF"); // gibt ein ö aus
lcd.print("\xF5"); // gibt ein ü aus
lcd.print("\xE2"); // gibt ein ß aus
lcd.print("\xDF"); // gibt ein ° aus
lcd.print("\x22"); // gibt ein " aus
lcd.print("\xE4"); // gibt ein µ aus
lcd.print("\xF4"); // gibt ein Ω aus
*****************************************************************************/
#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>
#define PIN_TX 17
#define PIN_RX 18

#define MESSAGE_LENGTH 160
char message[MESSAGE_LENGTH]; // incoming message
char MESSAGE[MESSAGE_LENGTH] = ""; // outgoing message
int messageIndex = 0;

char phone[16];
char datetime[24];

SoftwareSerial mySerial(PIN_TX,PIN_RX);
DFRobot_SIM808 sim808(&mySerial); //Connect RX,TX,PWR
//DFRobot_SIM808 sim808(&Serial);

// LCD has no I2C-Adapter, data transfer with Pins D4 to D7
#include <LiquidCrystal.h>
//LCD pin to Arduino
//const int pin_BL = 15;
const int pin_EN = 9;
const int pin_RS = 8;
const int pin_D4 = 4;
const int pin_D5 = 5;
const int pin_D6 = 6;
const int pin_D7 = 7;

LiquidCrystal lcd( pin_RS, pin_EN, pin_D4, pin_D5, pin_D6, pin_D7);

// Offset for Time, here UTC zu MEZ / MESZ
// Summertime MESZ: 2, Wintertime MEZ: 1
#define Offset 1

// unterbrechungsfreie Zeitsteuerung
unsigned long previousMillis = 0;
const long interval = 1000;
unsigned long previousSMS = 0;
const long SMSinterval = 300000;

// Buttons
int buttonInput = -1;
int buttonSelect = 0;

int YEAR = 2021;
int MONTH = 0;
int DAY = 0;
int DAYLCL = 0;
int HOUR = 0;
int HOURLCL = 0;
int MINUTE = 0;
int SECOND = 0;
float LAT = 0.0;
int LATDD = 0;
float LATMMmmmm = 0.0;
int LATMM = 0;
int LATDDWP = 0;
float LATMMmmmmWP = 0.0;
float LATSSs = 0.0;
float LON = 0.0;
int LONDDD = 0;
float LONMMmmmm = 0.0;
int LONMM = 0;
int LONDDWP = 0;
float LONMMmmmmWP = 0.0;
float LONSSs = 0.0;



void setup() {
  mySerial.begin(9600);
  Serial.begin(9600);
  lcd.begin(16,2); // initialize the lcd
  lcd.clear();
  lcd.setCursor(0,0); //Zählung beginnt bei Null, erst Zeichen, dann Zeile
  lcd.print("AZ-Delivery.com");
  lcd.setCursor(0,1); // 0=Erstes Zeichen, 1=zweite Zeile

  //******** 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");
} //end setup()

void loop() {
  buttonInput = Button();
  switch (buttonInput) {
    case 0: Serial.println("0");buttonSelect=0; break;
    case 1: Serial.println("1");buttonSelect=1; break;
    case 2: Serial.println("2");buttonSelect=2; break;
    case 3: Serial.println("3");buttonSelect=3; break;
    case 4: Serial.println("4");buttonSelect=4; break;
    default: break;
  }

  if (millis() - previousMillis >= interval) {
  //************** Get GPS data *******************
  if (sim808.getGPS()) {
    YEAR = 2021;
    MONTH = sim808.GPSdata.month;
    DAY = sim808.GPSdata.day;
    DAYLCL = DAY;
    HOUR = sim808.GPSdata.hour;
    HOURLCL = HOUR + Offset;
    MINUTE = sim808.GPSdata.minute;
    SECOND = sim808.GPSdata.second;
    if (HOURLCL>24) {
      HOURLCL = HOURLCL-24;
      DAYLCL = DAYLCL + 1; }
    Serial.print(sim808.GPSdata.year);
    Serial.print("/");
    Serial.print(MONTH);
    Serial.print("/");
    Serial.print(DAY);
    Serial.print(" ");
    Serial.print(HOUR);
    Serial.print(":");
    Serial.print(MINUTE);
    Serial.print(":");
    Serial.println(SECOND);
    LAT = sim808.GPSdata.lat;
    LATDD = int(LAT);
    LATMMmmmm = (LAT - LATDD)*100;
    LATMM = int(LATMMmmmm);
    LATSSs = (LATMMmmmm - LATMM)*60;
    LON = sim808.GPSdata.lon;
    LONDDD = int(LON);
    LONMMmmmm = (LON - LONDDD)*100;
    LONMM = int(LONMMmmmm);
    LONSSs = (LONMMmmmm - LONMM)*60;
    Serial.print("latitude: ");
    Serial.print(LATDD);
    Serial.print("°");
    Serial.print(LATMMmmmm,4);
    Serial.println("'N");
    Serial.print("longitude: ");
    if (LON<100.0) Serial.print("0");
    if (LON<10.0) Serial.print("0");
    Serial.print(LONDDD);
    Serial.print("°");
    Serial.print(LONMMmmmm,4);
    Serial.println("'E");
    //The content of messages sent
    sprintf(MESSAGE, "SIM 808 %02d.%02d.%4d,%02d:%02d,%02d.%02d.%02d N,%03d.%02d.%02d E",DAY,MONTH,YEAR,HOUR,MINUTE,LATDD,LATMM,int(LATSSs),LONDDD,LONMM,int(LATSSs));

    //******** define phone number and text **********
    //*********** Detecting unread SMS ************************
    messageIndex = sim808.isSMSunread();
    Serial.print("messageIndex: ");
    Serial.println(messageIndex);

    //*********** At least, there is one UNREAD SMS ***********
    if (messageIndex > 0) {
    sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);

    //**** *In order not to full SIM Memory, is better to delete it*******
    sim808.deleteSMS(messageIndex);
    Serial.print("From number: ");
    Serial.println(phone);
    Serial.print("Datetime: ");
    Serial.println(datetime);
    Serial.print("Received Message: ");
    Serial.println(message);

    sim808.sendSMS(phone,MESSAGE);
  }

    if (buttonSelect==0) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(LATDD);
      lcd.print("\xDF");
      int LATMM = int(LATMMmmmm);
      float LATSSs = (LATMMmmmm-LATMM)*60;
      lcd.print(LATMM);
      lcd.print("'");
      lcd.print(LATSSs,1);
      lcd.print("\x22\ N");
      lcd.setCursor(0,1);
      if (LON<100.0) lcd.print("0");
      if (LON<10.0) lcd.print("0");
      lcd.print(LONDDD);
      lcd.print("\xDF");
      int LONMM = int(LONMMmmmm);
      float LONSSs = (LONMMmmmm-LONMM)*60;
      if (LONMM<10) lcd.print("0");
      lcd.print(LONMM);
      lcd.print("'");
      if (LONSSs<10.0) lcd.print("0");
      lcd.print(LONSSs,1);
      lcd.print("\x22\ E"); }

    else if (buttonSelect==1) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("EUR: ");
      if (DAYLCL<10) lcd.print("0");
      lcd.print(DAYLCL);
      lcd.print(".");
      if (MONTH<10) lcd.print("0");
      lcd.print(MONTH);
      lcd.print(".");
      lcd.print(sim808.GPSdata.year);
      lcd.setCursor(5,1);
      if (HOURLCL<10) lcd.print("0");
      lcd.print(HOURLCL);
      lcd.print(":");
      if (MINUTE<10) lcd.print("0");
      lcd.print(MINUTE);
      lcd.print(":");
      if (SECOND<10) lcd.print("0");
      lcd.print(SECOND);
    }
    else if (buttonSelect==2) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("UTC: ");
      lcd.print(sim808.GPSdata.year);
      lcd.print("/");
      if (MONTH<10) lcd.print("0");
      lcd.print(MONTH);
      lcd.print("/");
      if (DAY<10) lcd.print("0");
      lcd.print(DAY);
      lcd.setCursor(5,1);
      if (HOUR<10) lcd.print("0");
      lcd.print(HOUR);
      lcd.print(":");
      if (MINUTE<10) lcd.print("0");
      lcd.print(MINUTE);
      lcd.print(":");
      if (SECOND<10) lcd.print("0");
      lcd.print(SECOND);
    }
    else if (buttonSelect==3) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print(LATDD);
      lcd.print("\xDF");
      lcd.print(LATMMmmmm,4);
      lcd.print("' N");
      lcd.setCursor(0,1);
      if (LON<100.0) lcd.print("0");
      if (LON<10.0) lcd.print("0");
      lcd.print(LONDDD);
      lcd.print("\xDF");
      if (LONMMmmmm<10.0) lcd.print("0");
      lcd.print(LONMMmmmm,4);
      lcd.print("' E"); }
    else if (buttonSelect==4) {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("AZ-Delivery.com"); }
  //
// //************* Turn off the GPS power ************
// sim808.detachGPS();
    previousMillis = millis();
    }
  }
} // end loop()

int Button() {
  int A0;
  // all buttons are connected to A0 via voltage divider
  // Values of ADC are between 0 and 1023
  // if necessary, values must be changed slightly
  A0 = analogRead(0); //
  if (A0 < 60) {
    return 0;
  }
  else if (A0 >= 60 && A0 < 250) {
    return 1;
  }
  else if (A0 >= 250 && A0 < 450){
    return 2;
  }
  else if (A0 >= 450 && A0 < 700){
     return 3;
  }
  else if (A0 >= 700 && A0 < 900){
    return 4;
  }
  else {
    return -1;
  }
} //end Button()

Wir werden weiter versuchen, bei der Bibliothek DFRobot_sim808.h die Fehler, die fehlenden Funktionen für Kurs und Distanz und die Schwächen bei der Positionsabfrage abzustellen. Das Ergebnis bleibt abzuwarten.

In der Zwischenzeit wünsche ich viel Spaß mit diesem tollen GPS/GSM-Modul und viel Erfolg bei der Anpassung an Ihre persönlichen Wünsche.

AmateurfunkFür arduinoProjekte für fortgeschrittene

1 comment

Roland Bauer

Roland Bauer

kleiner Beitrag zu “Schwächen bei der Positionsabfrage”, zum testen.
Grüße aus Österreich

/*
GSM-SIM80x & GPS-NEO-6M Standortabfrage, Darstellung mit Google Maps

NEO 6M NEO Arduino 5VIN +5V GND GND TXD 3 RXD 4 SIM80l Banggoot SIM Arduino 5VIN Extern +5V ~1A (Arduino hat zuwenig Leistung) GND GND VDO +5V (UART) TXD 7 (UART) RXD 8 (UART) GND GND (UART) RST 02112021

*/
#include <TinyGPS++.h>
#include
#include

// **** GPS
static const int RXPin = 4; // RXPin auf Arduino 4
static const int TXPin = 3; // TXPin auf Arduino 3
SoftwareSerial GPSSerial(RXPin, TXPin);
TinyGPSPlus gps;
float Lat = 0;
float Lng = 0;

// **** GSM
#define PHONE_NUMBER “06765514555” // Mobile phone number Admin
#define PIN_TX 7
#define PIN_RX 8
SoftwareSerial GSMSerial(PIN_TX, PIN_RX);
DFRobot_SIM808 sim808(&GSMSerial); // Connect RX,TX

// Variable empfang
#define MESSAGE_LENGTH 160
char message[MESSAGE_LENGTH];
int messageIndex = 0;
String Werte = “Messwerte”; // Befehl “sende Messwerte”
String incoming; // Variable store incoming SMS
char phone16;
char datetime24;

//int SEND = 13; // LED SMS Senden
String strStandort;
char *Standort; // Char beide Messwerte

void setup() {
//pinMode(SEND, OUTPUT);
//digitalWrite(SEND, LOW);
Serial.begin(9600);
GPSSerial.begin(9600);
Serial.println(“Start GPS”);
delay(1000);
GSMSerial.begin(9600);
//******** Initialize sim808 *************
while (!sim808.init()) {
delay(1000);
Serial.println(“Sim808 init error\r\n”);
}
delay(5000);
Serial.println(“Sim808 init success”);
Serial.println(“Start to send message …”);
//digitalWrite(SEND, HIGH);
sim808.sendSMS(PHONE_NUMBER, “GSM-GPS ready”);
//digitalWrite(SEND, LOW);
Serial.println(“kann SMS empfangen”);
}

void loop() {
GPSSerial.listen();
// Serial.println(“GPS-Abfrage”);
while (GPSSerial.available() > 0) {
gps.encode(GPSSerial.read());
if (gps.location.isUpdated()) {
Lat = gps.location.lat();
Lng = gps.location.lng();
Serial.print("Latitude= “);
Serial.println(Lat, 6);
Serial.print(”Longitude= ");
Serial.println(Lng, 6);

GSMSerial.listen(); { // Serial.println(“GSM-Abfrage”); //*********** Detecting unread SMS ************************ messageIndex = sim808.isSMSunread(); Serial.print("messageIndex: "); Serial.println(messageIndex); // Abfrage UNREAD SMS if (messageIndex > 0) { sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime); incoming = message; Serial.print("From number: "); Serial.println(phone); // Rufnummer der Anfrage Serial.print("Datetime: "); Serial.println(datetime); Serial.print("Recieved Message: "); Serial.println(message); sim808.deleteSMS(messageIndex); // SIM Memory loeschen if (incoming == Werte) { Messwerte(); } if (incoming != Werte) { Fehlersend(); } } } } }

}

void Messwerte() {
// Anpassen Ausgabe der Messwerte
String strStandort = (“http://maps.google.com/maps?&z=15&mrt=yp&t=k&q=” + String(Lat, 6) + “,” + String(Lng, 6));
Serial.print("strStandort= "); // fuer Test
Serial.println(strStandort); // fuer Test

// Umwandlung String zu Char mit variabler Laenge int strStandort_len = strStandort.length() + 1; char charStandort[strStandort_len]; strStandort.toCharArray(charStandort, strStandort_len); Serial.print("charStandort= "); // fuer Test Serial.println(charStandort); // fuer Test Standort = charStandort; SMSdatensend();

}

void Fehlersend()
{
Serial.println(“starte Fehler message …”);
//digitalWrite(SEND, HIGH);
sim808.sendSMS(phone, “Fehler! SMS Empfangsdaten”); //Fehlermeldung an sms-Anfrage
Serial.println(“kann SMS empfangen”);
//digitalWrite(SEND, LOW);
}

void SMSdatensend() {
//digitalWrite(SEND, HIGH);
Serial.println(“start to send Standort”);
sim808.sendSMS(phone, Standort); //Messwerte an sms-Anfrage
//digitalWrite(SEND, LOW);
Serial.println(“kann SMS empfangen”);
}

Leave a comment

All comments are moderated before being published

Recommended blog posts

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery