php gprs,【sim908】集GPS/GSM/GPRS于一身

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

所需配件:

70d8077d25d7c32fb2a7a7cb2bbf0996.gif

peij.jpg (49.64 KB, 下载次数: 300)

2014-8-11 15:51 上传

,将解压出来的sim908GSM文件夹放到arduinoIDE的library文件夹下面。这里使用的库文件跟上期使用的GSM库文件是一样的,因为上期是用的mega,有部分不同,需要先删掉之前的库文件。

接下来是硬件连接:

70d8077d25d7c32fb2a7a7cb2bbf0996.gif

IMG_0092.JPG (57.43 KB, 下载次数: 277)

2014-8-11 15:51 上传

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

70d8077d25d7c32fb2a7a7cb2bbf0996.gif

IMG_0096.JPG (88.42 KB, 下载次数: 262)

2014-8-11 15:51 上传

70d8077d25d7c32fb2a7a7cb2bbf0996.gif

IMG_0097.JPG (56.85 KB, 下载次数: 265)

2014-8-11 15:51 上传

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

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

70d8077d25d7c32fb2a7a7cb2bbf0996.gif

powe.jpg (16.09 KB, 下载次数: 270)

2014-8-11 15:51 上传

代码如下:

[mw_shl_code=c,true]#include "SIM900.h"

#include

//#include "inetGSM.h"

#include "sms.h"

//#include "call.h"

#include "gps.h"

#include

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

//GSM Shield for Arduino

//www.open-electronics.org

//this code is based on the example of Arduino Labs.

//Simple sketch to start a connection as client.

//InetGSM inet;

//CallGSM call;

SMSGSM sms;

GPSGSM gps;

char lon[15];

char lat[15];

char alon[15];

char alat[15];

char alt[15];

char time[20];

char vel[15];

char msg1[5];

char msg2[5];

char str1[80];

char stat;

char inSerial[20];

int i=0;

boolean started=false;

char smsbuffer[160];

//char number[20];

char n[20];

#define ledpin 13

byte type_sms=SMS_ALL;

//#define READ_TIMEOUT 300000

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

void setup()

{

//pinMode(powerpin,OUTPUT); 需要自动开机,取消该注释即可

//digitalWrite(powerpin,HIGH);需要自动开机,取消该注释即可

//delay(1000);需要自动开机,取消该注释即可

//digitalWrite(powerpin,LOW);需要自动开机,取消该注释即可

//delay(10000); 需要自动开机,取消该注释即可

//Serial connection.

Serial.begin(9600);

Serial.println("GSM Shield testing.");

pinMode(ledpin,OUTPUT);

//Start configuration of shield with baudrate.

//For http uses is raccomanded to use 4800 or slower.

if (gsm.begin(4800)) {

Serial.println("\nstatus=READY");

gsm.forceON();        //To ensure that SIM908 is not only in charge mode

started=true;

} else Serial.println("\nstatus=IDLE");

if(started) {

Serial.println("Deleting SMS");

char error = DeleteAllSMS();

if (error==1)Serial.println("All SMS deleted");

else Serial.println("SMS not deleted");

//GPS attach

if (gps.attachGPS())

Serial.println("status=GPSREADY");

else Serial.println("status=ERROR");

delay(10000);        //Time for fixing

//long start = millis();

// while(millis() < (start + READ_TIMEOUT))

// {

//delay(20000);

//Get data from GPS

//}

}

};

void loop()

{

if(started) {

//Read if there are messages on SIM card and print them.

//if(gsm.readSMS(smsbuffer, 80, n, 20)) {

char pos_sms_rx;  //Received SMS position

pos_sms_rx=sms.IsSMSPresent(type_sms);

if (pos_sms_rx!=0){

sms.GetSMS(pos_sms_rx,n,smsbuffer,160);

Serial.println(n);

Serial.println(smsbuffer);

char error=sms.DeleteSMS(pos_sms_rx);

if (error==1)Serial.println("SMS deleted");

else Serial.println("SMS not deleted");

if((strstr(smsbuffer,"gps")!=0)&&(strlen(smsbuffer)==3))

{

//strcpy(number,n);

stat=gps.getStat();

if(stat==1)

{

Serial.println("NOT FIXED");

}

else if(stat==0)

{

Serial.println("GPS OFF");

}

else if(stat==2)

{

Serial.println("2D FIXED");

}

else if(stat==3)

{

Serial.println("3D FIXED");

}

gps.getPar(lon,lat,alt,time,vel);

double _longitude = stringtofloat(lon);

double _latitude = stringtofloat(lat);

floattostring(_longitude, alon);

floattostring(_latitude, alat);

strcpy(str1,"lon:");

strcat(str1,alon);

strcat(str1,"\n");

strcat(str1,"lat:");

strcat(str1,alat);

strcat(str1,"\n");

// strcat(str1,alt);

// strcat(str1,"\n");

strcat(str1,"time:");

strcat(str1,time);

strcat(str1,"\n");

// strcat(str1,vel);

if(stat <3)

{

if (sms.SendSMS(n, "gps not ready"))

Serial.println("\nSMS sent OK");

}

else

{

if (sms.SendSMS(n, str1))

Serial.println("\nSMS sent OK");

}

}

else

{

Serial.println("message not correct");

}

}

delay(1500);

stat=gps.getStat();

Serial.println(lon);

Serial.println(lat);

Serial.println(alt);

Serial.println(time);

Serial.println(vel);

if(stat>2)

{

digitalWrite(ledpin,HIGH);

}

else

digitalWrite(ledpin,LOW);

}

};

double stringtofloat(char *latString)

{

double latitude = atof(latString);                                    // convert to a double (precise)

int deg = (int) latitude / 100;                               // extract the number of degrees

double mine = latitude - (100 * deg);                  // work out the number of minutes

latitude = deg + (double) mine/60.0;                   // convert to decimal format

return latitude;

}

double floattostring(double lvalue, char *lstring)

{

char _null[1];

int intvalue = (int) lvalue;

itoa(intvalue,lstring,10);

strcat(lstring, ".");

double mm = lvalue -intvalue;

for(char a=0;a<6;a++)

{

mm=mm*10;

int bb = (int)mm;

itoa(bb,_null,10);

strcat(lstring, _null);

mm = mm-bb;

}

}

char DeleteAllSMS()

{

char ret_val = -1;

char *p_char;

byte status;

if (CLS_FREE != gsm.GetCommLineStatus()) return (ret_val);

gsm.SetCommLineStatus(CLS_ATCMD);

ret_val = 0; // still not present

gsm.SimpleWriteln(F("AT+CMGDA=\"DEL ALL\""));

switch (gsm.WaitResp(8000, 50, "OK")) {

case RX_TMOUT_ERR:

// response was not received in specific time

ret_val = -2;

break;

case RX_FINISHED_STR_RECV:

// OK was received => SMS deleted

ret_val = 1;

break;

case RX_FINISHED_STR_NOT_RECV:

// other response: e.g. ERROR => SMS was not deleted

ret_val = 0;

break;

}

gsm.SetCommLineStatus(CLS_FREE);

return (ret_val);

}

[/mw_shl_code]

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

lat:22.588160

lon:113.944100

time:20140809051022

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值