Problema con SIM808

Buenos dias a todos, antes que nada quiero decir que tengo muy poco conocimiento de ingles y nivel bajo de conocimiento de microcontroladores, en cuanto al lenguaje c ++ puedo entenderlo hasta el paradigma funcional, no estoy muy familiarizado con el paradigma de orientado a objetos, estoy usando una plaqueta arduino mega 2560 con otra plaqueta sim808 evb-v3.2, lo que quiero hacer es por medio de un SMS enviado desde mi celular, obtener las coordenadas geográficas de la ubicación del GPS, y luego poder observarlas en la aplicacion de google mapas en el mismo celular. El scketch que escribi lo que hace es cuando solicito la ubicacion con el SMS, el sim la envia, pero si luego vuelvo a solicitar la ubicacion con el mismo SMS, esta no se actualiza, es decir no cambia, use el monitor serial para observar si cambia el tiempo UTC, pero no lo hace, llegue a la conclusión de que no actualiza los datos, estuve investigando como sugieren los moderadores y creadores de la página, pero no pude encontrar la solución a mi problema, por eso utilizo este medio. Desde ya muchas gracias por sus atenciones. Saludos.

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <DFRobot_sim808.h>
#include <string.h>
static const int RXpin = 11, TXpin = 12;
static const uint32_t GPSBaud = 9600;

TinyGPSPlus gps;

SoftwareSerial mySerial(RXpin, TXpin);
DFRobot_SIM808 sim808(&mySerial);

#define MESSAGE_LENGTH 160

float la, lo;
char lat[12];
char lng[12];
char message[MESSAGE_LENGTH];
int messageIndex = 0;
char MESSAGE[300];
char phone[16];
char datetime[24];
char caller[16];
bool verdad;

void sendSMS();

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  Serial.println(F("GPS a traves de mensajes SMS"));

  while (!sim808.init())
  {
    Serial.print("Sim808 no conectado\r\n"); //Si no se detecta el modulo, arroja error
    delay(1000);
  }

  delay(3000);

  Serial.println("Modulo SIM detectado!");

  Serial.println("Esperando recepcion de mensajes");

}

void loop() {
  messageIndex = sim808.isSMSunread();
  if (messageIndex > 0) {
    readSMS();
  }
}

void readSMS() {
  Serial.print("Numero de mensaje: ");
  Serial.println(messageIndex);
  sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);
  sim808.deleteSMS(messageIndex);
  Serial.print("De numero: ");
  Serial.println(phone);
  Serial.print("Fecha: ");
  Serial.println(datetime);
  Serial.print("Contenido del mensaje: ");
  Serial.println(message);

  processSMS();
}

void processSMS() {
  if (strcmp(message, "ubicacion") == 0) {
    verdad = true;
    sim808.attachGPS();
    inicioGPS();
    getGPS();
    sim808.detachGPS();
    sendSMS();
  }
}

void inicioGPS() {
  while (!sim808.attachGPS()) {
    Serial.println("Fallo en iniciar GPS");
    delay(1000);
  }
  delay(3000);
  Serial.println("GPS Iniciado correctamente");
}

void getGPS() {
  while (verdad) {
    while (mySerial.available() > 0)
      if (gps.encode(mySerial.read()))
        displayInfo();
  }
}
void displayInfo() {

  Serial.print(F("Location: "));
  if (gps.time.isValid())
  {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.println(gps.location.lng(), 6);
    Serial.print(F("  Date/Time: "));
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
    Serial.print(F(" "));
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.println(gps.time.centisecond());


    Serial.println(F("Datos adquiridos"));
    la = gps.location.lat();
    lo = gps.location.lng();



    dtostrf(la, 4, 6, lat);
    dtostrf(lo, 4, 6, lng);

    sprintf(MESSAGE, "Latitud : %s\nLongitud : %s \n. Ver ubicacion en \nhttp://maps.google.com/maps?q=%s,%s\n", lat, lng, lat, lng);
    verdad = false;

  } else {
    Serial.println(F("INVALID"));
    delay(3000);
  }

}



void sendSMS() {
  Serial.println("Enviando mensaje...");
  sim808.sendSMS(phone, MESSAGE);
  Serial.println("Mensaje enviado");
}

El único comentario que te puedo hacer es que la Mega tiene cuatro puertos seriales hardware, no tienes que usar SoftwareSerial.

Cambia las referencias a mySerial por Serial1, por ej., y usa los pines 18 y 19 (fijate en la serigrafía de la placa que están indicados).

Siguiendo con el ej. del Serial1, simplemente abres el puerto con

Serial1.begin(9600);

y lo accedes como de costumbre.

Serial1.print( lo que sea );

Como no conozco la SIM808, no puedo comentar al respecto.

Saludos

PD: edita tu post y cambia el título por algo descriptivo, por ej, "Problema GPS Sim808" o similar. Convengamos que tu nik no es un título muy atractivo para quien conozca la 808 y pueda ayudarte.

Hola gatul, graias por tu comentario, pero si estaba al tanto de los otros puertos seriales de arduino Mega, inente hacerlo utilizando esos dichos puertos seriales (por hardware) tambien, pero funciona exactamente igual que aplicando la libreria SoftwareSerial.h, el problema creo que esta en alguna parte logica del programa o en alguna parte del sketch, estoy utilizando la libreria TinyGPS++ porque utilizando solo la libreria DFRobot_sim808 me devolvia las coordenadas sin signo negativa, por estos lares tanto latitud como longitud son negativas, con la libreria de Tiny obtengo las coordenadas negativas, pero como digo no se actualizan cada vez que mando el SMS ubicacion. Es decir el sim o el arudino me devuelve las mismas coordenadas siempre. Saludos.

Es que con SoftwareSerial estás malgastando potencia de procesamiento, igual era una sugerencia nada mas, vos decidís lo que te sirve o no. :wink:

Que raro lo de la librería DFRobot, habría que avisarles que "El sur también existe" (como diría Serrat). :smiley:

Saludos

Estas haciendo las pruebas en tu casa?
Si es asi, debes sacar la antena del GPS afuera para que vea los satélites.

Ahh y quita el SoftwareSerial y usa Serial1 como te recomndó @gatul.

Hola gatul y surbyte, a mi tambien me parecio raro lo de la libreria DFRobot_sim808.h, porque hace un par de años, si funcionaba, el problema original es que no me daban las coordenadas negativas, con la libreria TinyGPS si las consegui, pero estoy tratando de adaptarla a SMS, bueno les comento que ya pude conseguir que el sketch hiciera lo que yo quiero. No se si tendria que subir lo que hice, que esta medio improlijo pero por ahi le sirva a alguien. Soy nuevo entrando como usuario a esta pagina, y no se como tendria que hacer para volver a publicar en un foro en español de nuevo, si hay que cerrar la consulta por mas que ya haya encontrado la solucion y si tengo que compartirla aqui, tampoco se como ponerle nombre a la consulta, ya que me aparece con mi nombre de usuario. Saludos y gracias por sus atenciones :slight_smile: !!!

**Moderador:**ç
No me había percatado del título.
Por favor editalo usando algo que refiera a tu consulta. No puedes poner tu nick como título.
En las normas se explica todo pero básicamente debes, ira a More abajo a la derecha del post que quieras editar y luego eliges Modify y entonces estas en condiciones de editar lo que gustes.
Por supuesto no modifiques el mensaje inicial, solo su título.
Por cierto, no es excusa ser novato, todo novato debe leer las normas antes de postear y si no lo hace se encuentra conmigo, pero tu tuviste suerte.

Lee las Normas del foro

Edito: sube el skech este como este, porque al menos cierras con tu sketch resuelto el tema que tu mismo propusiste.

Buenas noches a todos, les agradezco por su atencion brindada y al moderador por guiarme y tenerme paciencia. Aqui subo el sketch que realice para que funcionara el proyecto, estan las modificaciones que hice. Saludos cordiales.

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <DFRobot_sim808.h>
#include <string.h>
//static const int RXpin = 11, TXpin = 12;
//static const uint32_t GPSBaud = 9600;

#define RXpin 11
#define TXpin 12

TinyGPSPlus gps;

SoftwareSerial mySerial(RXpin, TXpin);
DFRobot_SIM808 sim808(&mySerial);

#define MESSAGE_LENGTH 160

int i;
float la, lo;
char lat[12];
char lon[12];
char message[MESSAGE_LENGTH];
int messageIndex = 0;
char MESSAGE[300];
char phone[16];
char datetime[24];
//char caller[16];
bool verdad;

void sendSMS();
void readSMS();
void processSMS();
void inicioGPS();
void getGPS();
void displayInfo();

void setup() {
  mySerial.begin(9600);
  while (!mySerial) {

  }
  Serial.begin(9600);
  while (!Serial) {

  }

  Serial.println(F("GPS a traves de mensajes SMS"));

  while (!sim808.init())
  {
    Serial.print("Sim808 no conectado\r\n"); //Si no se detecta el modulo, arroja error
    delay(1000);
  }

  delay(3000);

  Serial.println("Modulo SIM detectado!");

  Serial.println("Esperando recepcion de mensajes");

}

void loop() {
  messageIndex = sim808.isSMSunread();
  if (messageIndex > 0) {
    readSMS();
  }
}

void readSMS() {
  Serial.print("Numero de mensaje: ");
  Serial.println(messageIndex);
  sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);
  sim808.deleteSMS(messageIndex);
  Serial.print("De numero: ");
  Serial.println(phone);
  Serial.print("Fecha: ");
  Serial.println(datetime);
  Serial.print("Contenido del mensaje: ");
  Serial.println(message);

  processSMS();
}

void processSMS() {
  if (strcmp(message, "ubicacion") == 0) {
    verdad = true;
    sim808.attachGPS();
    inicioGPS();
    //    getGPS();
    sim808.detachGPS();
    sendSMS();
  }
}

void inicioGPS() {
  while (!sim808.attachGPS()) {
    Serial.println("Fallo en iniciar GPS");
    delay(1000);
  }
  delay(3000);
  Serial.println("GPS Iniciado correctamente");
  getGPS();
}

void getGPS() {
  while (verdad) {
    i = 0;
    while (i < 2) {
      i++;
      bool newData = false;

      while (mySerial.available()) {
        char c = mySerial.read();
        if (gps.encode(c)) {
          newData = true;
        }
      }
      if (newData) {
        Serial.print(F("Location: "));
        if ((gps.location.isValid()) && (gps.location.isUpdated()))
        {
          Serial.print(gps.location.lat(), 6);
          la = gps.location.lat();
          Serial.print(F(","));
          Serial.println(gps.location.lng(), 6);
          lo = gps.location.lng();
          Serial.print(F("  Date/Time: "));
          Serial.print(gps.date.month());
          Serial.print(F("/"));
          Serial.print(gps.date.day());
          Serial.print(F("/"));
          Serial.print(gps.date.year());
          Serial.print(F(" "));
          if (gps.time.hour() < 10) Serial.print(F("0"));
          Serial.print(gps.time.hour());
          Serial.print(F(":"));
          if (gps.time.minute() < 10) Serial.print(F("0"));
          Serial.print(gps.time.minute());
          Serial.print(F(":"));
          if (gps.time.second() < 10) Serial.print(F("0"));
          Serial.print(gps.time.second());
          Serial.print(F("."));
          if (gps.time.centisecond() < 10) Serial.print(F("0"));
          Serial.println(gps.time.centisecond());
          verdad = false;

        }
        /*       else {
                 Serial.println(F("INVALID"));
                 delay(3000);
               }*/
        //       verdad = false;
      }
    }
    i = 0;
    Serial.println(F("Datos adquiridos"));
    //     la = gps.location.lat();
    //     lo = gps.location.lng();



    dtostrf(la, 4, 6, lat);
    dtostrf(lo, 4, 6, lon);

    sprintf(MESSAGE, "Latitud : %s\nLongitud : %s \n. Ver ubicacion en \nhttp://maps.google.com/maps?q=%s,%s\n", lat, lon, lat, lon);
    //  verdad = false;

    //  }

  }
}
//     }
//       displayInfo();
// }

/*void displayInfo() {

  Serial.print(F("Location: "));
  if (gps.location.isValid())
  {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.println(gps.location.lng(), 6);
    Serial.print(F("  Date/Time: "));
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
    Serial.print(F(" "));
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.println(gps.time.centisecond());


    Serial.println(F("Datos adquiridos"));
    la = gps.location.lat();
    lo = gps.location.lng();



    dtostrf(la, 4, 6, lat);
    dtostrf(lo, 4, 6, lon);

    sprintf(MESSAGE, "Latitud : %s\nLongitud : %s \n. Ver ubicacion en \nhttp://maps.google.com/maps?q=%s,%s\n", lat, lon, lat, lon);
    verdad = false;

  } else {
    Serial.println(F("INVALID"));
    delay(3000);
  }

  }*/



void sendSMS() {
  Serial.println("Enviando mensaje...");
  sim808.sendSMS(phone, MESSAGE);
  Serial.println("Mensaje enviado");
}

pregunta de novato, porque llamas la libreria

#include <string.h>

yo cuando usa la funcion string nunca la llamo con un #include. aclaro pregunta de novato

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.