SIM808 GPS/GPRS/GSM Shield V1.0通信模块
文件:GPSXXXX.jpg GPS+GPRS+GSM
目录
1 概 述
2 技术规格
3 接口示意图
4 图示GSM/GPRS基本功能串口调试
4.1 拨打电话
4.2 接听与挂断电话
4.3 发送短信
4.4 读取短信
4.5 TCP通讯
5 Arduino代码测试
5.1 硬件连接
5.2 测试代码
5.2.1 打电话
5.2.2 发短信
5.2.3 GPS数据串口输出
6 GPS功能使用介绍
6.1 GPS通信
7 说明与使用参考
8 相关文档
概 述
SIM808模块是一个完整的四频GSM/GPRS以及卫星GPS导航技术相结合的通信模块。大小仅与普通的Leonardo主板大小相当,以此将为客户开发GPS功能的应用大大节省时间和成本。
SIM808 GPS/GPRS/GSM Shield V1.0采用Simcom最新版SIM808模块,与市面上现有的SIM808模块相比,新版的模块具有更好的稳定性(注意GPS部分的AT指令与老版的SIM808模块无法兼容)。
技术规格
VIN电源:7-23V
低电量消耗(100mA@7V-GSM模式)
四频 850/900/18001900MHz
GPRS multi-slot class 10
GPRS mobile station class B
采用GSM phase 2/2+标准
CLass4 (2 W @ 850/900 MHz)
Class1 (1 W @ 1800/1900MHz)
通过AT指令控制(GSM07.07 ,07.05 和SIMCom加强型AT指令)
支持GPS卫星导航技术
LED指示灯能显示电源供应状态,网络状态和工作模式
大小:69*54mm
接口示意图
接口示意图
注意:
1、Arduino数字口D12可作为SIM808模块开关机控制脚。
2、SIM808板载MIC与3.5mm SIM808麦克风接口使用同一路MIC通道,当3.5mm接口接入话筒设备时,板载MIC将自动断开连接。
图示GSM/GPRS基本功能串口调试
下面将以图文方式演示教大家最基本的AT指令使用。指令具体参数含义及更多的AT指令介绍请参照本页末尾中“相关文档”中的AT指令手册。
拨打电话
SIM808拨打电话
接听与挂断电话
SIM808来电接听与挂断
发送短信
SIM808发送短信
读取短信
SIM808读取短信
TCP通讯
SIM808 TCP连接发送
Arduino代码测试
硬件连接
1、扩展板接到主控板UNO,SIM卡、麦克、耳机插好。
2、USB线、外接电源接好。
3、保证GSM天线可靠连接。
4、将扩展板上功能切换开关拨到"3-Arduino"档。
测试代码
打开Arduino IDE,复制下面的代码编译后下载到UNO板即可测试相应的功能。
打电话
void setup()
{
pinMode(12,OUTPUT);
//GSM开机时序
digitalWrite(12,HIGH);
delay(1500);
digitalWrite(12,LOW);
delay(2000);
//设置波特率
Serial.begin(9600);
//等待call ready
delay(5000);delay(5000);delay(5000);
}
void loop()
{
//发送AT命令同步
Serial.println("AT");
delay(2000);
Serial.println("AT");
delay(2000);
//打电话
Serial.println("ATDXXXXXXXXXXX;");//对方电话号码
while(1);
}
//发送短信
Serial.println("AT+CMGF=1");
delay(1000);
Serial.println("AT+CMGS=\"xxxxxxxxxxx\"");//xxx为电话号码
delay(1000);
Serial.print("TEST");
delay(1000);
Serial.write(0x1A);
while(1);
}
GPS数据串口输出 注意:以下代码请在Leonardo上使用,打开串口助手可以看到GPS数据输出(GPRMC格式)。小伙伴儿们可以参考一下代码中的AT指令的处理方法。/**********************************************File Start********************************************/
#include <TimerOne.h>
#include <string.h>
#define Success 1U
#define Failure 0U
const unsigned int bufferLength=600;
char RxBuffer[bufferLength];
unsigned int ii=0;
int L = 13;
char GPS_Buffer[150];
unsigned char mystrstr(char *s,char *t,unsigned int Length_s,unsigned int Length_t)
{
char x=0;char p;p=t;
int i=0,j=0;
for(;i < Length_s; s++,i++)
{
while(t == s)
{ s++;t++;i++;j++;
if (j>= Length_t) return 1;
}
s-=j;t=p;j=0;
}
return NULL;
}
void clrRxBuffer(void)
{
memset(RxBuffer,0,bufferLength);
ii=0;
}
void SIM808_ERROR(void)
{
while(1)//错误调用程序进入死循环
{
digitalWrite(L, HIGH);
delay(300);
digitalWrite(L, LOW);
delay(300);
}
}
unsigned long Time_Cont=0;
void Timer1_handler(void)
{
Time_Cont++;
}
/
- 函数名:Send_Command
- 描述 :发送AT指令
- 输入 :char *Command --------------AT指令
char *Response -------------等待SIM808响应的数据
unsigned int Res_Length-----响应数据的长度
unsigned long Timeout-------等待响应超时时间
unsigned char Retry---------指令尝试次数
- 输出 :无
- 返回 :AT指令发送状态
Success----------发送成功
Failure----------发送失败
- 调用 :外部调用
*/
unsigned int Send_Command(char *Command,char Response,unsigned int Res_Length,unsigned long Timeout,unsigned char Retry)
{
clrRxBuffer();
for(unsigned char n=0;n<Retry;n++)
{
Serial1.write(Command);
Serial1.write("\r\n");
Time_Cont=0;
while(Time_Cont<Timeout)
{
readBuffer();
if((mystrstr(RxBuffer,Response,ii,Res_Length))!=NULL)
{
clrRxBuffer();
return Success;
}
}
Time_Cont=0;
}
clrRxBuffer();
return Failure;
}
char EER_GPS_Buffer[24]={"$GPRMC,,V,,,,,,,,,,N7F"};
int GET_GPS(void)//获取GPS
{
char GPS_BufferHead,GPS_BufferTail;
clrRxBuffer();
if(Send_Command("AT+CGNSTST=1","OK",2,3000,5)==Success);
Time_Cont=0;
while(Time_Cont<5000)
{
readBuffer();
if((GPS_BufferHead = strstr(RxBuffer, "$GPRMC,")) != NULL)
{
if(((GPS_BufferTail = strstr(GPS_BufferHead,"\r\n")) != NULL)&&(GPS_BufferTail >GPS_BufferHead))
{
memcpy(GPS_Buffer,GPS_BufferHead,GPS_BufferTail-GPS_BufferHead);
clrRxBuffer();
}
}
memcpy(GPS_Buffer,EER_GPS_Buffer,24);
}
Time_Cont=0;
clrRxBuffer();
if(Send_Command("AT+CGNSTST=0","OK",2,5000,10)==Success) ;
}
void SIM808_Initialization()
{
if(Send_Command("AT","OK",2,3000,10)==Success); //发送握手命令
else SIM808_ERROR(); //握手失败,进入错误函数
if(Send_Command("ATE0","OK",2,3000,10)==Success); //关闭回显
else SIM808_ERROR(); //关闭回显失败,进入错误函数
if(Send_Command("AT+CREG?","+CREG: 0,1",10,2000,20)==Success);
else SIM808_ERROR();
if(Send_Command("AT+CGREG?","+CGREG: 0,1",11,2000,20)==Success);
else SIM808_ERROR();
}
void SIM808_BOOT() //SIM808开机函数
{
if(Send_Command("AT","OK",2,100,5)==Success) return; //如果模块已经开机,则跳出函数
else //否则将D12拉高开始开机
{
digitalWrite(12, HIGH);
if(Send_Command("AT","OK",2,1000,20)==Success) //如果握手成功,则表示模块已经开机,跳出函数
{
digitalWrite(12, LOW);
return;
}
else //如果握手失败,表示模块不能开机,程序进入错误函数
{
digitalWrite(12, LOW);
SIM808_ERROR();
}
}
}
void setup()
{
Serial1.begin(115200);
pinMode(L, OUTPUT);
pinMode(12, OUTPUT);
Timer1.initialize(1000);
Timer1.attachInterrupt(Timer1_handler);
delay(5000);
digitalWrite(L, HIGH);
SIM808_BOOT(); //SIM808模块开机
SIM808_Initialization(); //初始化SIM808模块
if(Send_Command("AT+CGNSPWR=1","OK",2,3000,2)==Success) ; //打开GPS电源
else SIM808_ERROR();
}
void loop()
{
GET_GPS();
Serial.write(GPS_Buffer);
digitalWrite(L, HIGH);
delay(300);
digitalWrite(L, LOW);
}
void readBuffer()
{
while(Serial1.available())
{
RxBuffer[ii++]=Serial1.read();
if(ii==bufferLength)clrRxBuffer();
}
}
/**************************[ COPYRIGHT 2015.10 DFRobot By-Strictus ]**********************************/
/*****************************************File End****************************************************/
如果GPS天线已经放置露天位置并收到GPS数据,等待几分钟后,会有正确的GPS定位数据输出。
当想暂停GPS数据输出,可发送AT+CGNSTST=0命令可暂停GPS数据输出。
当想关闭GPS,可发送AT+CGNSPWR=0命令关断GPS电源。
发送AT+CPOWD=1,将模块关机。
想重新开机再次按下RST按键。
说明与使用参考
说明:SIM808 GPS/GPRS/GSM Shield扩展板如果搭配Leonardo主板就相当于一块SIM808 with Leonardo mainboard,具体的使用方法可以参照SIM808 with Leonardo mainboard相关示例,鼠标单击以下链接跳转到相关WIKI。
WIKI参考:(SKU:DFR0355)SIM808 with Leonardo mainboard
相关文档 文档一:新版SIM808模块定位系统使用手册 文档二:SIM808 with Leonardo mainboard原理图 文档三:SIM80X系列AT指令手册