TEL0097 SIM808 GPS GPRS GSM Shield 通信模块

概 述

SIM808 GPS/GPRS/GSM 是一款集成了四频段GSM/GPRS和GPS导航技术的Arduino扩展板。尺寸仅与一块信用卡相当,符合标准Arduino管脚分装,兼容Arduino UNO、 Leonardo、Mega等主控器。
SIM808相比上一代的SIM908在性能和稳定性上做了一定提升,除了正常的短信和电话功能外,还支持彩信、DTMF、FTP等功能。可以实现数据采集,无线数据收发等物联网应用。板载麦克风和耳机接口,节约了用户的使用成本,更加简单和方便,还可以通过外接天线接口直连GSM和GPS天线。
SIM808 GPS/GPRS/GSM Shield V1.0采用Simcom最新版SIM808模块,与市面上现有的SIM808模块相比,新版的模块具有更好的稳定性(注意GPS部分的AT指令与老版的SIM808模块无法兼容,请参考最下方**“更多”**中的AT指令)。

技术规格

  • 工作电压:5V
  • 输入电源:7-23V
  • 四频 850/900/1800/1900MHz
  • GPRS multi-slot class 12/10
  • GPRS mobile station class B
  • 符合 GSM phase 2/2+
    • Class 4 (2 W @ 850/900MHz)
    • Class 1 (1 W @ 1800/1900MHz)
  • 支持低功耗模式:100mA@7V-GSM模式
  • 通过AT指令控制(3GPP TS 27.007,27.005 和 SIMCOM enhanced AT Commands)
  • 支持GPS卫星导航技术
  • 支持LED状态显示:显示电源供应状态,网络状态和工作模式
  • 工作环境:-40℃ ~85℃
  • 大小:69*54mm

接口示意图

接口示意图

模块接口及注意事项

  1. 已占用管脚:D0, D1, D12,其中数字口“D12”已内部连接至SIM808模块开/关引脚,可用于SIM808模块开/关机控制。
  2. SIM808板载MIC与3.5mm SIM808麦克风接口使用同一路MIC通道,当3.5mm接口接入话筒设备时,板载MIC将自动断开连接。
  3. Boot开关按钮——SIM808模块开关,短按Boot 1s开机,长按3s关机
  4. 指示灯“ON”——SIM808电源指示灯,只有当您接上外接电源时,模块才能正常工作。
  5. Net——GSM信号指示灯
  • 快闪:搜寻网络
  • 慢闪(3s一次):网络注册完成
  1. 功能切换开关
  • None——悬空SIM串口管脚,下载代码时,请拨到此处
  • USB_DBG——当扩展板插在Arduino上时,拨到此处使SIM808与PC通信(AT调试使用)
  • Arduino——当扩展板插在Arduino上时,拨到此处使SIM808与Arduino通信,实现脱机使用

Arduino开发样例

在这一部分中,我们将演示如何通过Arduino控制SIM808 Shiel,DFRobot_SIM808是一个开源的类库,提供了简单且全面的调用接口,让任何人都可以快速完成项目开发。

准备

步骤

  1. 将插好SIM卡的扩展板插到Arduino UNO上去,确保外接电源和USB线已连接
  2. 拨动功能切换开关至None档,下载下方提供的样例代码
  3. 等待程序下载完毕,拨动开关至Arduino'档,这时SIM808即可与Arduino主板进行通信。

拨打电话

本样例样演示了如何通过DFRobot_SIM808 Shield 拨打电话

  1. 打开类库中的SIM808_CallUp样例或者粘贴下面的代码到你的工程里面
  2. 更换此处的电话号码为你希望拨打的号码:#define PHONE_NUMBER "187******39"
  3. 下载程序并将功能开关调整到“Arduino”
  4. sim808将会拨打电话到指定号码
  #include <DFRobot_sim808.h>
  //使用leonardo时,请打开下列软串口
  //#define PIN_TX    10
  //#define PIN_RX    11
  //SoftwareSerial mySerial(PIN_TX,PIN_RX);
  //DFRobot_SIM808 sim808(&mySerial);//Connect RX,TX,PWR,
  
  //Mobile phone number, need to change
  #define PHONE_NUMBER  "187******39"

  DFRobot_SIM808 sim808(&Serial);//使用leonardo请屏蔽此行代码

  void setup() {
    //mySerial.begin(9600);
    Serial.begin(9600);
    //********Initialize sim808 module*************
    while(!sim808.init()) {
        delay(1000);
        Serial.print("Sim808 init error\r\n");
    }
    Serial.println("Sim808 init success");
    Serial.println("Start to call ...");

    //*********Call specified number***************
    sim808.callUp(PHONE_NUMBER);
  }
  void loop() {
    //nothing to do
  }

发送短信

本样例样演示了如何通过DFRobot_SIM808 Shield 发送短信

  1. 打开类库中的SIM808_SendSMS样例或者粘贴下面的代码到你的工程里面
  2. 更换此处的电话号码为你希望拨打的号码:#define PHONE_NUMBER "187******39"
  3. 下载程序并将功能开关调整到“Arduino”
  4. sim808将会发送短信到指定号码
#include <DFRobot_sim808.h>
//使用leonardo时,请打开下列软串口
 //#define PIN_TX    10
 //#define PIN_RX    11
 //SoftwareSerial mySerial(PIN_TX,PIN_RX);
 //DFRobot_SIM808 sim808(&mySerial);//Connect RX,TX,PWR,
  
//Mobile phone number, need to change
#define PHONE_NUMBER "187*******39"

//The content of messages sent
#define MESSAGE  "hello,world"

DFRobot_SIM808 sim808(&Serial);//使用leonardo请屏蔽此行代码

void setup() {
  //mySerial.begin(9600);
  Serial.begin(9600);

  //******** Initialize sim808 module *************
  while (!sim808.init()) {
    delay(1000);
    Serial.print("Sim808 init error\r\n");
  }
  Serial.println("Sim808 init success");
  Serial.println("Start to send message ...");

  //******** define phone number and text **********
  sim808.sendSMS(PHONE_NUMBER, MESSAGE);
}

void loop() {
  //nothing to do
}

接听电话与读取短信

本样例样演示了如何通过DFRobot_SIM808 Shield 接听电话和读取短信

  1. 打开类库中的SIM808_LoopHandle样例或者粘贴下面的代码到你的工程里面
  2. 下载程序并将功能开关调整到“Arduino”
  3. 打开串口助手
  4. sim808自动接听电话并且将收到的短信发送到串口助手
#include <DFRobot_sim808.h>
//使用leonardo时,请打开下列软串口
 //#define PIN_TX    10
 //#define PIN_RX    11
 //SoftwareSerial mySerial(PIN_TX,PIN_RX);
 //DFRobot_SIM808 sim808(&mySerial);//Connect RX,TX,PWR,
  
#define MESSAGE_LENGTH 20
char gprsBuffer[64];
char *s = NULL;

DFRobot_SIM808 sim808(&Serial);//使用leonardo时请屏蔽此行代码

void setup() {
  //mySerial.begin(9600);
  Serial.begin(9600);

  //******** Initialize sim808 module *************
  while (!sim808.init()) {
    Serial.print("Sim808 init error\r\n");
    delay(1000);
  }
  delay(3000);
  Serial.println("Init Success, please call or send SMS message to me!");
}

void loop() {
  //******** Wait serial data *************
  if (sim808.readable()) {
    sim808_read_buffer(gprsBuffer, 32, DEFAULT_TIMEOUT);
    //Serial.print(gprsBuffer);

    //************** Detect the current state of the telephone or SMS ************************
    if (NULL != strstr(gprsBuffer, "RING")) {
      sim808.answer();
    } else if (NULL != (s = strstr(gprsBuffer, "+CMTI: \"SM\""))) { //SMS: $$+CMTI: "SM",24$$
      char message[MESSAGE_LENGTH];
      int messageIndex = atoi(s + 12);
      sim808.readSMS(messageIndex, message, MESSAGE_LENGTH);
      Serial.print("Recv Message: ");
      Serial.println(message);
    }
    sim808_clean_buffer(gprsBuffer, 32);
  }
}

读取短信

本样例样演示了如何通过DFRobot_SIM808 Shield 读取短信

  1. 打开类库中的SIM808_SMSread样例或者粘贴下面的代码到你的工程里面
  2. 下载程序并将功能开关调整到“Arduino”
  3. 打开串口助手
  4. Arduino会将SIM808会将收到的短信发送到串口助手
#include <DFRobot_sim808.h>
//使用leonardo时,请打开下列软串口
 //#define PIN_TX    10
 //#define PIN_RX    11
 //SoftwareSerial mySerial(PIN_TX,PIN_RX);
 //DFRobot_SIM808 sim808(&mySerial);//Connect RX,TX,PWR,
 
#define MESSAGE_LENGTH 160
char message[MESSAGE_LENGTH];
int messageIndex = 0;

char phone[16];
char datetime[24];

DFRobot_SIM808 sim808(&Serial);//使用leonardo时请屏蔽此行代码

void setup() {
  //mySerial.begin(9600);
  Serial.begin(9600);

  //******** Initialize sim808 module *************
  while (!sim808.init()) {
    Serial.print("Sim808 init error\r\n");
    delay(1000);
  }
  delay(3000);
  Serial.println("Init Success, please send SMS message to me!");
}

void loop() {
  //*********** Detecting unread SMS ************************
  messageIndex = sim808.isSMSunread();
  Serial.print("messageIndex: ");
  Serial.println(messageIndex);

  //*********** At least, there is one UNREAD SMS ***********
  if (messageIndex > 0) {
    sim808.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);

    //***********In order not to full SIM Memory, is better to delete it**********
    sim808.deleteSMS(messageIndex);
    Serial.print("From number: ");
    Serial.println(phone);
    Serial.print("Datetime: ");
    Serial.println(datetime);
    Serial.print("Recieved Message: ");
    Serial.println(message);
  }
}

建立TCP连接并发送GET请求

本样例样演示了如何通过DFRobot_SIM808 Shield 建立TCP连接并发送GET请求

  1. 打开类库中的SIM808_TCPConnection样例或者粘贴下面的代码到你的工程里面
  2. 下载程序并将功能开关调整到“Arduino”
  3. 打开串口助手
  4. 等待几分钟,直到串口输出"Connect mbed.org success",代表此时已经连接成功,否则请重试
  5. SIM808将会按照GET指令发送请求,在本样例中,串口会输出收到的数据“hello world!”
  #include <DFRobot_sim808.h>
  //使用leonardo时,请打开下列软串口
   //#define PIN_TX    10
   //#define PIN_RX    11
   //SoftwareSerial mySerial(PIN_TX,PIN_RX);
   //DFRobot_SIM808 sim808(&mySerial);//Connect RX,TX,PWR,
 
  //make sure that the baud rate of SIM900 is 9600!
  //you can use the AT Command(AT+IPR=9600) to set it through SerialDebug

  DFRobot_SIM808 sim808(&Serial);//使用leonardo时请屏蔽此行代码

  char http_cmd[] = "GET /media/uploads/mbed_official/hello.txt HTTP/1.0\r\n\r\n";
  char buffer[512];

  void setup(){
    //mySerial.begin(9600);
    Serial.begin(9600);

    //******** Initialize sim808 module *************
    while(!sim808.init()) {
        delay(1000);
        Serial.print("Sim808 init error\r\n");
    }
    delay(3000);

    //*********** Attempt DHCP *******************
    while(!sim808.join(F("cmnet"))) {
        Serial.println("Sim808 join network error");
        delay(2000);
    }

    //************ Successful DHCP ****************
    Serial.print("IP Address is ");
    Serial.println(sim808.getIPAddress());

    //*********** Establish a TCP connection ************
    if(!sim808.connect(TCP,"mbed.org", 80)) {
        Serial.println("Connect error");
    }else{
        Serial.println("Connect mbed.org success");
    }

    //*********** Send a GET request *****************
    Serial.println("waiting to fetch...");
    sim808.send(http_cmd, sizeof(http_cmd)-1);
    while (true) {
        int ret = sim808.recv(buffer, sizeof(buffer)-1);
        if (ret <= 0){
            Serial.println("fetch over...");
            break;
        }
        buffer[ret] = '\0';
        Serial.print("Recv: ");
        Serial.print(ret);
        Serial.print(" bytes: ");
        Serial.println(buffer);
        break;
    }

    //************* Close TCP or UDP connections **********
    sim808.close();

    //*** Disconnect wireless connection, Close Moving Scene *******
    sim808.disconnect();
  }

  void loop(){

  }

读取GPS数据

本样例样演示了如何通过DFRobot_SIM808 Shield 读取GPS数据

  1. 安装GPS天线
  2. 打开类库中的SIM808_GetGPS样例或者粘贴下面的代码到你的工程里面
  3. 下载程序并将功能开关调整到“Arduino”
  4. 打开串口助手
  5. 将其移至室外,等待几分钟,直到串口输出GPS数据
  #include <DFRobot_sim808.h>
  //使用leonardo时,请打开下列软串口
    //#define PIN_TX    10
    //#define PIN_RX    11
    //SoftwareSerial mySerial(PIN_TX,PIN_RX);
    //DFRobot_SIM808 sim808(&mySerial);//Connect RX,TX,PWR,
	
  DFRobot_SIM808 sim808(&Serial);//使用leonardo时请屏蔽此行代码

  void setup() {
    //mySerial.begin(9600);
    Serial.begin(9600);

    //******** Initialize sim808 module *************
    while(!sim808.init()) {
        delay(1000);
        Serial.print("Sim808 init error\r\n");
    }

    //************* Turn on the GPS power************
    if( sim808.attachGPS())
        Serial.println("Open the GPS power success");
    else
        Serial.println("Open the GPS power failure");

  }

  void loop() {
     //************** Get GPS data *******************
     if (sim808.getGPS()) {
      Serial.print(sim808.GPSdata.year);
      Serial.print("/");
      Serial.print(sim808.GPSdata.month);
      Serial.print("/");
      Serial.print(sim808.GPSdata.day);
      Serial.print(" ");
      Serial.print(sim808.GPSdata.hour);
      Serial.print(":");
      Serial.print(sim808.GPSdata.minute);
      Serial.print(":");
      Serial.print(sim808.GPSdata.second);
      Serial.print(":");
      Serial.println(sim808.GPSdata.centisecond);

      Serial.print("latitude :");
      Serial.println(sim808.GPSdata.lat,6);

      sim808.latitudeConverToDMS();
      Serial.print("latitude :");
      Serial.print(sim808.latDMS.degrees);
      Serial.print("\^");
      Serial.print(sim808.latDMS.minutes);
      Serial.print("\'");
      Serial.print(sim808.latDMS.seconeds,6);
      Serial.println("\"");
      Serial.print("longitude :");
      Serial.println(sim808.GPSdata.lon,6);
      sim808.LongitudeConverToDMS();
      Serial.print("longitude :");
      Serial.print(sim808.longDMS.degrees);
      Serial.print("\^");
      Serial.print(sim808.longDMS.minutes);
      Serial.print("\'");
      Serial.print(sim808.longDMS.seconeds,6);
      Serial.println("\"");

      Serial.print("speed_kph :");
      Serial.println(sim808.GPSdata.speed_kph);
      Serial.print("heading :");
      Serial.println(sim808.GPSdata.heading);

      //************* Turn off the GPS power ************
      sim808.detachGPS();
    }

  }

功能调试(AT命令)

除了上述方式通过Arduino控制SIM808之外,你也可以在PC上通过串口发送AT指令的方式对SIM808扩展板进行调试。在这一部分中,我们将以图文形式,演示如何通过串口发送AT命令的方式来对SIM808扩展板进行调试。更多的指令和功能,请参考页末更多中的AT指令集。

准备

  • 硬件

    • Arduino UNO x1
    • SIM808 扩展板 x1
    • 外接电源 x1
  • 软件

    • Arduino IDE 版本最新版 点击下载Arduino IDE
    • 串口调试助手(任意,能够发送16位进制数即可,可根据需要自己选择)

步骤

  1. 将SIM卡插在扩展板上,并把SIM808扩展板插上Arduino UNO,同时接上接上外接电源
  2. 拨动功能切换开关至None档,下载一个样例代码Blink来确保串口不被占用(其他不占用串口的代码也可以)。
  3. 按下Boot开机键,等待SIM卡网络注册正常,既Net状态指示灯进入慢闪状态(3s一次)
  4. 拨动功能切换开关至USB_DBG档,此时我们就可以通过串口助手直接与SIM808芯片进行通信。

拨打电话

SIM808拨打电话
在串口助手中发送AT,得到返回OK代表通信正常。
按图所示,输入AT指令,应该得到相同内容。注意:电话号码后面需要跟一个英文分号“;”.

接听与挂断电话

SIM808来电接听与挂断

发送短信

SIM808发送短信

读取短信

SIM808读取短信

TCP通讯

SIM808 TCP连接发送

GPS信息输出

注意:GPS天线必须置于室外,才可以获得稳定的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,将模块关机。`

更多精彩指令,请参考页末的AT指令表。

SIM808省电模式

最小功能模式

最小功能模式就是将模块功能减小到最少,所以也使得模块的电流消耗减小到最少。可以通过命令"AT+CFUN="把模块设置到该模式下,这条命令提供三种选择,用于设置不同功能。

  1. AT+CFUN=0:最小功能模式。这种模式下,串口仍然可以继续使用,但是与射频和SIM卡相关的功能以及部分AT命令不能使用。
  2. AT+CFUN=1:全功能模式(默认)。
  3. AT+CFUN=4:飞行模式。这种模式下,模块仍然可以使用串口,但是与射频相关以及部分AT指令不能使用。

更多功能请参考页末AT指令

说明与使用参考

说明:SIM808 GPS/GPRS/GSM Shield扩展板如果搭配Leonardo主板就相当于一块SIM808 with Leonardo mainboard,具体的使用方法可以参照SIM808 with Leonardo mainboard相关示例,鼠标单击以下链接跳转到相关WIKI。

注意:使用sim808的库的程序需要插上SIM卡,否则会初始化出错

更多

DFshopping_car1.png DFRobot商城购买链接