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

En primera parte de la serie de blogs tuvimos que dejar que el conejo de Pascua escondiera los huevos de Pascua con soporte de GPS. En la segunda parte, la búsqueda nos presentó el reto de determinar primero nuestra posición actual y luego calcular el recorrido y la distancia hacia el destino. Espero que esto haya sido divertido para todos los participantes. 

Antes de que el receptor GPS desaparezca en el cajón hasta el próximo año, lo utilizaremos para un sistema de rastreo, gracias a que la SIM 808 no sólo puede transmitir la posición GPS a través de su interfaz COM al Microcontrolador, sino también puede enviarla como SMS a través del sistema GSM integrado. Además del hardware utilizado hasta ahora, solo necesitamos una tarjeta Sim que se puede conseguir de prácticamente cualquier proveedor sin protección de contraseña y con suficiente crédito. En caso de que sea posible, utilice una tarjeta que coincida con su contrato de telefonía móvil, ya que los SMS en la misma red o con el mismo proveedor pueden ser gratis o al menos más baratos.

¿Qué necesitamos? Para las dos primeras partes:

Numero Componente
1 Microcontrolador, por ejemplo, el MC compatible con Uno R3
1 LCD, por ejemplo, el Pantalla-Teclado-Escudo
1 Módulo GPS / GSM SIM 808 (esta vez con tarjeta Sim)
Batería o batería


Esencialmente, los dos sketches en este blog se basan en la determinación de la posición de la Parte 1, se complementan por partes de los dos ejemplos de sketches SIM808_SendSMS y SIM808_SMSread, que se instalaron cuando la librería DFRobot_sim808.h se integró.

Se presentan diferentes enfoques para nuestro rastreador, que son adecuados para las diferentes aplicaciones. Como primer caso, consideramos el informe de posición regular después de que haya transcurrido un intervalo de tiempo definido, de lo contrario, la posición podría cambiarse por una cierta distancia, por lo que nuestro SIM 808 informa la posición del camión cada hora o cada 100 km.

En el segundo caso, el mensaje de posición debe estar orientado a los eventos. Esto es posible en primer lugar mediante el uso de nuestro microcontrolador con la ayuda de sensores, por ejemplo, para la posición y la aceleración (accidente?) o encender / apagar el encendido del vehículo. O en segundo lugar, la posición se debe enviar a petición, por lo que enviamos un SMS desde nuestro teléfono inteligente a la SIM 808, y recibimos una respuesta en pocos segundos (asumiendo que cada una tiene conexión).

Para el primer caso, complementamos el sketch de posición con partes del ejemplo de sketch SIM808 aSendSMS. Las partes del Software Serial y la inicialización del SIM808 ya están disponibles en nuestro sketch de posición. Nos vamos a centrar en las líneas impresas gruesas:


#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
}
 

Así que necesitamos ingresar el número de teléfono PHONE_NUMBER de nuestro celular al que se va a enviar el mensaje, luego definir MESSAGE (vea también 2. Sketch) y copiar la línea con el método sim808.sendSMS a nuestro sketch. Las variables previousSMS y SMSinterval controlan el intervalo de tiempo para los mensajes de posición SMS regulares. 

Descargue el 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()

En el segundo caso, tenemos que poner la SIM 808 en modo de recepción. Para hacer esto, utilizamos las partes en negrita del ejemplo de sketch 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);
  }
}

A diferencia del primer sketch, no enviamos el mensaje de posición a un número predefinido, sino al número de teléfono Teléfono desde el cual un SMS mensaje se recibió como disparador.

Pequeña decepción: Por supuesto que traté de enviar un código de cuatro dígitos y verificar que fuera correcto antes del SMS de respuesta, pero como se indicó en la primer publicación de la serie, la librería es muy crítica en cuanto al tiempo y la consulta adicional si ha dado lugar a que la transmisión de la posición GPS sea cancelada. ¿Tal vez pueda hacerlo?

Lo más largo que necesité para la línea 163: redactar el mensaje MESSAGE:

sprintf(MENSAJE, "SIM 808 %02d.%02d.%4d%02d:%02d,%02d.%02d.%02d N,%03d.%02d.%02d E",el DÍA,MES,AÑO,HORA,MINUTO,LATDD,LATMM,int(LATSSs),LONDDD,LONMM,int(LATSSs));

Descargue el 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
*****************************************************************************/
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()

Continuaremos tratando de corregir los errores, las funciones de recorrido y distancia y las debilidades en la consulta de posición en la librería DFRobot. El resultado está por verse.

Mientras tanto, le deseo mucha diversión con este gran módulo GPS/GSM y mucho éxito en la adaptación a sus necesidades personales.

AmateurfunkFür arduinoProjekte für fortgeschrittene

1 comentario

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”);
}

Deja un comentario

Todos los comentarios son moderados antes de ser publicados