Go Down

Topic: Problemas con localizador GPS (Read 823 times) previous topic - next topic

raquelvillanueva8

Buenas tardes,

Estoy intentando montar un localizador gps pero estoy teniendo problemas para que los modulos gps y gsm funcionen conjuntamente.

El modulo gps que estoy utilizando es es este:

gps

el modulo gms este:

GSM

Los dos modulos por separado funcionan a la perfeccion pero cuando intento implementar el codigo conjunto deja de funcionar, en el codigo tengo comentado el iniciar el modulo GPS (initGPS();) ya que si lo descomento al recibir llamada no hace nada, creo que el fallo esta a la hora de iniciar los puertos.

Por favor, alguien podría guiarme para ver donde puede estar el fallo? Gracias de antemano

Code: [Select]
#include <SoftwareSerial.h>
#include <TinyGPS.h>//incluimos TinyGPS

TinyGPS gps;//Declaramos el objeto gps

SoftwareSerial serialgps(4,3);//Declaramos el pin 4 Tx y 3 Rx
SoftwareSerial mySerial(7,8); //rx,tx

String inGSM; //Almacenar la informaci'on leida del modulo gsm
String numList[]={"676394895","676394895"}; //N'umeros autorizados
boolean enviado=false;
double ttl=0; //Tiempo de vida


//Declaramos la variables para la obtención de datos
int year;
byte month, day, hour, minute, second, hundredths;
unsigned long chars;
unsigned short sentences, failed_checksum;
void setup(){
  mySerial.begin(9600);
  Serial.begin(9600);
 // initGPS(); //iniciar el modulo gps
 initGSM(); //iniciar el modulo gsm*/


}
 
void initGSM(){
 
  Serial.println("Iniciando...");
  mySerial.print("AT+CLIP=1\r\n"); //Activar alarma llamada
  delay(500); 
  mySerial.print("AT+CMGF=1\r\n"); //Activar modo texto
  delay(500);
}

 
void initGPS(){
   
  serialgps.begin(9600);//Iniciamos el puerto serie del gps
  //Imprimimos:
  Serial.println("");
  Serial.println("GPS GY-GPS6MV2 Leantec");
  Serial.println(" ---Buscando senal--- ");
  Serial.println("");
  delay(500);
}


//Funci'on: Comprueba si el n'umero est'a autorizado
//true si tiene permiso, false si no lo tiene.
boolean isAllow(String num){
  for (int i=0;i<sizeof(numList);i++){
     if (num==numList[i])
         return true;
  }
  return false;
}

void sendSMS(){

  Serial.println("Enviando SMS...");
      mySerial.print("AT+CMGF=1\r");  //Configura el modo texto para enviar o recibir mensajes
      delay(1000);
      mySerial.println("AT+CMGS=\"676394895\"");  //Numero al que vamos a enviar el mensaje
      delay(1000);
      mySerial.println("SMS enviado desde un Arduino. Saludos de Prometec.");  // Texto del SMS
      delay(100);
      mySerial.println((char)26); //Comando de finalización ^Z
      delay(100);
      mySerial.println();
      delay(5000);  // Esperamos un tiempo para que envíe el SMS
      Serial.println("SMS enviado");
}

void loop() {
  inGSM="";
  ttl++;
 
    //Leer enventos en modulo gsm
  while (mySerial.available()>0){
     delay(10);
     inGSM += (char)mySerial.read();
  }
 
  Serial.print(inGSM);

  //Si llamada
  if (inGSM.indexOf("RING")>-1){
      delay(1000);
     
      String num;
      int inicio=inGSM.indexOf('"')+1;
      int fin=inicio+9;
     
      num=inGSM.substring(inicio,fin); //Extraer n'umero   
     
     
      //Si autorizado, accionar rel'e   
      if (isAllow(num) && enviado==false)
      {
            Serial.print("Autorizado" + num);
            enviado=true;
            //sendSMS();
              Serial.print("Localización enviada");
      }
 
  }
   
  //En caso de perder la cobertura, volver a conectarse a la red
  if (inGSM.indexOf("CREG:")>-1 && inGSM.indexOf("CREG: 0,1")==-1 && inGSM.indexOf("CREG: 0,5")==-1){
    Serial.println("Se ha perdido la cobertura, reiniciando...");
    mySerial.print("AT+CFUN=1,1\r\n");
    delay(4000);
    initGSM();
  }
   
  //Comprobar estado de la red
  if (ttl==150000){
     mySerial.print("AT+CREG?\r\n");
     ttl=0;
  }   
}

surbyte

No veo secuencia de POWER_ON del A6.
Debes asegurarte que este bien encendido.
Luego debes asegurarte que tome cobertura.

Por tu comentario no parece ser importante porque te funciona por separado. Miraré el código a ver que encuentro.

raquelvillanueva8

Muchas gracias por la respuesta yo creo que es algo de los pines. Me han indicado que conecte algo al los pines 0,1 ya que creo que viene por ahí la cosa porque el codigo por separado funciona pero cuando inicio los pines de los dos modulos deja de funcionar.. la verdad es que estoy un poco pez en todo esto

surbyte

Los pines 0 y 1 son los pines de Serial Hardware, tu código usa SoftwareSerial de modo que eso no puede ser.
Code: [Select]
SoftwareSerial serialgps(4,3);//Declaramos el pin 4 Tx y 3 Rx
SoftwareSerial mySerial(7,8); //rx,tx


Usas 4,3 con el GPS y 7,8 con el A6.
Para la proxima comprate un A7 y ahorras algo... tiene las dos cosas en 1.

raquelvillanueva8

Gracias a la ayuda de un compeñaro éste me los solucionó, no era nada de pines. Actualmente tengo conectado el modulo gms en los 0,1 y el gps en los 7,8. Era codigo no tenía correctamente los while en el loop.

Este es el codigo que cuando recibe llamada envia coordenadas pero aún no funciona ya que no envia el sms y tampoco cuelga la llamada pero si obviais esa parte imprime en pantalla las coordenadas del gps.

Code: [Select]
#include <SoftwareSerial.h>
#include <TinyGPS.h>//incluimos TinyGPS

TinyGPS gps;//Declaramos el objeto gps
SoftwareSerial serialgps(8,7);

//Declaramos la variables para la obtención de
      //VARIABLES PARA EL MODULO GMS
      String inGSM; //Almacenar la informacion leida del modulo gsm
      String numList[]={"676394895","676394895"}; //Numeos
      boolean enviado=false; //para saber si hemos enviado sms con coordenadas
      double ttl=0; //Tiempo de vida
      //VARIABLES PARA EL MODULO GPS
      int year;
      byte month, day, hour, minute, second, hundredths;
      unsigned long chars;
      unsigned short sentences, failed_checksum;
      bool datos_gpsOK = false;
      float latitude, longitude;

void setup() {
  serialgps.begin(9600);//Iniciamos el puerto serie del gps
  Serial.begin(9600);
  delay(1000);
 
  Serial.print("AT+CMGF=1\r"); // Configuración del módulo GSM en modo texto.
  delay(100);
 
  Serial.print("MODULOS GSM Y GPS INICIADOS");
  enviado=false;
}//Fin Setup


//Comprobamos si el numero llamante es autorizado
boolean isAllow(String num) {
  for (int i=0;i<sizeof(numList);i++) {
     if (num==numList[i])
         return true;
  }//Fin for
  return false;
}//Fin isAllow

void SendSMS() {  // Enviamos coordenadas por sms

  Serial.print("Latitud/Longitud: ");
  Serial.print(latitude,5);
  Serial.print(", ");
  Serial.print(longitude,5);

colgar();
     
      Serial.println("AT+CMGS=\"676394895\"");  //Numero al que vamos a enviar el mensaje
      delay(1000);
     
      Serial.println("SMS enviado desde un Arduino. Saludos de Prometec.");  // Texto del SMS
      delay(100);
     
      Serial.println((char)26); //Comando de finalización
      delay(100);
     
      Serial.println();
      delay(5000);  // Esperamos un tiempo para que envíe el SMS
     
      Serial.println("SMS enviado");
}

//Leemos coordenadas
void leo_GPS() { // aca solo lees el GPS, y aca esta. Se entiende?
 
  while (serialgps.available()>0) { //Leemos gps
       
         int c = serialgps.read();

         if (gps.encode(c))        {
             gps.f_get_position(&latitude, &longitude);
             datos_gpsOK = true;
             break;
         }
  }//Fin while
}

void colgar() {
  // implementa colgar
  Serial.println("ATH");  // Cuelga la llamada
  delay(1000);
  Serial.println("Llamada finalizada");
}
void loop()  {
  bool finGSM = false;
  inGSM = "";
  ttl++;
  int c ;
 
  leo_GPS();

  //Leer eventos en modulo gs
  while (Serial.available()) {
     delay(10);
     inGSM += (char)Serial.read();
     finGSM = true;
  }  //Fin while
  if (finGSM)
      Serial.print(inGSM);

  //Si entra llamada
  if (inGSM.indexOf("RING")>-1)   {
      delay(100);

      String num;
      int inicio=inGSM.indexOf('"')+1;
      int fin = inicio+9;

      num = inGSM.substring(inicio,fin); //Extraer n'umero   
      //Si autorizado,   
      if (isAllow(num) && enviado==false)  {
          if (datos_gpsOK) {  // si es true Enviamos SMS
              enviado = true;
              SendSMS();
              Serial.println("SMS ENVIADO");
          }
          else {
              Serial.println("SMS NO ENVIADO");
          }//fin else
      }//Fin if

  }//Fin if
}//fin loop

Go Up