Hi. I have some troubles with a project in wich im involved for two weeks. But I got stuck in the (for me) dumbest part.
First of all, i exactly have this GPS/GSM/GPRS Shield connected to a normal Arduino UNO: GPS_GPRS_GSM_Module_V3.0_(SKU_TEL0051)-DFRobot
And using this code for testing the GPS:
// Product name: GPS/GPRS/GSM Module V3.0
// # Product SKU : TEL0051
// # Version : 1.2
// # Description:
// # The sketch for driving the gps mode via the Arduino board
// # Steps:
// # 1. Turn the S1 switch to the Prog(right side)
// # 2. Turn the S2 switch to the Arduino side(left side)
// # 3. Set the UART select switch to middle one.
// # 4. Upload the sketch to the Arduino board
// # 5. Turn the S1 switch to the comm(left side)
// # 6. RST the board
// # If you get 'inf' values, go outdoors and wait until it is connected.
// # wiki link- http://www.dfrobot.com/wiki/index.php/GPS/GPRS/GSM_Module_V3.0_(SKU:TEL0051)
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]={
'
i cant get an acceptable position; here are the results that i got last time I tested:
Being my actual positon the blue dot, and the sim908 result the red one, that's about 50/60 Km (38 Miles) of difference. I dont want to get between 10/20 m accuracy, i'd accept even if it were 100/150m; but that is too much.
Firstly, I thought it was because of the small integrated antenna attached to the shield, so i placed (with the SMA/uFL adaptor) this antenna: Antena GPS con base magnética / GPS-GLONASS Sparkfun GPS-14986 | BricoGeek.com
But I'm still getting the same wrong positions...
I've been looking up in google for this, i tried so many things, but i dont see where am I doing wrong.
I tried, as I said, with the antenna, but also going outside with clear skies and no buildings surrounding, supplying power through and old PC PSU (with 12V in Vin Pin)...
But nothing works, if you guys could advice me, you'd be my heros.,'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
long time=t;
int h=time/10000;
int m=(time/100)%100;
int s=time%100;
// if(h>=24) //UTC+
// {
// h-=24;
// }
if (h<0) //UTC-
{
h+=24;
}
Serial.print(h);
Serial.print("h");
Serial.print(m);
Serial.print("m");
Serial.print(s);
Serial.println("s");
//Serial.println(t);//Print data
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)/100.0,7);//print latitude
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)/100.0,7);
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
return;
}
}
}
}
void setup()
{
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();
Serial.print("Lat:");
latitude();
Serial.print("Dir:");
lat_dir();
Serial.print("Lon:");
longitude();
Serial.print("Dir:");
lon_dir();
Serial.print("Alt:");
altitude();
Serial.println(' ');
Serial.println(' ');
}
}
i cant get an acceptable position; here are the results that i got last time I tested:
http://imgur.com/9RHNOHC
Being my actual positon the blue dot, and the sim908 result the red one, that's about 50/60 Km (38 Miles) of difference. I dont want to get between 10/20 m accuracy, i'd accept even if it were 100/150m; but that is too much.
Firstly, I thought it was because of the small integrated antenna attached to the shield, so i placed (with the SMA/uFL adaptor) this antenna: http://tienda.bricogeek.com/modulos-radiofrecuencia/218-antena-gps-3v-con-base-magnetica.html
But I'm still getting the same wrong positions...
I've been looking up in google for this, i tried so many things, but i dont see where am I doing wrong.
I tried, as I said, with the antenna, but also going outside with clear skies and no buildings surrounding, supplying power through and old PC PSU (with 12V in Vin Pin)...
But nothing works, if you guys could advice me, you'd be my heros.