arduino gps

        #include <LGPRS.h>
    #include <LGPRSClient.h>
    #include <LGPRSServer.h>
    #include <LGPS.h> 

    char server[]="narando.tpddns.cn"; //server ip
    int port = 8010;                  //server port
    String stringSix;                //server path
    char buff[256];
    gpsSentenceInfoStruct info;      
    LGPRSClient client;

    /*get the comma location num of GPGGAstr data*/
    static unsigned char getComma(unsigned char num,const char *str)
    {
      unsigned char i,j = 0;
      int len=strlen(str);
      for(i = 0;i < len;i ++)
      {
         if(str[i] == ',')
          j++;
         if(j == num)
          return i + 1; 
      }
      return 0; 
    }

    /*cut out data,start from the comma location to first comma location*/
    static double getDoubleNumber(const char *s)
    {
      char buf[10];
      unsigned char i;
      double rev;  
      i=getComma(1, s);
      i = i - 1;
      strncpy(buf, s, i);
      buf[i] = 0;
      rev=atof(buf);
      return rev; 
    }

    /*parse year,month,day from GPRMC data*/
    char* change_rtc(const char *GPRMC)
    {  
         String strYear,strMonth,strDay;
         char buf[50],str11[255],str12[255],str13[255];
         char* p;
         int tmp;
         int year1,year2,month1,month2,day1,day2;
         if(GPRMC[0] == '$')
         {
         tmp = getComma(2, GPRMC);
         sprintf(buf, "mode:%c", GPRMC[tmp]);
         Serial.println(buf); 
         bzero(buf, 50);     

         tmp = getComma(9, GPRMC);     
         day1 = GPRMC[tmp+0]-'0';
         day2 = GPRMC[tmp+1]-'0';
         sprintf (str11,"%d%d",day1,day2);
         strDay = String(str11);
         Serial.println(strDay);    

         month1 = GPRMC[tmp+2]-'0';
         month2 = GPRMC[tmp+3]-'0';
         sprintf (str12,"%d%d",month1,month2);
         strMonth = String(str12);
         Serial.println(strMonth);

         year1 = GPRMC[tmp+4]-'0';
         year2 = GPRMC[tmp+5]-'0';
         sprintf (str13,"%d%d",year1,year2);
         strYear = String(str13);
         Serial.println(strYear);
         sprintf(buf, "%d%d%d%d%d%d", year1,year2,month1,month2,day1,day2);
         p = buf;
         Serial.println(p);
         return p;
       }   
    }

    /*parse GPGGA data,get latitude,longitude,hour,minute,second;then make up the server path,send http get please*/
    void parseGPGGA(const char* GPGGAstr)
    { 
      String stringOne,stringTwo,stringThree,stringFour,stringFive,strYmd,strHms,strMs,strHour,strTime,stringKeyword; 
      Serial.println("LGPS loop"); 
      delay(4000);
      LGPS.getData(&info);
      change_rtc((char*)info.GPRMC);
      Serial.println((char*)info.GPGGA);
      Serial.println((char*)info.GPRMC);

      if(GPGGAstr[0] == '$')
      { 

        String stri,strj,strl,strm,strMinu,strSec;
        double latitude,longitude,ms; 
        char str1[255],str2[255],str3[255],str4[255],str5[255],str6[255],str7[255],str8[255],str9[255],str10[255];
        int tmp,hour1,hour2,minute1,minute2,second1,second2;
        int i,l;
        double j,k,m,n;
         stringOne = String("/BopLostServer/addtimechange.action?lng=");
        stringThree = String("&lat=");
        stringFive = String("&time=20");
        stringKeyword = String("&keyword=1");  


        sprintf(str9,"%s",change_rtc((char*)info.GPRMC));
        strYmd = String(str9);
        Serial.println("YMD is:  ");
        Serial.println(strYmd);
      /*get latitude*/
        tmp = getComma(2, GPGGAstr);
        latitude = getDoubleNumber(&GPGGAstr[tmp]);
        i = latitude/100;
        j = (latitude - (i*100))/60;
        k = i + j;
        sprintf (str1,"%d",i);
        sprintf (str5,"%8.6f",j);
        sprintf (str6,"%8.6f",k);
        stri = String(str1);
        strj = String(str5);
        stringFour = String(str6);
        Serial.println(stringFour);

        /*get longitude*/
        tmp = getComma(4, GPGGAstr);
        longitude = getDoubleNumber(&GPGGAstr[tmp]);
        l = longitude/100;
        m = (longitude-(l*100))/60;
        n = l + m;
        sprintf(str2,"%d",l);
        sprintf(str7,"%9.6f",m);
        sprintf (str8,"%9.6f",n);
        strl = String(str2);
        strm = String(str7);
        stringTwo = String(str8);    
        Serial.println( stringTwo);
        sprintf(buff, "latitude = %8.4f, longitude = %8.4f", latitude, longitude);
        Serial.println(buff);
        Serial.println("get data ok !!!");
        /*get hour*/
        tmp = getComma(1, GPGGAstr);
        hour1 = (GPGGAstr[tmp+0]-'0');
        hour2 = GPGGAstr[tmp+1]-'0';
        sprintf (str3,"%d%d",hour1,hour2);
        strHour = String(str3);
        Serial.println(strHour);
         /*get minute*/
        tmp = getComma(1, GPGGAstr);
        minute1 = (GPGGAstr[tmp+2]-'0');
        minute2 = (GPGGAstr[tmp+3]-'0');
        sprintf (str10,"%d%d",minute1,minute2);
        strMinu = String(str10);
        Serial.println(strMinu);
        /*get second*/
        tmp = getComma(1, GPGGAstr);
        second1 = (GPGGAstr[tmp+4]-'0');
        second2 = (GPGGAstr[tmp+5]-'0');
        sprintf (str10,"%d%d",second1,second2);
        strSec = String(str10);
        Serial.println(strSec);

        strHms = strHour + strMinu + strSec;
        Serial.println(strHms);
       /*server path for get please*/
        stringSix = stringOne + stringTwo + stringThree + stringFour + stringFive + strYmd + strHms + stringKeyword;   
        Serial.println(stringSix); 
      }
      else
      {
        Serial.println("Not get data"); 
      }

       delay(3000);
    /*start get please*/    
       Serial.println("start get...");
       if (client.connect(server, port)) {
        Serial.println("connected http....");
        client.print("GET ");
        client.print(stringSix);
        Serial.println(stringSix); 
        client.println(" HTTP/1.1");
        client.print("Host: ");
        client.println(server);
        client.print(" :");
        client.println(port);
        Serial.println("Attach to GPS network by auto-detect APN setting2");
        //client.println(server);
        client.println("Connection:close");
        client.println();
        Serial.println("------------");
     }
      else{
        Serial.println("connection failed");
      }
      Serial.println("end get!"); 
    /*end get*/

    /*end get return data for http*/  
      }

    void setup() {
      /*open uart*/
      Serial.begin(115200);

    /*start attach gps */
      LGPS.powerOn();
      Serial.println("LGPS Power on, and waiting ..."); 
      delay(3000);  
      Serial.println("Attach to GPS !!!");
    /*end attach gps */

    /*start attach gprs */
      Serial.println("start gprs link...");
      while(!LGPRS.attachGPRS())  {
      Serial.println("Attach to GPS network by auto-detect APN setting1");
      delay(500);
      }
      Serial.println("link gprs ok!!!");  
    /*end attach gprs */}

    void loop(){
    /*parse GPGGA data and send GPGGA for Http*/
      parseGPGGA((const char*)info.GPGGA);
      delay(2000);
    }

制作一个基于arduino 和12864液晶模块的图形化显示GPS导航系统,作品效果和成本可能无法和TB上的导航产品媲美,但是动手过程会带给你乐趣和知识。 需要了解的背景知识: arduino 相关基础; 能使用12864 液晶模块; 能够用arduino 通过串口通信获取GPS模块定位信息; 能够用arduino 操作SD卡模块; 需要的主要硬件: arduino UNO 1片; 12864 液晶模块 1片; GPS模块1片; SD卡模块及SD卡 1套; 原理介绍: 将地图数据依据瓦片算法存储在SD卡中,通过串口获取GPS定位信息并从中解析出经纬度坐标,依据经纬度坐标读取相应地图数据显示在12864液晶模块上,同时显示定位坐标点。 1. 地图存储算法——瓦片系统(Maps Tile System) 本制作采用的地图数据和地图存储算法来源于微软的bing maps并做了相应修改,具体可参考: Bing Maps Tile System[1*] Virtual Earth Tile Image URI 参数解析 Goolge and Microsoft Map Url Parameters 在瓦片系统中地图采用金字塔式的分层存储结构,不同层具有不同级别的地图分辨率(地图精细程度),每一层地图被分割成等像素大小(256X256)的瓦片,算法要解决的问题就是给定经纬度坐标和缩放级别(层索引)得到具体相应的瓦片编号。 在连接[1*]的最后有算法实现的代码可共参考。 2. 针对12864液晶模块的设计 12864液晶模块是128像素宽64像素高的单色液晶显示模块,本制作为了适应模块显示做出了两个设计。 1). 将256X256像素的瓦片裁切成128X64像素大小的8份 子瓦片,如下图所示: 每层每个瓦片均做相应处理。 2). 通过阈值方法将8位png索引图像(bing maps 的道路数据)转换成二进制地图数据文件,为了能够显示原图中的文字信息,采用多阈值提取求或方法提取原地图中背景、地物和标注文字数据,由于标注文字和背景之间的扰动,提取效果有待改进。 显示效果: 生成地图程序(需要连接互联网): 通过设置地图范围经纬度信息获取要使用定位的区域,可通过google earth 等能显示经纬度的软件或网页获取经纬度的最大最小值(上大下小,右大左小), 缩放级别建议设置范围1~15,较大地图范围和较高缩放级别会增加地图下载、显示加载的时间。 arduino 代码说明: 1. 在“LCD12864RSPI” 文件中加入画点函数,减少重绘区域; 2. 使用占用内存小、具有只读能力的SD模块库“petit_fatfs”; 3. 分配1K内存用于地图数据缓存,由于SD卡库只支持8.3文件名,地图数据文件名采用十六进制不定长压缩编码方式命名。
这是一篇关于动手制作基于arduino 和12864液晶模块的图形化显示GPS导航系统的帖子,作品效果和成本可能无法和TB上的导航产品媲美,但是动手过程会带给你乐趣和知识。 该设计根据功能分为三个版本。(具体详见附件内容) 最终版本视频演示: 动手之前最好能具备一些背景知识: 1. arduino 相关基础; 2. 能使用12864 液晶模块; 3. 能够用arduino 通过串口通信获取GPS模块定位信息; 4. 能够用arduino 操作SD卡模块; 制作所需主要硬件: arduino UNO 1片; 12864 液晶模块 1片; GPS模块1片; SD卡模块及SD卡 1套; 如截图: 原理: 将地图数据依据瓦片算法存储在SD卡中,通过串口获取GPS定位信息并从中解析出经纬度坐标,依据经纬度坐标读取相应地图数据显示在12864液晶模块上,同时显示定位坐标点。 1. 地图存储算法——瓦片系统(Maps Tile System) 本制作采用的地图数据和地图存储算法来源于微软的bing maps并做了相应修改。 具体可参考: Bing Maps Tile System[1*] Virtual Earth Tile Image URI 参数解析 Goolge and Microsoft Map Url Parameters 在瓦片系统中地图采用金字塔式的分层存储结构,不同层具有不同级别的地图分辨率(地图精细程度),每一层地图被分割成等像素大小(256X256)的瓦片,算法要解决的问题就是给定经纬度坐标和缩放级别(层索引)得到具体相应的瓦片编号。 在连接[1*]的最后有算法实现的代码可共参考。 2. 针对12864液晶模块的设计 12864液晶模块是128像素宽64像素高的单色液晶显示模块,本制作为了适应模块显示做出了两个设计。 1). 将256X256像素的瓦片裁切成128X64像素大小的8份 子瓦片。 如下图所示: 2). 通过阈值方法将8位png索引图像(bing maps 的道路数据)转换成二进制地图数据文件,为了能够显示原图中的文字信息,采用多阈值提取求或方法提取原地图中背景、地物和标注文字数据,由于标注文字和背景之间的扰动,提取效果有待改进。 显示效果: 生成地图程序(需要连接互联网): 通过设置地图范围经纬度信息获取要使用定位的区域,可通过google earth 等能显示经纬度的软件或网页获取经纬度的最大最小值(上大下小,右大左小)。缩放级别建议设置范围1~15,较大地图范围和较高缩放级别会增加地图下载、显示加载的时间。 注意:上面是对GPS导航V0.1版本的具体介绍,其他的V0.2和V0.3版本详见附件内容。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值