这篇文章是Arduino SIM900 GSM GPRS扩展板的完整指南。了解如何发送和接收短信以及如何使用 Arduino 拨打和接听电话。
在本教程中,我们将介绍:
- SIM900 GSM GPRS扩展板简介
- SIM900 GSM GPRS扩展板硬件
- SIM900 AT命令
- 测试shield
- 发送和接收短信
- 拨打和接听电话
目录
SIM900 GSM GPRS扩展板简介
SIM900 GSM GPRS扩展板如下图所示。
GSM代表全球移动通信系统,是移动通信的全球标准。
GPRS 代表 通用分组无线电服务。GPRS是2G和3G蜂窝通信上的移动服务。
应用:
GSM GPRS扩展板特别有用,因为它允许:
- 通过GPRS网络连接到互联网
- 发送和接收短信
- 拨打和接听电话
它的功能使其非常适合使用Arduino的项目,例如:
- 远程控制电子设备 – 发送短信以打开某些东西;
- 接收通知 – 如果检测到您家中的移动,请向您的手机发送短信;
- 接收传感器数据 – 定期向您的手机发送包含每日天气数据的短信。
特征
以下是shield的一些最重要的功能:
- 与Arduino和克隆兼容
- 基于SIMCOM的SIM900模块
- 允许您使用 AT 命令通过 UART 发送短信、彩信、GPRS 和音频。
- 它有 12 个 GPIO、2 个 PWM 和 SIM900 模块的内置 ADC
- 四频:850;900;1800 和 1900 MHZ,因此它应该适用于所有具有 GSM (2G) 网络的国家/地区
- 通过AT命令控制
- 支持 RTC(实时时钟)——背面有一个用于 3V CR1220 电池的支架
- 有麦克风和耳机插孔,可拨打电话
哪里可以买到?
您可以在 Maker Advisor 上查看 SIM900 GSM GPRS 扩展板并找到最优惠的价格。
您可以使用上述链接或直接转到 MakerAdvisor.com/tools 以最优惠的价格找到您项目的所有零件!
预备步骤
在开始使用SIM900 GSM GPRS模块之前,您需要考虑有关SIM卡和屏蔽电源的一些方面。
GSM覆盖
确保您覆盖 GSM 850 MHz、GSM 900 MHz、DCS 1800 MHz 或 PCS 1900 MHz 网络。GSM是指2G。
预付费SIM卡
我们建议您使用预付费计划或具有无限短信的计划进行测试。否则,如果出现问题,您可能需要为错误发送的数百条短信支付巨额账单。在本教程中,我们将使用具有无限短信的预付费计划。
扩展板使用原始SIM卡尺寸,而不是micro或nano。如果您有微型或纳米,您可以考虑购买 SIM 卡尺寸的适配器。
关闭 PIN 锁
要将 SIM 卡与扩展板一起使用,您需要关闭密码锁。最简单的方法是将SIM卡插入智能手机,然后在手机安全设置中关闭密码锁。
就我而言,我需要完成:设置>高级设置>安全>SIM卡锁,然后用密码关闭SIM卡锁。
获得合适的电源
屏蔽层有一个直流电源插座,如下图所示。
在电源插孔旁边有一个拨动开关,用于选择电源。在板上的拨动开关旁边,有一个箭头指示拨动位置以使用外部电源 – 移动拨动开关以使用外部电源,如上图所示。
要为扩展板供电,建议使用可提供 5A 的 2V 电源,如下所示。它也可以用 9V 1A 或 12V 1A 供电。
您可以在此处找到适合此扩展板的电源适配器。确保选择具有 5V 和 2A 的型号。
SIM900 GSM GPRS扩展板硬件
下图显示了防护罩的背面。它有一个用于 SIM 卡的支架和一个用于 RTC(实时时钟)的 3V CR1220 电池。
下图显示了电路板上需要注意的屏蔽最重要的组件。
开始
1) 将 SIM 卡插入 SIM 卡座 – 确保您已阅读上一节中的预备步骤.2) 确保天线连接良好。
3) 在串口选择上,确保跳线帽如下图所示连接,以使用软件串口。
4) 使用外部 5V 电源为扩展板供电。确保选择带有 DC 插孔旁边的拨动开关的外部电源。
5) 要打开/关闭扩展板,请按住电源键约 2 秒钟。
6) 然后,状态 LED 将亮起,NetLight LED 将每 800 毫秒闪烁一次,直到找到网络。当它找到网络时,NetLight LED 将开始每三秒闪烁一次。
请注意: 您可以通过软件自动打开扩展板。在代码示例之后的“自动打开防护罩”部分中,请参阅如何执行此操作。
7) 您可以通过使用 FTDI 编程器从 Arduino IDE 发送 AT 命令来测试扩展板是否正常工作——我们将在本教程后面展示。
SIM900 AT命令
使用 FTDI 编程器测试 Shield
要测试一切是否正常工作,您可以通过从 Arduino IDE 串行监视器发送 AT 命令来测试扩展板。为此,您需要一个FTDI编程器,如下图所示。你可以在这里得到一个这样的FTDI程序员。
1) 如下图所示,将FTDI编程器连接到GSM扩展板。
2) 打开Arduino IDE,选择正确的COM端口。
3) 打开串口监视器
4) 选择 19200 波特率 – 屏蔽默认设置为 19200 – 和回车。在以红色突出显示的框中写入 AT,然后按 Enter。见下图。
5) 如果一切正常,防护板将响应 OK。
将扩展板连接到Arduino
将扩展板连接到Arduino,如下图所示。
发送短信
要发送短信,请将以下代码上传到您的Arduino板。
/*********
Complete project details at https://www.qutaojiao.com
*********/
#include <SoftwareSerial.h>
// Configure software serial port
SoftwareSerial SIM900(7, 8);
void setup() {
// Arduino communicates with SIM900 GSM shield at a baud rate of 19200
// Make sure that corresponds to the baud rate of your module
SIM900.begin(19200);
// Give time to your GSM shield log on to network
delay(20000);
// Send the SMS
sendSMS();
}
void loop() {
}
void sendSMS() {
// AT command to set SIM900 to SMS mode
SIM900.print("AT+CMGF=1r");
delay(100);
// REPLACE THE X's WITH THE RECIPIENT'S MOBILE NUMBER
// USE INTERNATIONAL FORMAT CODE FOR MOBILE NUMBERS
SIM900.println("AT+CMGS="+XXXXXXXXXXXX"");
delay(100);
// REPLACE WITH YOUR OWN SMS MESSAGE CONTENT
SIM900.println("Message example from Arduino Uno.");
delay(100);
// End AT command with a ^Z, ASCII code 26
SIM900.println((char)26);
delay(100);
SIM900.println();
// Give module time to send SMS
delay(5000);
}
在此代码中,首先包括 SoftwareSerial.h 库,并在引脚 7 和 8 上创建软件串行端口。(引脚 7 设置为 RX,引脚 8 设置为 TX)
#include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8);
创建的 sendSMS() 函数是实际发送短信的函数。此函数使用 AT 命令:AT+CMGF=1r 和 AT + CMGS。
您需要在以下位置更改收件人的手机号码:(将 X 替换为收件人的电话号码)
SIM900.println("AT + CMGS = "++++++++++++++"");
收件人的手机号码应为国际格式。
然后,在下一行中,您可以编辑要发送的文本。
// REPLACE WITH YOUR OWN SMS MESSAGE CONTENT SIM900.println("Message example from Arduino Uno.")
阅读收到的短信
要阅读传入的短信,请将以下代码上传到您的 Arduino。上传后,等待 20 秒,让扩展板建立通信。然后,通过向扩展板 SIM 卡号发送短信来测试脚本。SMS 显示在 Arduino 串行监视器上 – 波特率:19200。
/*********
Complete project details at https://www.qutaojiao.com
*********/
#include <SoftwareSerial.h>
// Configure software serial port
SoftwareSerial SIM900(7, 8);
//Variable to save incoming SMS characters
char incoming_char=0;
void setup() {
// Arduino communicates with SIM900 GSM shield at a baud rate of 19200
// Make sure that corresponds to the baud rate of your module
SIM900.begin(19200);
// For serial monitor
Serial.begin(19200);
// Give time to your GSM shield log on to network
delay(20000);
// AT command to set SIM900 to SMS mode
SIM900.print("AT+CMGF=1r");
delay(100);
// Set module to send SMS data to serial out upon receipt
SIM900.print("AT+CNMI=2,2,0,0,0r");
delay(100);
}
void loop() {
// Display any text that the GSM shield sends out on the serial monitor
if(SIM900.available() >0) {
//Get the character from the cellular serial port
incoming_char=SIM900.read();
//Print the incoming character to the terminal
Serial.print(incoming_char);
}
}
在此代码中,您将模块设置为将 SMS 数据发送到串行输出:
SIM900.print("AT+CNMI=2,2,0,0,0r");
将 SMS 消息中的传入字符存储在 incoming_char 变量上。您可以使用 SIM900.read() 函数读取字符。
拨打电话
要拨打电话,请将以下代码上传到您的 Arduino。
不要忘记使用您要拨打的电话号码编辑代码。
/*********
Complete project details at https://www.qutaojiao.com
*********/
#include <SoftwareSerial.h>
// Configure software serial port
SoftwareSerial SIM900(7, 8);
void setup() {
// Arduino communicates with SIM900 GSM shield at a baud rate of 19200
// Make sure that corresponds to the baud rate of your module
SIM900.begin(19200);
// Give time to your GSM shield log on to network
delay(20000);
// Make the phone call
callSomeone();
}
void loop() {
}
void callSomeone() {
// REPLACE THE X's WITH THE NUMER YOU WANT TO DIAL
// USE INTERNATIONAL FORMAT CODE FOR MOBILE NUMBERS
SIM900.println("ATD + +XXXXXXXXX;");
delay(100);
SIM900.println();
// In this example, the call only last 30 seconds
// You can edit the phone call duration in the delay time
delay(30000);
// AT command to hang up
SIM900.println("ATH"); // hang up
}
若要进行调用,请使用使用 ATD 命令的 callSomeone() 函数。
SIM900.println("ATD + +XXXXXXXXX;");
您需要将 X(以红色突出显示)替换为您要呼叫的电话号码。
不要忘记连接麦克风和耳机来拨打电话。
在此代码示例中,使用 ATH 命令在 30 秒后挂断呼叫:
SIM900.println("ATH");
30 秒后挂断电话不是很有用,但举个例子效果很好。这个想法是在触发事件时使用 ATH 命令。例如,将按钮连接到Arduino,按下按钮会发送ATH命令以挂断电话。
接听来电
以下代码应答传入呼叫。
/*********
Complete project details at https://www.qutaojiao.com
*********/
#include <SoftwareSerial.h>
// Configure software serial port
SoftwareSerial SIM900(7, 8);
char incoming_char=0;
void setup() {
// Arduino communicates with SIM900 GSM shield at a baud rate of 19200
// Make sure that corresponds to the baud rate of your module
SIM900.begin(19200); // for GSM shield
// For serial monitor
Serial.begin(19200);
// Give time to log on to network.
delay(20000);
SIM900.print("AT+CLIP=1r"); // turn on caller ID notification
delay(100);
}
void loop() {
// Display any text that the GSM shield sends out on the serial monitor
if(SIM900.available() >0) {
// Get the character from the cellular serial por
// With an incomming call, a "RING" message is sent out
incoming_char=SIM900.read();
// Check if the shield is sending a "RING" message
if (incoming_char=='R') {
delay(10);
Serial.print(incoming_char);
incoming_char=SIM900.read();
if (incoming_char =='I') {
delay(10);
Serial.print(incoming_char);
incoming_char=SIM900.read();
if (incoming_char=='N') {
delay(10);
Serial.print(incoming_char);
incoming_char=SIM900.read();
if (incoming_char=='G') {
delay(10);
Serial.print(incoming_char);
// If the message received from the shield is RING
// Send ATA commands to answer the phone
SIM900.print("ATAr");
}
}
}
}
}
}
当有人拨打 SIM900 号码时,它会发送一条消息,说“响铃”。要知道是否有人在给您打电话,您可以等待来自 SIM900 的传入字符,然后比较它是否是 RING 消息。这就是此代码中所做的。当它收到 RING 消息时,您将发送 ATA 命令来应答电话。
自动打开屏蔽罩
您可以通过软件自动打开扩展板,而不是手动按“电源”键打开扩展板。
1) 首先,您需要将 R13 连接焊接在屏蔽层上,如下图所示 – 以红色突出显示。
2) 将扩展板上的 D9 连接到 D9 Arduino 引脚,如下图所示。
3) 在 setup() 函数中添加以下代码片段。这相当于按下shield“电源”按钮。
digitalWrite(9, HIGH);
delay(1000);
digitalWrite(9, LOW);
delay(5000);
故障 排除
Shield 未响应 OK
检查与Arduino的TX和RX连接。尝试通过使用 RX 引脚更改 TX 来重复该过程。
此外,通过将跳线帽放在串行选择器上的适当位置,检查是否选择了软件序列号。
在串行监视器中看不到消息
要查看串行监视器中的消息,扩展板和Arduino的串行端口波特率应相同。SIM900 GSM GPRS屏蔽默认波特率为19200。因此,将Arduino的波特率选择为19200。
但是,如果需要更改屏蔽波特率,可以发送以下AT命令将其更改为19200或其他合适的波特率。
AT+IPR=19200
总结
本教程向您展示如何使用Arduino发送和接收短信以及拨打和接听电话。您可以应用在本教程中学到的概念来构建自己的项目,以通过蜂窝网络进行通信。