8361浏览
查看: 8361|回复: 7

[进阶] Arduino mega2560 和商城里的GPS 求助怎么显示经度和纬度

[复制链接]
本人已纠结于 从GPS获取经纬度 ,代码如下#include <TinyGPS.h>
#include <LiquidCrystal.h>

TinyGPS gps;
long lat, lon;
unsigned long fix_age, time, date, speed, course;
unsigned long chars;
unsigned short sentences, failed_checksum;
int DEG;
int MIN1;
int MIN2;
void LAT(){                       //Latitude state
  DEG=lat/1000000;
  MIN1=(lat/10000)%100;
  MIN2=lat%10000;
  Serial.println("LAT:");              
Serial.print(MIN1);
Serial.print(".");
  Serial.print(MIN2);
Serial.print("'   ");
  Serial.println("  ");
}
void LON(){                        //Longitude state
DEG=lon/1000000;
MIN1=(lon/10000)%100;
  MIN2=lon%10000;
Serial.println("LON:");              
Serial.print(DEG);
  Serial.print(MIN1);
Serial.print(".");
Serial.print(MIN2);
Serial.print("'   ");
  Serial.println("  ");
}
void setup()
{
  Serial.begin(38400);            //Set the GPS baud rate.
  delay(10000);
}

void loop()
{
  while (Serial.available())
  {

    int c = Serial.read();                   // Read the GPS data
    if (gps.encode(c))                        // Check the GPS data
    {
       gps.get_position(&lat, &lon, &fix_age);   
      // process new gps info here
    }
  }
  gps.get_position(&lat, &lon, &fix_age);     // retrieves +/- lat/long in 100000ths of a degree
  gps.get_datetime(&date, &time, &fix_age);   // time in hhmmsscc, date in ddmmyy
//LAT();
//LON();
Serial.println(lat);
   delay(1000);
Serial.println(lon);
}



输出结果如下,可是经度和纬度都是9999999999   哪位大神能说一下哪错了吗
$GPGSV,3,1,09,12,23,127,,14,33,274,25,15,31,073,26,18,87,266,25*72
$GPGSV,3,2,09,20,24,134,,21,31,210,21,22,46,307,34,24,66,063,27*75
$GPGSV,3,3,09,25,07,162,18*4C
$GPGLL,4000.06376,N,11620.45307,E,111024.60,A,A*69
999999999
999999999
999999999
999999999
999999999
999999999
999999999






[img]file:///C:\Users\DELL\Documents\Tencent Files\2991299442\Image\C2C\3)K~HBT$U~$U%QJY2@_HX_Q.png[/img]

3)K~HBT$U~$U%QJY2@_HX_Q.png

hnyzcj  版主

发表于 2015-11-3 21:00:50

我记得我写过这段程序你可以自己参考下
回复

使用道具 举报

hnyzcj  版主

发表于 2015-11-3 21:04:10

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#define WireSend(args) Wire.write(args)
#define WireRead(args) Wire.read(args)
#define printByte(args) Serial.write(args)
#define printlnByte(args)  Serial.write(args),Serial.println()
#else
#include "WProgram.h"
#define WireSend(args) Wire.send(args)
#define WireRead(args) Wire.receive(args)
#define printByte(args) Serial.print(args,BYTE)
#define printlnByte(args)  Serial.println(args,BYTE)
#endif

#include <Wire.h>

#define BUFFER_LENGTH 10//Define the buffer length

int GPSAddress = 0x42;//GPS I2C Address

double Datatransfer(char *data_buf,char num)//Data type converter:convert char type to float
{                                           //*data_buf:char data array ;num:float length
  double temp=0.0;
  unsigned char i,j;

  if(data_buf[0]=='-')//负数的情况
  {
    i=1;
    //数组中的字符型数据转换成整数并累加
    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;
    //转换成负数
    temp=0-temp;
  }
  else//正数情况
  {
    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;
}
void rec_init()//initial GPS
{
  Wire.beginTransmission(GPSAddress);
  WireSend(0xff);//发送数据所在的地址      
  Wire.endTransmission();

  Wire.beginTransmission(GPSAddress);
  Wire.requestFrom(GPSAddress,10);//要求从GPS器件读取10个字节
}
char ID()//接收语句的ID
{
  char i = 0;
  char value[7]={
    '$','G','P','G','G','A',','      };//要接收的GPS语句的ID内容
  char buff[7]={
    '0','0','0','0','0','0','0'      };

  while(1)
  {
    rec_init();//接收数据初始化   
    while(Wire.available())   
    {
      buff[i] = WireRead();//接收串口的数据  
      if(buff[i]==value[i])//对比是否是正确的ID
      {
        i++;
        if(i==7)
        {
          Wire.endTransmission();//结束接收
          return 1;//接收完毕返回1
        }
      }
      else
        i=0;
    }
    Wire.endTransmission();//结束接收
  }
}
void UTC()//获取时间信息
{
  char i = 0,flag=0;
  char value[7]={
    '$','G','P','G','G','A',','   };
  char buff[7]={
    '0','0','0','0','0','0','0'       };
  char time[9]={
    '0','0','0','0','0','0','0','0','0'    };//存放时间数据
  double t=0.0;

  while(1)
  {
    rec_init();   
    while(Wire.available())   
    {
      if(!flag)
      {
        buff[i] = WireRead();
        if(buff[i]==value[i])
        {
          i++;
          if(i==7)
          {
            i=0;
            flag=1;
          }
        }
        else
          i=0;
      }
      else
      {
        time[i] = WireRead();
        i++;
        if(i==9)
        {
          t=Datatransfer(time,2);//转换成浮点型数据
          t=t+80000.00;//将时间转换成北京时间
          Serial.println(t);//输出时间数据
          Wire.endTransmission();
          return;
        }
      }
    }
    Wire.endTransmission();
  }
}
void rec_data(char *buff,char num1,char num2)//接收数据子函数
{                                            //*buff:存放接收数据的数组;num1:逗号数目;num2:数组长度。
  char i=0,count=0;

  if(ID())
  {
    while(1)
    {
      rec_init();   
      while(Wire.available())   
      {
        buff[i] = WireRead();
        if(count!=num1)
        {  
          if(buff[i]==',')
            count++;
        }
        else
        {
          i++;
          if(i==num2)
          {
            Wire.endTransmission();
            return;
          }
        }
      }
      Wire.endTransmission();
    }
  }
}

float latitude()//获取纬度信息
{
  char lat[10]={
    '0','0','0','0','0','0','0','0','0','0' };//存放纬度数据
  rec_data(lat,1 ,10);//接收纬度数据
  Serial.println(Datatransfer(lat,5),5);//将纬度数据转换成浮点型数据并输出
   return Datatransfer(lat,5);

}

void lat_dir()//获取纬度方向信息
{
  char dir[1]={'0'};//存放纬度方向数据
  rec_data(dir,2,1);//接收纬度方向数据
  printlnByte(dir[0]);//将纬度方向信息输出
}

void  longitude( )//获取经度信息
{

  char lon[11]={
    '0','0','0','0','0','0','0','0','0','0','0' };//存放经度数据
  rec_data(lon,3,11);//接收经度数据
  Serial.println(Datatransfer(lon,5),5);//将经度数据转换成浮点型数据并输出
    lcd.print(Datatransfer(lon,5),5);
}

void lon_dir()//获取经度方向信息
{
  char dir[1]={'0'};
  rec_data(dir,4,1);
  printlnByte(dir[0]);//将纬度方向信息输出
}
void altitude()//获取海拔信息
{
  char i=0,count=0;
  char alt[8]={
    '0','0','0','0','0','0','0','0' };

  if(ID())
  {
    while(1)
    {
      rec_init();   
      while(Wire.available())   
      {
        alt[i] = WireRead();
        if(count!=8)
        {  
          if(alt[i]==',')
            count++;
        }
        else
        {
          if(alt[i]==',')
          {
            Serial.println(Datatransfer(alt,1),1);
            Wire.endTransmission();
            return;
          }
          else
            i++;
        }
      }
      Wire.endTransmission();
    }
  }
}
void setup()
{
  Wire.begin();//IIC初始化
  Serial.begin(9600);//设置波特率
  Serial.println("DFRobot DFRduino GPS Shield v1.0");
  Serial.println("$GPGGA statement information: ");
  lcd.begin(16,2);
}
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(' ');
     lcd.begin(16, 2);              // 开始
     lcd.setCursor(0,0);
     lcd.print(latitude());
     Serial.println("++++++");
     Serial.println(latitude());
  }
}
回复

使用道具 举报

卓越仔  初级技师
 楼主|

发表于 2015-11-3 23:06:35

hnyzcj 发表于 2015-11-3 21:04
#include
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#if defined(ARDUINO) && ARDUINO >= 100

把GPS放到室外,运行了一下,还是没出数据,不知为什么
回复

使用道具 举报

卓越仔  初级技师
 楼主|

发表于 2015-11-3 23:06:34

hnyzcj 发表于 2015-11-3 21:04
#include
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#if defined(ARDUINO) && ARDUINO >= 100

把GPS放到室外,运行了一下,还是没出数据,不知为什么
回复

使用道具 举报

hnyzcj  版主

发表于 2015-11-4 06:14:46

我的是做了叠加三层,硬件顺序从下往上依次为:UNO+GPS+LCD Keypad Shield 按键扩展板
回复

使用道具 举报

卓越仔  初级技师
 楼主|

发表于 2015-11-4 12:31:14

hnyzcj 发表于 2015-11-4 06:14
我的是做了叠加三层,硬件顺序从下往上依次为:UNO+GPS+LCD Keypad Shield 按键扩展板  ...

我的是arduino mega2560和GPS模块直接连起来了, 连的是TX0和RX0,  想问一下你连的是是哪几个口呢
回复

使用道具 举报

刹那ZF清英  中级技师

发表于 2015-12-1 11:14:52

请收下我的膝盖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail