查看: 6809|回复: 5

【sim908】集GPS/GSM/GPRS于一身

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

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2014-8-11 11:18:08 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 ITEAD创易工作室 于 2014-8-11 15:47 编辑

    上期给小伙伴们介绍了sim900扩展板和gps扩展板的综合应用。今天给小伙伴们带来的是集两者于一身的SIM908 GPS/GSM/GPRS模块,可以使用arduino轻松实现定位查询。让我们马上进入今天的主题。


    所需配件:


    peij.jpg


    首先下载库文件和资料:http://pan.baidu.com/s/11udtk(包含sim908手册和原理图)
    ,将解压出来的sim908GSM文件夹放到arduino IDElibrary文件夹下面。这里使用的库文件跟上期使用的GSM库文件是一样的,因为上期是用的mega,有部分不同,需要先删掉之前的库文件。


    接下来是硬件连接:


    IMG_0092.JPG


    gsmgps怎么区别?表担心,有标注说明:


    IMG_0096.JPG


    IMG_0097.JPG

    这里只是串口输出,需要手动按sim908模块上的power键开机,当然可以使用代码自动开机,只需增加一根杜邦线连接。

    powe.jpg

    sim908上面的Ppower)脚连接到UNO上的信号脚上,代码里面我们连接的是D7脚,取消注释即可。

    代码如下:
    1. #include "SIM900.h"
    2. #include <SoftwareSerial.h>
    3. //#include "inetGSM.h"
    4. #include "sms.h"
    5. //#include "call.h"
    6. #include "gps.h"
    7. #include <string.h>

    8. //To change pins for Software Serial, use the two lines in GSM.cpp.

    9. //GSM Shield for Arduino
    10. //www.open-electronics.org
    11. //this code is based on the example of Arduino Labs.

    12. //Simple sketch to start a connection as client.

    13. //InetGSM inet;
    14. //CallGSM call;
    15. SMSGSM sms;
    16. GPSGSM gps;

    17. char lon[15];
    18. char lat[15];
    19. char alon[15];
    20. char alat[15];
    21. char alt[15];
    22. char time[20];
    23. char vel[15];
    24. char msg1[5];
    25. char msg2[5];
    26. char str1[80];
    27. char stat;
    28. char inSerial[20];
    29. int i=0;
    30. boolean started=false;
    31. char smsbuffer[160];
    32. //char number[20];
    33. char n[20];
    34. #define ledpin 13
    35. byte type_sms=SMS_ALL;

    36. //#define READ_TIMEOUT 300000

    37. //int powerpin=7; 自动开机,p连接到D7,取消该注释即可

    38. void setup()
    39. {

    40.   //pinMode(powerpin,OUTPUT); 需要自动开机,取消该注释即可
    41.   //digitalWrite(powerpin,HIGH);需要自动开机,取消该注释即可
    42.   //delay(1000);需要自动开机,取消该注释即可
    43.   //digitalWrite(powerpin,LOW);需要自动开机,取消该注释即可
    44.   //delay(10000); 需要自动开机,取消该注释即可

    45.      //Serial connection.
    46.      Serial.begin(9600);
    47.      Serial.println("GSM Shield testing.");
    48.          pinMode(ledpin,OUTPUT);
    49.      //Start configuration of shield with baudrate.
    50.      //For http uses is raccomanded to use 4800 or slower.
    51.      if (gsm.begin(4800)) {
    52.           Serial.println("\nstatus=READY");
    53.           gsm.forceON();        //To ensure that SIM908 is not only in charge mode
    54.           started=true;
    55.      } else Serial.println("\nstatus=IDLE");

    56.      if(started) {
    57.              Serial.println("Deleting SMS");
    58.                         char error = DeleteAllSMS();
    59.              if (error==1)Serial.println("All SMS deleted");      
    60.          else Serial.println("SMS not deleted");
    61.           //GPS attach
    62.           if (gps.attachGPS())
    63.                Serial.println("status=GPSREADY");
    64.           else Serial.println("status=ERROR");

    65.           delay(10000);        //Time for fixing
    66.                   //long start = millis();
    67.                  // while(millis() < (start + READ_TIMEOUT))
    68.                  // {

    69.           //delay(20000);
    70.           //Get data from GPS

    71.                   //}
    72.      }

    73. };

    74. void loop()
    75. {
    76.      if(started) {
    77.           //Read if there are messages on SIM card and print them.
    78.           //if(gsm.readSMS(smsbuffer, 80, n, 20)) {
    79.                     char pos_sms_rx;  //Received SMS position     
    80.                         pos_sms_rx=sms.IsSMSPresent(type_sms);
    81.                         if (pos_sms_rx!=0){
    82.                         sms.GetSMS(pos_sms_rx,n,smsbuffer,160);
    83.             Serial.println(n);
    84.             Serial.println(smsbuffer);
    85.                         char error=sms.DeleteSMS(pos_sms_rx);
    86.             if (error==1)Serial.println("SMS deleted");      
    87.             else Serial.println("SMS not deleted");
    88.                         if((strstr(smsbuffer,"gps")!=0)&&(strlen(smsbuffer)==3))
    89.                         {
    90.                                 //strcpy(number,n);
    91.           stat=gps.getStat();
    92.                   
    93.           if(stat==1)
    94.                   {
    95.                Serial.println("NOT FIXED");

    96.                         }
    97.                            
    98.           else if(stat==0)
    99.                   {
    100.                Serial.println("GPS OFF");
    101.                   
    102.                            }
    103.           else if(stat==2)
    104.                   {
    105.                Serial.println("2D FIXED");
    106.                   
    107.                  }
    108.           else if(stat==3)
    109.                   {
    110.                Serial.println("3D FIXED");
    111.                                                 
    112.                   }
    113.                            gps.getPar(lon,lat,alt,time,vel);
    114.                            double _longitude = stringtofloat(lon);
    115.                            double _latitude = stringtofloat(lat);
    116.                            floattostring(_longitude, alon);
    117.                            floattostring(_latitude, alat);
    118.                            strcpy(str1,"lon:");
    119.                            strcat(str1,alon);
    120.                            strcat(str1,"\n");
    121.                            strcat(str1,"lat:");
    122.                            strcat(str1,alat);
    123.                            strcat(str1,"\n");
    124.                           // strcat(str1,alt);
    125.                           // strcat(str1,"\n");
    126.                            strcat(str1,"time:");
    127.                            strcat(str1,time);
    128.                            strcat(str1,"\n");
    129.                           // strcat(str1,vel);
    130.                                 if(stat <3)
    131.                                 {
    132.                                         if (sms.SendSMS(n, "gps not ready"))
    133.                                         Serial.println("\nSMS sent OK");
    134.                                 }
    135.                                 else
    136.                                 {
    137.                                         if (sms.SendSMS(n, str1))
    138.                                         Serial.println("\nSMS sent OK");                                       
    139.                                 }

    140.                                 
    141.                         }
    142.                         else
    143.                         {
    144.                                 Serial.println("message not correct");
    145.                         }
    146.           }
    147.           delay(1500);
    148.                 stat=gps.getStat();
    149.         Serial.println(lon);
    150.         Serial.println(lat);
    151.         Serial.println(alt);
    152.         Serial.println(time);
    153.         Serial.println(vel);               
    154.                 if(stat>2)
    155.                 {
    156.                         digitalWrite(ledpin,HIGH);                        
    157.                 }
    158.                 else
    159.                  digitalWrite(ledpin,LOW);
    160.                  

    161.      }
    162. };

    163. double stringtofloat(char *latString)
    164. {
    165.      double latitude = atof(latString);                                    // convert to a double (precise)
    166.      int deg = (int) latitude / 100;                               // extract the number of degrees
    167.      double mine = latitude - (100 * deg);                  // work out the number of minutes
    168.      latitude = deg + (double) mine/60.0;                   // convert to decimal format
    169.      return latitude;
    170. }

    171. double floattostring(double lvalue, char *lstring)
    172. {
    173.   char _null[1];
    174.   int intvalue = (int) lvalue;
    175.   itoa(intvalue,lstring,10);
    176.   strcat(lstring, ".");
    177.   double mm = lvalue -intvalue;
    178.   
    179.   for(char a=0;a<6;a++)
    180.   {
    181.         mm=mm*10;
    182.         int bb = (int)mm;
    183.         itoa(bb,_null,10);
    184.         strcat(lstring, _null);
    185.         mm = mm-bb;
    186.   }

    187. }

    188. char DeleteAllSMS()
    189. {
    190.      char ret_val = -1;
    191.      char *p_char;
    192.      byte status;

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

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

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

    213.      gsm.SetCommLineStatus(CLS_FREE);
    214.      return (ret_val);         
    215. }
    复制代码
    烧写完成,将sim908的天线放到室外空旷地方,使用适配器供电,等待连接卫星。用手机给sim卡发送一条“gps”的短信,稍后,你会收到一条返回短信。里面包含了经度纬度以及时间信息,例如:


    lat:22.588160
    lon:113.944100
    time:20140809051022

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


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


    http://player.youku.com/player.php/sid/XNzU0MDcxOTEy/v.swf
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-9-21 08:57
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2015-7-22 16:46:53 | 显示全部楼层
    问下楼主,我用的是SIM908模块,但是最近在调试GPS的时候遇到点问题,问下有没有关于GPS方面的例程或者资料能否分享下,谢谢了!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-2-14 12:16
  • 签到天数: 827 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-7-22 19:41:07 | 显示全部楼层
    必须用2A电源吗?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-2-14 12:16
  • 签到天数: 827 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-7-22 19:41:52 | 显示全部楼层
              sim900好像也集这三个于一身
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-2-14 12:16
  • 签到天数: 827 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-7-22 19:43:18 | 显示全部楼层
    我之前用USB供电,没出来。不知道是不是电源问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-2-14 12:16
  • 签到天数: 827 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-7-22 19:44:24 | 显示全部楼层
                     希望将相关库分享
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-11-26 07:40 , Processed in 0.165936 second(s), 26 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.