查看: 6295|回复: 2

sim900+GPS Shield短信查询定位

[复制链接]
  • TA的每日心情
    擦汗
    2014-7-18 09:38
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2014-7-31 16:19:50 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 ITEAD创易工作室 于 2014-8-1 09:51 编辑


    Hi,很高兴又跟大家见面了。之前给大家介绍了ICOMSAT,一款能打电话,收发短信的sim900扩展板。请注意,是扩展板!那么它肯定可以再直接叠加其他扩展板咯!没错,今天我们就给它加上定位跟踪功能。  GPS 扩展板是一款可以实现全球定位的扩展板,把它们结合在一起,我们就可以轻松地实现利用短信来查询当前的位置坐标,可以应用于货物定位查询。
    需要用到的配件有:

    peijian1.jpg
    等等!Iteaduino MEGA2560这个是什么鸟板?为什么不可以用UNO或者mega2560标准版?!你这是红果果地在打广告啊!举报版主!

    版主别开枪!请听我编故事:

    从前有个独臂神医,叫UNO,每天都要用净瓶收集清晨的露水用来制作药丹,医治贫苦众生。但他只有一只手,一个瓶,每天在太阳升起的时候才收集到很少。此事感动了上苍,造物主一次给他加了3只手,他现在一共有了4只手, 所以他可以用更多的瓶子接到更多的露水了。这样的故事看似应该收尾了,但是他发现虽然比以前接得多了,但是造物主开了个玩笑,给他的三只手都在同一个地方,还是在背后。3只手接同一边的露水,一只手接另一边的露水,往往单手的这边接满了,3只手的这边露水也早就接没了,每个只有半瓶多,这是极大的浪费。后来一位手术整形师听闻了此事,特地给他做了移植手术,把背后的三只手,其中一只手装到了单手的这边,另外两只装在对称的另一边。这样不仅美观帅气,还能灵活使用4只手协调工作了。他现在就是Iteaduino MEGA2560:详细产品资料http://pan.baidu.com/s/1o6uPI7g

    故事编完了,继续今天的教程。

    硬件设置和搭建:

    a)Icomsat的开关拨到UART的一端,跳线帽按照RXD->D2,TXD->D3如图,接上GSM天线和插上手机SIM卡。详细跳帽和引脚请下载查阅产品手册和原理图:http://pan.baidu.com/s/1eQGezWu  

    icomsat.jpg

    b)GPS扩展板的开关拨到5V,跳线帽按照RXD->D1,TXD->D0如图连接,接上GPS天线。详细产品资料下载:http://pan.baidu.com/s/1i3kk9FZ

    gps shield.jpg

    c) 我们的程序中会使用到MEGA2560的两个串口,UART1连接到Icomsat,UART2连接到GPS shield, 另外还有多余的串口可以烧写程序,所以可以先叠加好3个板子,连接USB线,直接烧写固件。

    把mega2560的开关拨到5V的一边。(此板还可以提供3.3v的IO电平)
    再把GPS shield和Icomsat堆叠起来,然后插到MEGA board板子上一排Arduino socket上
    mega.jpg

    IMG_0004.JPG

    IMG_0005.JPG

    d) 连接完成后的硬件图如下所示:

    IMG_0006.JPG
    烧写程序:

    a) 首先我们需要下载GSM和GPS的Arduino支持库。

    GSM:http://pan.baidu.com/s/1nt6xcPr

    tinyGPS:http://pan.baidu.com/s/1kT9OZJp

    b) 把两个库解压缩到Arduino\libraries的目录下,然后打开arduino IDE.
    接着把以下代码复制黏贴到Arduino IDE,烧写到MEGA主板上。“Board板子类型选择mega2560 or ADK”
    1. #include "SIM900.h"
    2. #include <SoftwareSerial.h>
    3. //#include "inetGSM.h"
    4. #include "sms.h"
    5. //#include "call.h"

    6. #include <string.h>

    7. #include <TinyGPS.h>

    8. /* This sample code demonstrates the normal use of a TinyGPS object.
    9.    It requires the use of SoftwareSerial, and assumes that you have a
    10.    4800-baud serial GPS device hooked up on pins 3(rx) and 4(tx).
    11. */

    12. TinyGPS gps;

    13. #define ledpin 13
    14. #define pwrkey 27

    15. //**************************************************************************
    16. char sms_rx[122]; //Received text SMS
    17. byte type_sms=SMS_ALL;      //Type of SMS
    18. byte del_sms=1;                //0: No deleting sms - 1: Deleting SMS
    19. char number_incoming[20];
    20. //**************************************************************************
    21. SMSGSM sms;
    22. int error;
    23. boolean started=false;
    24. bool newData = false;

    25. char gps_year[8];
    26. char gps_mon[3];
    27. char gps_day[3];
    28. char gps_hour[3];
    29. char gps_min[3];
    30. char gps_sec[3];


    31. char gps_lon[20];
    32. char gps_lat[20];

    33. char gps_sms[100];


    34. void setup()
    35. {

    36. //software power sim900 up

    37.   pinMode(pwrkey,OUTPUT);
    38.   digitalWrite(pwrkey,HIGH);
    39.   delay(600);
    40.   digitalWrite(pwrkey,LOW);
    41.   
    42.   
    43.   Serial.begin(115200);
    44.   Serial2.begin(9600);
    45.      if (gsm.begin(9600)) {
    46.           Serial.println("\nstatus=READY");
    47.           gsm.forceON();        //To ensure that SIM908 is not only in charge mode
    48.           started=true;
    49.      } else Serial.println("\nstatus=IDLE");

    50.   if(started)
    51.   {
    52.         //delete all sms message
    53.         
    54.         Serial.println("Deleting SMS");
    55.         char error = DeleteAllSMS();
    56.         if (error==1)Serial.println("All SMS deleted");      
    57.     else Serial.println("SMS not deleted");

    58.   
    59.   }
    60.   else
    61.   {Serial.println("SIM900 NOT EXISTED"); while(1);}
    62.   delay(10000);
    63.   
    64. }

    65. void loop()
    66. {

    67.         if(started)
    68.         {
    69.         
    70.                 check_gps();
    71.                 Check_SMS();
    72.         
    73.         }





    74. }



    75. void Check_SMS()  //Check if there is an sms 'type_sms'
    76. {
    77.      char pos_sms_rx;  //Received SMS position     
    78.      pos_sms_rx=sms.IsSMSPresent(type_sms);
    79.      if (pos_sms_rx!=0)
    80.      {
    81.        //Read text/number/position of sms
    82.        sms.GetSMS(pos_sms_rx,number_incoming,sms_rx,120);
    83.        Serial.print("Received SMS from ");
    84.        Serial.print(number_incoming);
    85.        Serial.print("(sim position: ");
    86.        Serial.print(word(pos_sms_rx));
    87.        Serial.println(")");
    88.        Serial.println(sms_rx);
    89.        if (del_sms==1)  //If 'del_sms' is 1, i delete sms
    90.        {
    91.          error=sms.DeleteSMS(pos_sms_rx);
    92.          if (error==1)Serial.println("SMS deleted");      
    93.          else Serial.println("SMS not deleted");

    94.        }
    95.                 if((strstr(sms_rx,"gps")!=0)&&(strlen(sms_rx)==3))
    96.                 {
    97.                                         Serial.println("\nsending SMS");
    98.                                 if(newData)
    99.                                 {
    100.                                         if (sms.SendSMS(number_incoming, gps_sms))
    101.                                         Serial.println("\nSMS sent OK");
    102.                                         else
    103.                                         Serial.println("\nSMS sent error");        
    104.                                 }
    105.                                 else
    106.                                 {
    107.                                         if (sms.SendSMS(number_incoming, "gps not ready"))
    108.                                         Serial.println("\nSMS sent OK");
    109.                                         else
    110.                                         Serial.println("\nSMS sent error");                                                
    111.                                 }
    112.                                 
    113.                 }
    114.         Serial2.flush();
    115.                
    116.      }
    117.          newData=false;
    118.      return;
    119. }


    120. char check_gps()
    121. {
    122.   newData=false;
    123.   unsigned long chars;
    124.   unsigned short sentences, failed;

    125.   // For one second we parse GPS data and report some key values
    126.   for (unsigned long start = millis(); millis() - start < 1000;)
    127.   {
    128.     while (Serial2.available())
    129.     {
    130.       char c = Serial2.read();
    131.       // Serial.write(c); // uncomment this line if you want to see the GPS data flowing
    132.       if (gps.encode(c)) // Did a new valid sentence come in?
    133.         newData = true;
    134.     }
    135.   }

    136.   if (newData)
    137.   {
    138.     float flat, flon;
    139.     unsigned long age;
    140.     int _year;
    141.     byte _month, _day,_hour,_minute,_second,_hundredths;        
    142.     gps.f_get_position(&flat, &flon, &age);
    143.         gps.crack_datetime(&_year,&_month,&_day,&_hour,&_minute,&_second,&_hundredths,&age);
    144.         flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6;
    145.         flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6;
    146.     dtostrf(flat, 11, 6, gps_lat);
    147.     dtostrf(flon, 10, 6, gps_lon);
    148.         
    149.         strcpy(gps_sms,"lat:");
    150.         strcat(gps_sms,gps_lat);
    151.         strcat(gps_sms,"\n");
    152.         strcat(gps_sms,"lon:");
    153.         strcat(gps_sms,gps_lon);
    154.         strcat(gps_sms,"\n");
    155.         strcat(gps_sms,"time:");
    156.         
    157.     itoa(_year,gps_year,10);
    158.     strcat(gps_sms,gps_year);
    159.         
    160.     itoa(_month,gps_mon,10);
    161.     if(strlen(gps_mon)==1)
    162.       strcat(gps_sms,"0");
    163.     strcat(gps_sms,gps_mon);
    164.         
    165.     itoa(_day,gps_day,10);
    166.         if(strlen(gps_day)==1)
    167.       strcat(gps_sms,"0");
    168.     strcat(gps_sms,gps_day);
    169.         
    170.     itoa(_hour,gps_hour,10);
    171.         if(strlen(gps_hour)==1)
    172.       strcat(gps_sms,"0");
    173.     strcat(gps_sms,gps_hour);
    174.         
    175.     itoa(_minute,gps_min,10);
    176.         if(strlen(gps_min)==1)
    177.       strcat(gps_sms,"0");
    178.     strcat(gps_sms,gps_min);
    179.         
    180.     itoa(_second,gps_sec,10);
    181.         if(strlen(gps_sec)==1)
    182.       strcat(gps_sms,"0");
    183.     strcat(gps_sms,gps_sec);        
    184.         
    185.     Serial.println(gps_sms);


    186.   }
    187.   



    188. }

    189. char DeleteAllSMS()
    190. {
    191.      char ret_val = -1;


    192.      if (CLS_FREE != gsm.GetCommLineStatus()) return (ret_val);
    193.      gsm.SetCommLineStatus(CLS_ATCMD);
    194.      ret_val = 0; // still not present
    195.          
    196.      gsm.SimpleWriteln(F("AT+CMGDA="DEL ALL""));
    197.          
    198.      switch (gsm.WaitResp(8000, 50, "OK")) {
    199.      case RX_TMOUT_ERR:
    200.           // response was not received in specific time
    201.           ret_val = -2;
    202.           break;

    203.      case RX_FINISHED_STR_RECV:
    204.           // OK was received => SMS deleted
    205.           ret_val = 1;
    206.           break;

    207.      case RX_FINISHED_STR_NOT_RECV:
    208.           // other response: e.g. ERROR => SMS was not deleted
    209.           ret_val = 0;
    210.           break;
    211.      }

    212.      gsm.SetCommLineStatus(CLS_FREE);
    213.      return (ret_val);         
    214. }
    复制代码
    拔掉USB线,改用9V/2A外部电源供电,GPS的天线尽量放到信号好的高处。等Icomsat开机一段时间后,用手机给sim卡发送一条“gps”的短信,稍后,你会收到一条返回短信。里面包含了经度纬度以及时间信息,例如:

    lat:22.588160
    lon:113.944100
    time:20140730073230
    lat表示纬度,lon表示经度,time表示标准的“格林尼治时间”(本初子午线),跟北京时间相差8个小时。

    如果你收到一条“gps not ready”的短信,表示GPS shield还没定位好。等待连接卫星信号的时间跟天气、地区、环境等因素有关,长则几分钟,短则几十秒。
      

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2014-9-23 05:09
  • 签到天数: 113 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2014-7-31 19:49:34 | 显示全部楼层
    很复杂呵。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2014-7-18 09:38
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

     楼主| 发表于 2014-8-1 09:53:18 | 显示全部楼层
    heelary 发表于 2014-7-31 19:49
    很复杂呵。。。

    已上视频了。这还复杂?直接叠加,添加库,烧代码,搞定!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-26 00:35 , Processed in 0.125292 second(s), 20 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.