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);
}

发短信 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+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,,,,,,,,,,N
    7F"};
    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定位数据输出。 1、硬件连接 DC2.1 VIN接口接入(7-23V)外接电源。(注意板上NO BAT提示,没有接锂电池时请将跳线帽接上。) 将上面的Arduino代码下载到主板,通过Micro USB线将计算机与主板连接以使用Arduino USB口通过串口调试助手调试SIM808模块。 将GSM天线及GPS天线接在板上对应位置。 2、开机 可编程通过Leonardo控制D12控制开机,也可以按住Boot按钮开机。(当Net灯开始闪烁表示模块已经启动) 2、打开串口助手软件发送AT命令控制GPS通信 发送AT+CGNSPWR=1命令(打开GPS电源) 发送AT+CGNSTST=1命令 (开始从串口接收GPS数据)

GPS测试.JPG
如果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指令手册

标签: Arduino传感器