General

GPS/GPRS/GSM Module V3.0, "stuck at Lat:" Broken?!?!

userHead MMAB 2014-07-22 20:47:58 3865 Views3 Replies
Hi there,

I am having a problem with retrieving the Geolocation of my system. I am using Arduino MEGA 250 as my main board, i am also using the following ports 12,11,10,9,8,7 for my LCD display, the jumpers are still on the pins and i am using them to retrieve the location. I have been able to retrieve UTC successfully, but when the system gets to the point of receiving the Lat: it just stopes..... I tried going outside, to the roof i even took the system with me to another country and tested it, but nothing happened. ??? At first i used to get ovf. as an output.... but now NOTHING!!!! :-\

I am not sure why is this happening with me, there isn't anything with the power supply, because i can send, receive SMS's and even make phone calls.

I used the exact same code provided, to test it.. NOTHING!!
Code: Select all
// Product name: GPS/GPRS/GSM Module V3.0

// include the library code:
#include <LiquidCrystal.h>
double lon;
double UTCP;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

double Datatransfer(char *data_buf,char num)//convert the data to the float type
{                                           //*data_buf?the data array                                       
  double temp=0.0;                           //the number of the right of a decimal point
  unsigned char i,j;
 
  if(data_buf[0]=='-')
  {
    i=1;
    //process the data array
    while(data_buf[i]!='.')
      temp=temp*10+(data_buf[i++]-0x30);
    for(j=0;j<num;j++)
      temp=temp*10+(data_buf[++i]-0x30);
    //convert the int type to the float type
    for(j=0;j<num;j++)
      temp=temp/10;
    //convert to the negative numbe
    temp=0-temp;
  }
  else//for the positive number
  {
    i=0;
    while(data_buf[i]!='.')
      temp=temp*10+(data_buf[i++]-0x30);
    for(j=0;j<num;j++)
      temp=temp*10+(data_buf[++i]-0x30);
    for(j=0;j<num;j++)
      temp=temp/10 ;
  }
  return temp;
}
 
char ID()//Match the ID commands
{ 
  char i=0;
  char value[6]={
    '$','G','P','G','G','A'    };//match the gps protocol
  char val[6]={
    '0','0','0','0','0','0'    };
 
  while(1)
  {
    if(Serial.available())
    {
      val[i] = Serial.read();//get the data from the serial interface
      if(val[i]==value[i]) //Match the protocol
      {    
        i++;
        if(i==6)
        {
          i=0;
          return 1;//break out after get the command
        }
      }
      else
        i=0;
    }
  } 
}
 
void comma(char num)//get ','
{   
  char val;
  char count=0;//count the number of ','
 
  while(1)
  {
    if(Serial.available())
    {
      val = Serial.read();
      if(val==',')
        count++;
    }
    if(count==num)//if the command is right, run return
      return;
  }
 
}
void UTC()//get the UTC data -- the time
{
  char i;
  char time[9]={
    '0','0','0','0','0','0','0','0','0'
  };
  double t=0.0;
 
  if( ID())//check ID
  {
    comma(1);//remove 1 ','
    //get the datas after headers
    while(1)
    {
      if(Serial.available())
      {
        time[i] = Serial.read();
        i++;
      }
      if(i==9)
      {
        i=0;
        t=Datatransfer(time,2);//convert data
        t=t+30000.00;//convert to the chinese time GMT+8 Time zone
        Serial.println(t);//Print data 
        UTCP = t;
        return;
      }  
    }
  }
}
void latitude()//get latitude
{
  char i;
  char lat[10]={
    '0','0','0','0','0','0','0','0','0','0'
  };
 
 
  if( ID())
  {
    comma(2);
    while(1)
    {
      if(Serial.available())
      {
        lat[i] = Serial.read();
        i++;
      }
      if(i==10)
      {
        i=0;
        Serial.println(Datatransfer(lat,5),5);//print latitude 
        lon = (Datatransfer(lat,5),5);
        return;
      }  
    }
  }
}
void lat_dir()//get dimensions
{
  char i=0,val;
 
  if( ID())
  {
    comma(3);
    while(1)
    {
      if(Serial.available())
      {
        val = Serial.read();
        Serial.write(val);
        Serial.println();
        i++;
      }
      if(i==1)
      {
        i=0;
        return;
      }  
    }
  }
}
void longitude()//get longitude
{
  char i;
  char lon[11]={
    '0','0','0','0','0','0','0','0','0','0','0'
  };
 
  if( ID())
  {
    comma(4);
    while(1)
    {
      if(Serial.available())
      {
        lon[i] = Serial.read();
        i++;
      }
      if(i==11)
      {
        i=0;
        Serial.println(Datatransfer(lon,5),5);
        return;
      }  
    }
  }
}
void lon_dir()//get direction data
{
  char i=0,val;
 
  if( ID())
  {
    comma(5);
    while(1)
    {
      if(Serial.available())
      {
        val = Serial.read();
        Serial.write(val); //Serial.println(val,BYTE);
        Serial.println();
        i++;
      }
      if(i==1)
      {
        i=0;
        return;
      }  
    }
  }
}
void altitude()//get altitude data
{
  char i,flag=0;
  char alt[8]={
    '0','0','0','0','0','0','0','0'
  };
 
  if( ID())
  {
    comma(9);
    while(1)
    {
      if(Serial.available())
      {
        alt[i] = Serial.read();
        if(alt[i]==',')
          flag=1;
        else
          i++;
      }
      if(flag)
      {
        i=0;
        Serial.println(Datatransfer(alt,1),1);//print altitude data
        //double s = (Datatransfer(alt,1),1);
        //lcd.setCursor(0, 1);
        //lcd.print(s);
        return;
      }  
    }
  }
}
void setup()
{
  
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  pinMode(3,OUTPUT);//The default digital driver pins for the GSM and GPS mode
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  digitalWrite(5,HIGH);
  delay(1500);
  digitalWrite(5,LOW);
 
  digitalWrite(3,LOW);//Enable GSM mode
  digitalWrite(4,HIGH);//Disable GPS mode
  delay(2000);
  Serial.begin(9600); 
  delay(5000);//GPS ready
 
  Serial.println("AT");   
  delay(2000);
  //turn on GPS power supply
  Serial.println("AT+CGPSPWR=1");
  delay(1000);
  //reset GPS in autonomy mode
  Serial.println("AT+CGPSRST=1");
  delay(1000);
 
  digitalWrite(4,LOW);//Enable GPS mode
  digitalWrite(3,HIGH);//Disable GSM mode
  delay(2000);
 
  Serial.println("$GPGGA statement information: ");
}
void loop()
{
  while(1)
  { 
    
    Serial.print("UTC:");
    UTC();
    lcd.setCursor(0, 0);
    lcd.print(UTCP);
    Serial.print("Lat:");
    latitude();
    lcd.setCursor(0, 1);
    lcd.print(lon);
    Serial.print("Dir:");
    lat_dir();
    Serial.print("Lon:");
    longitude();
    Serial.print("Dir:");
    lon_dir();
    Serial.print("Alt:");
    altitude();
    delay (1000);
    Serial.println(' ');
    Serial.println(' ');
    
    lcd.setCursor(0, 0);
    lcd.print(UTCP);
    lcd.setCursor(0, 1);
    lcd.print(lon);
        
  }
}
Thanks!!!
2014-08-08 18:56:41 Smart phone is different to these kind of module.
It will using AGPS to locate your approximate position first, and then it will using GPS to confirm your accurate location.

Anyway, did you try the wiki sample code? It looks very similar to yours.
userHeadPic Grey.CC
2014-08-08 10:51:11 Sorry for the late reply,

I am using a [6] double A batteries back, which gives me 9 volts in total... according to the online wiki it is more than enough to power up the module .... i am not sure what is the problem.. i even tried using the GPS in my phone, to make sure that it is not a signal issue.... and it worked perfectly. However, using this module is just proven to be a long and stressful wait.

Thanks!
userHeadPic MMAB
2014-07-23 00:53:49 Hello MMAB,

I solved the same problem by going outdoors. From other reports, same fix. So it is most likely a problem with the GPS signal. Do you have a clear picture of the module? And provide specific details of your hardware. Saying that the power supply has no problem does not clarify anything. How are you wiring it? what are the specs of the power supply?
userHeadPic Jose