_SKU_TEL0097_SIM808_GPS_GPRS_GSM_Shield_V1.0通信模块 - jimaobian/DFRobotWikiCn GitHub Wiki
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
| 模块接口及注意事项:
已占用管脚:D0, D1, D12,其中数字口“D12”已内部连接至SIM808模块开/关引脚,可用于SIM808模块开/关机控制。
SIM808板载MIC与3.5mm SIM808麦克风接口使用同一路MIC通道,当3.5mm接口接入话筒设备时,板载MIC将自动断开连接。
Boot开关按钮——SIM808模块开关,短按Boot 1s开机,长按3s关机
指示灯“ON”——SIM808电源指示灯,只有当您接上外接电源时,模块才能正常工作。
Net——GSM信号指示灯
快闪:搜寻网络
慢闪(3s一次):网络注册完成
功能切换开关
None——悬空SIM串口管脚,下载代码时,请拨到此处
USB_DBG——当扩展板插在Arduino上时,拨到此处使SIM808与PC通信(AT调试使用)
Arduino——当扩展板插在Arduino上时,拨到此处使SIM808与Arduino通信,实现脱机使用 |
在这一部分中,我们将演示如何通过Arduino控制SIM808 Shiel,DFRobot_SIM808是一个开源的类库,提供了简单且全面的调用接口,让任何人都可以快速完成项目开发。
-
硬件
- Arduino UNO x1
- SIM808 扩展板 x1
- 外接电源 x1
- SIM手机卡
-
软件
- Arduino IDE 版本最新版 点击下载Arduino IDE
- 下载并安装 DFRobot_SIM808类库
步骤'
- 将插好SIM卡的扩展板插到Arduino UNO上去,确保外接电源和USB线已连接
- 拨动功能切换开关至None档,下载下方提供的样例代码
- 等待程序下载完毕,拨动开关至Arduino'档,这时SIM808即可与Arduino主板进行通信。
本样例样演示了如何通过DFRobot_SIM808 Shield 拨打电话
- 打开类库中的SIM808_CallUp样例或者粘贴下面的代码到你的工程里面
- 更换此处的电话号码为你希望拨打的号码:#define PHONE_NUMBER "187******39"
- 下载程序并将功能开关调整到“Arduino”
- sim808将会拨打电话到指定号码
|
#include <DFRobot_sim808.h>
//Mobile phone number, need to change
#define PHONE_NUMBER "187******39"
DFRobot_SIM808 sim808(&Serial);
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 发送短信
- 打开类库中的SIM808_SendSMS样例或者粘贴下面的代码到你的工程里面
- 更换此处的电话号码为你希望拨打的号码:#define PHONE_NUMBER "187******39"
- 下载程序并将功能开关调整到“Arduino”
- sim808将会发送短信到指定号码
|
#include <DFRobot_sim808.h>
//Mobile phone number, need to change
#define PHONE_NUMBER "187*******39"
//The content of messages sent
#define MESSAGE "hello,world"
DFRobot_SIM808 sim808(&Serial);
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 接听电话和读取短信
- 打开类库中的SIM808_LoopHandle样例或者粘贴下面的代码到你的工程里面
- 下载程序并将功能开关调整到“Arduino”
- 打开串口助手
- sim808自动接听电话并且将收到的短信发送到串口助手
|
#include <DFRobot_sim808.h>
#define MESSAGE_LENGTH 20
char gprsBuffer[64];
char *s = NULL;
DFRobot_SIM808 sim808(&Serial);
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 读取短信
- 打开类库中的SIM808_SMSread样例或者粘贴下面的代码到你的工程里面
- 下载程序并将功能开关调整到“Arduino”
- 打开串口助手
- Arduino会将SIM808会将收到的短信发送到串口助手
|
#include <DFRobot_sim808.h>
#define MESSAGE_LENGTH 160
char message[MESSAGE_LENGTH];
int messageIndex = 0;
char phone[16];
char datetime[24];
DFRobot_SIM808 sim808(&Serial);
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);
}
}
|}
本样例样演示了如何通过DFRobot_SIM808 Shield 建立TCP连接并发送GET请求
- 打开类库中的SIM808_TCPConnection样例或者粘贴下面的代码到你的工程里面
- 下载程序并将功能开关调整到“Arduino”
- 打开串口助手
- 等待几分钟,直到串口输出"Connect mbed.org success",代表此时已经连接成功,否则请重试
- SIM808将会按照GET指令发送请求,在本样例中,串口会输出收到的数据“hello world!”
|
#include <DFRobot_sim808.h>
//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);
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(){
}
|}
本样例样演示了如何通过DFRobot_SIM808 Shield 读取GPS数据
- 安装GPS天线
- 打开类库中的SIM808_GetGPS样例或者粘贴下面的代码到你的工程里面
- 下载程序并将功能开关调整到“Arduino”
- 打开串口助手
- 将其移至室外,等待几分钟,直到串口输出GPS数据
|
#include <DFRobot_sim808.h>
DFRobot_SIM808 sim808(&Serial);
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();
}
}
|}
除了上述方式通过Arduino控制SIM808之外,你也可以在PC上通过串口发送AT指令的方式对SIM808扩展板进行调试。在这一部分中,我们将以图文形式,演示如何通过串口发送AT命令的方式来对SIM808扩展板进行调试。更多的指令和功能,请参考页末更多中的AT指令集。
-
硬件
- Arduino UNO x1
- SIM808 扩展板 x1
- 外接电源 x1
-
软件
- Arduino IDE 版本最新版 点击下载Arduino IDE
- 串口调试助手(任意,能够发送16位进制数即可,可根据需要自己选择)
步骤
- 将SIM卡插在扩展板上,并把SIM808扩展板插上Arduino UNO,同时接上接上外接电源。
- 拨动功能切换开关至None档,下载一个样例代码Blink来确保串口不被占用(其他不占用串口的代码也可以)。
- 按下Boot开机键,等待SIM卡网络注册正常,既Net状态指示灯进入慢闪状态(3s一次)
- 拨动功能切换开关至USB_DBG档,此时我们就可以通过串口助手直接与SIM808芯片进行通信。
在串口助手中发送AT,得到返回OK代表通信正常。 按图所示,输入AT指令,应该得到相同内容。注意:电话号码后面需要跟一个英文分号“;”.
注意:GPS天线必须置于室外,才可以获得稳定的GPS定位数据输出。
发送AT+CGNSPWR=1命令(打开GPS电源)
发送AT+CGNSTST=1命令(开始从串口接收GPS数据)
如果GPS天线已经放置露天位置并收到GPS数据,等待几分钟后,会有正确的GPS定位数据输出。
当想暂停GPS数据输出,可发送AT+CGNSTST=0命令可暂停GPS数据输出。
当想关闭GPS,可发送AT+CGNSPWR=0命令关断GPS电源。
发送AT+CPOWD=1,将模块关机。
更多精彩指令,请参考页末的AT指令表。
最小功能模式
最小功能模式就是将模块功能减小到最少,所以也使得模块的电流消耗减小到最少。可以通过命令"AT+CFUN="把模块设置到该模式下,这条命令提供三种选择,用于设置不同功能。
- AT+CFUN=0:最小功能模式。这种模式下,串口仍然可以继续使用,但是与射频和SIM卡相关的功能以及部分AT命令不能使用。
- AT+CFUN=1:全功能模式(默认)。
- AT+CFUN=4:飞行模式。这种模式下,模块仍然可以使用串口,但是与射频相关以及部分AT指令不能使用。
更多功能请参考页末AT指令
说明:SIM808 GPS/GPRS/GSM Shield扩展板如果搭配Leonardo主板就相当于一块SIM808 with Leonardo mainboard,具体的使用方法可以参照SIM808 with Leonardo mainboard相关示例,鼠标单击以下链接跳转到相关WIKI。
注意:使用sim808的库的程序需要插上SIM卡,否则会初始化出错