Problema de envío de SMS con coordenadas GPS.

Estimada comunidad, estoy realizando un proyecto en la cual consiste enviar un SMS con coordenadas gps a través de un pulsador para luego ser visto a través de google maps.
El módulo GPS que uso gy-neo6mv2 mas conocido como Ublox Neo 6M GPS y una SHIELD SIM900 en Arduino UNO, el problema cae en lo siguiente, mi proyecto envía el SMS pero sin las coordenadas GPS y contenido del texto, a que me refiero; "Google Maps" concadenado con las coordenadas obtenidas del módulo
Estoy utilizando IDE 1.6.5 ya que versiones actuales me ha dado más problemas, cabe mencionar que no soy del todo experto en el mundo arduino. Apreciaría toda la ayuda posible. :slight_smile:

A continuación adjunto el código

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <sms.h>
#include <SIM900.h>

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 38400;

TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
SMSGSM sms;
SoftwareSerial SIM900(7, 8);

const int buttonPin = 6;
const int ledPin =  13;
int i=0;
bool estadoubicacion = HIGH;
char mensaje[120];
char latitud[12];
char longitud[12];
bool estado = LOW;
bool estado_anterior = LOW;

void setup()
{
  Serial.begin(9600);
  ss.begin(GPSBaud);
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  // Apagamos el LED al empezar
  digitalWrite(ledPin , LOW) ;
  //inicia placa arduino
 
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  Serial.println(F("Sistema iniciado"));
}

void loop()
{
  estado = digitalRead(buttonPin);
  if ( estado != estado_anterior )  {
    if (estado == HIGH) {
      Luces();
      Localizacion();
      estadoubicacion=!estadoubicacion;
      i=0;
    }
  }
  digitalWrite(ledPin , LOW) ;
  estado = LOW;
  estado_anterior = LOW;
  ss.begin(GPSBaud);
}

void Localizacion(){
    while( estadoubicacion == HIGH ) {
    if (ss.available() > 0) {
      if (gps.encode(ss.read())) {
        if (gps.location.isValid()) {
          Serial.print(gps.location.lat(), 6);
          Serial.print(F(","));
          Serial.print(gps.location.lng(), 6);
          Serial.println("");
          strcpy(mensaje, "Necesito ayuda estoy cerca de ");
          strcat(mensaje, "http://maps.google.com/maps?z=12&t=m&q=loc:");
          
          //tomando la lectura del modulo GPS se extrae de esta
          // cadena solo la informacion referente a la latitud
          dtostrf(gps.location.lat(), 1, 6, latitud);
          strcat(mensaje, latitud);
          strcat(mensaje, "+");
          //tomando la lectura del modulo GPS se extrae de esta
          // cadena solo la informacion referente a longitud
          dtostrf(gps.location.lng(), 1, 6, longitud);
          strcat(mensaje, longitud);
          strcat(mensaje,"");
          
          EnviarSMS();
          estadoubicacion=!estadoubicacion;
        }
      }
    }
    if (millis() > 5000 && gps.charsProcessed() < 10){
      i++;
      Serial.println(i);
      delay(5000);
      if(i==2 && estadoubicacion == HIGH){
        strcpy(mensaje, "Necesito ayuda");
        strcat(mensaje,"");
        Serial.println(F("\nMensaje creado"));
        delay(1000);
        EnviarSMS();
        estadoubicacion=!estadoubicacion;
      }
    }
  }
}


void EnviarSMS() {
  //este metodo se encarga del envio del mensaje SMS a un destinatario
  //definido en este punto
  Serial.println(F("Encendiendo Shield GSM"));
  //inicio shield GSM SIM900
  if (gsm.begin(9600)) {
    gsm.forceON();
    if (sms.SendSMS("123456789", mensaje)) {
      Serial.println(F("\nSMS enviado"));
      Luces();
    }
  }    
}

void Luces(){
  // este metodo controla el funcionamiento de un LED el cual es usado 
  // para elertar que la alarma funciono de la manera esperada
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
  
}

En el monitor serie se imprime mensaje correctamente supongo?
Probaste enviando cualquier cosa por SMS y lo hace bien?

Hola surbyte, gracias por leer, a través del serial monitor me arroja esto;

Sistema iniciado
Conectando a satelites...
1
2

Mensaje creado
Encendiendo Shield GSM
ATT: OK
RIC: AT

OK

DB:ELSE
ATT: OK
RIC: AT

OK

DB:ELSE
ATT: OK
RIC: AT

OK

DB:ELSE
ATT: OK
RIC: AT

OK

DB:CORRECT BR
ATT: OK
RIC: AT

OK

ATT: OK
RIC: AT&F

OK

ATT: OK
RIC: ATE0

OK

ATT: OK
RIC: 
OK

ATT: OK
RIC: 
OK

ATT: OK
RIC: 
OK

ATT: OK
RIC: 
OK

ATT: +CPMS:
RIC: 
+CPMS: 1,20,1,20,1,20

OK

ATT: OK
RIC: 
OK

ATT: SHUT OK
RIC: 
SHUT OK

ATT: OK
RIC: 
+CREG: 0,1

OK

ATT: OK
RIC: 
+CREG: 0,1

OK

DEBUG:SMS TEST
ATT: >
RIC: 
> 
DEBUG:>
ATT: +CMGS
RIC: 
+CMGS: 18

OK


SMS enviado

Y la verdad no, no he probado con otro contenido de mensaje

En el móvil solo me llega el mensaje "Necesito ayuda" supongo que algo pasa en adjuntar los datos obtenidos del GPS al mensaje SMS porque ni si quiera concadena la url de google maps.

probé solo llamando la variable 'mensaje' y no tiene datos, es decir, me llego el SMS en blanco, un pequeño espacio en blanco, al parecer no las toma para concadenar el mensaje completo "necesito ayuda estoy cerca de Google Maps ,
Luego probé que me imprima en monitor serial solo los datos que captura del gps y si los imprime, entonces no se que es lo que falla, apreciaría la ayuda.

estaba leyendo en el foro US , de que hay una librería NeoGPS alguna sugerencia?

Aprende a ser mas paciente!! te respondí ayer y hay 100tos de foreros.
Es obvio para mi que tu código se queda sin RAM tal vez.. agrega y busca previamente la función que te muestra por monitor serie la cantidad de RAM disponible, no sea cosa que algun String o cadena esta consumiendo tu ram y el Arduino se esta comportando raro por eso.

Esto que haces al enviar el sms no me gusta.
El puerto virtual gsm se inicializa en el setup habitualmente. No en una rutina.

void EnviarSMS() {
  //este metodo se encarga del envio del mensaje SMS a un destinatario
  //definido en este punto
  Serial.println(F("Encendiendo Shield GSM"));
  //inicio shield GSM SIM900
  if (gsm.begin(9600)) { // <==== MAL DEFINIDO debe ir en setup 
    gsm.forceON();            <==== MAL DEFINIDO debe ir en setup LO MISMO
    if (sms.SendSMS("123456789", mensaje)) {
      Serial.println(F("\nSMS enviado"));
      Luces();
    }
  }    
}

Verifica si esto ayuda.

jaja perdón, voy a probar tu consejo y le quedo de avisar.

hice dos pruebas colocando lo siguiente en el void setup y no llego SMS.

void setup()
{
   if (gsm.begin(9600)) {
    gsm.forceON();
  Serial.begin(9600);
  ss.begin(GPSBaud);
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  // Apagamos el LED al empezar
  digitalWrite(ledPin , LOW) ;
  //inicia placa arduino
 
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  Serial.println(F("Sistema iniciado"));
}
}

Y en el serial port mostró esto (probé dos veces).

Sistema iniciado
1
2
3
4
5
Encendiendo Shield GSM
DEBUG:SMS TEST

SMS enviado
1
2
3
4
-36.585876,-72.096893
Encendiendo Shield GSM
DEBUG:SMS TEST

SMS enviado

Hola, Solucionaste tu problema?
yo tengo un problema similar, el sim900 me responde pero en ves de aparecer las coordenadas gps solo me aparece 1000.000 en latitud y longitud, he probado el programa en arduino uno y en un mega y pasa los mismo, si tienes alguna pista te agradecería la publiques.