极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 40058|回复: 17

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

[复制链接]
发表于 2014-8-11 15:55:06 | 显示全部楼层 |阅读模式
上期给小伙伴们介绍了sim900扩展板和gps扩展板的综合应用。今天给小伙伴们带来的是集两者于一身的SIM908 GPS/GSM/GPRS模块,可以使用arduino轻松实现定位查询。让我们马上进入今天的主题。

所需配件:



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

接下来是硬件连接:



gsm和gps怎么区别?表担心,有标注说明:





这里只是串口输出,需要手动按sim908模块上的power键开机,当然可以使用代码自动开机,只需增加一根杜邦线连接。
将sim908上面的P(power)脚连接到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 not ready”的短信,表示GPS还没定位好。等待连接卫星信号的时间跟天气、地区、环境等因素有关,长则几分钟,短则几十秒。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-8-11 17:07:30 | 显示全部楼层
价格如何啊?
回复 支持 反对

使用道具 举报

发表于 2014-8-12 07:26:50 | 显示全部楼层
广告都做到这份上了,为什么不直接放出链接?
回复 支持 反对

使用道具 举报

发表于 2014-8-12 07:29:41 | 显示全部楼层
310啊。。。。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-13 09:32:02 | 显示全部楼层
Cupid 发表于 2014-8-12 07:26
广告都做到这份上了,为什么不直接放出链接?

各取所需吧,不管从软件还是硬件,对于有需要的朋友来说,这不能算是广告。立足于arduino的开源协议,我们开出这些教程,不是为了卖个产品(同类产品淘宝上大把),只是为了分享和促进开源硬件的改进和完善。如果你觉得这个教程和产品对你有帮助,回个帖,顶一个,我们会很高兴;如果你觉得这只是一个卖产品的广告,你可以直接跳过,我们也很抱歉浪费了你宝贵的时间。
回复 支持 反对

使用道具 举报

发表于 2014-8-18 15:32:58 | 显示全部楼层
这家店太黑,板子卖的很贵,鄙视!
回复 支持 反对

使用道具 举报

发表于 2014-8-18 15:47:32 | 显示全部楼层
能发中文短信吗(70个汉字的)?
回复 支持 反对

使用道具 举报

发表于 2014-8-18 15:56:32 | 显示全部楼层
挺好的!支持!可否将包括
#include "SIM900.h"
#include<SoftwareSerial.h>
#include "inetGSM.h"
#include "sms.h"
#include "call.h"
#nclude "gps.h"
#include <string.h>”
这些h的源文件打包给一份,[email protected] ,谢谢!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-18 17:05:22 | 显示全部楼层
qqtthh 发表于 2014-8-18 15:32
这家店太黑,板子卖的很贵,鄙视!

{:2_39:}没有贵或者不贵,只有值或者不值。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-18 17:06:32 | 显示全部楼层
100abc 发表于 2014-8-18 15:56
挺好的!支持!可否将包括
#include "SIM900.h"
#include

已经在帖子有链接了:下载库文件和资料:http://pan.baidu.com/s/11udtk
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-18 17:25:40 | 显示全部楼层
kevinzhang 发表于 2014-8-18 15:47
能发中文短信吗(70个汉字的)?

可以的。试试PDU模式。参考这个:http://wenku.baidu.com/link?url= ... V2SCNJtrCtiakEafWki
回复 支持 反对

使用道具 举报

发表于 2014-8-18 22:15:49 | 显示全部楼层
ITEAD创易工作室 发表于 2014-8-18 17:25
可以的。试试PDU模式。参考这个:http://wenku.baidu.com/link?url=pUD2kDNZqYOMImOk7qrwI2LYqyuyAGb45lv ...

收藏一下,我正犯愁发长短信的问题。
回复 支持 反对

使用道具 举报

发表于 2014-8-18 22:20:35 | 显示全部楼层
itead arduino GSM/GPRS SIM900模块开发板 GBoard整合型学习板,这个也能发吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-20 10:17:36 | 显示全部楼层
kevinzhang 发表于 2014-8-18 22:20
itead arduino GSM/GPRS SIM900模块开发板 GBoard整合型学习板,这个也能发吗?

也可以的。都是一样的sim900芯片。
回复 支持 反对

使用道具 举报

发表于 2014-8-20 15:37:14 | 显示全部楼层
NB啊 不错哦
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 17:28 , Processed in 0.078674 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表