使用连接到Arduino的GSM模块发送短信


在这篇文章中,我们将了解如何将Arduino与GSM模块连接,以及如何使用该模块发送短信。您将需要以下内容 -

  • Arduino 开发板

  • 一个GSM模块(SIM800C、SIM900A是流行的例子,但您也可以使用其他模块)

  • 一张GSM(2G)SIM卡,或一张支持2G回落的4G SIM卡(Jio SIM卡不适用于此项目)

  • GSM天线

您也可以获得一个GSM模块开发板,如下所示(SIM卡插槽位于板子的另一侧) -

GSM模块通过UART与微控制器交互(参见上面电路板左下角的UART跳线孔)。我们将使用SoftwareSerial连接到GSM模块。电路图如下所示 -

如您所见,我们已将GSM模块的RX连接到Arduino的5号引脚,TX连接到9号引脚,GND连接到GND。由于GSM模块将使用单独的1A+适配器供电,因此无需将Vcc连接到Arduino(它需要的电流超过Arduino引脚所能提供的电流)。由于在UART连接中,一个模块的TX连接到另一个模块的RX,反之亦然,因此Arduino的5号引脚将充当TX(因为它连接到GSM的RX),9号引脚将充当RX。

现在,GSM模块使用AT指令工作。深入了解AT指令的细节超出了本文的范围。但是,您应该知道每个GSM命令都有自己的AT指令手册,您应该参考该手册以进行所有操作(发送短信、拨打电话、连接到互联网等)。

SIM900的AT指令手册可以在这里找到。

要发送短信,将使用两个AT指令 -

  • AT+CMGF=1 - 这将短信格式设置为文本模式。

  • 另一种模式是PDU(协议数据单元)模式。

您可以在这里了解有关差异的信息。

我们只对文本消息感兴趣,因此我们将模式设置为文本模式。

第二个AT指令是AT+CMGS,它是发送短信的指令。其**语法**为 -

AT+CMGS = "<phone_number_with_country_code>" <cr>
<SMS Text> ESC

末尾的ESC字符很重要,因为它表示短信文本的结束。ESC字符是Ctrl+Z,它在十六进制中转换为0x1A(ASCII十进制等效值为26)。

下面给出了包含上述AT指令的Arduino代码。如果您使用的是除Arduino Uno以外的开发板,则并非所有数字引脚都支持SoftwareSerial。请这里阅读SoftwareSerial的限制。

#include <SoftwareSerial.h>

SoftwareSerial gsmSerial(9, 5); //RX, TX

void setup()
{
   gsmSerial.begin(9600); // Setting the baud rate of GSM Module
   Serial.begin(9600);    // Setting the baud rate of Serial Monitor (Arduino)
   delay(1000);
   Serial.println("Preparing to send SMS");
   SendMessage();
}

void loop()
{

}
void SendMessage()
{
   Serial.println("Setting the GSM in text mode");
   gsmSerial.println("AT+CMGF=1\r");
   delay(2000);
   Serial.println("Sending SMS to the desired phone number!");
   gsmSerial.println("AT+CMGS=\"+xxxxxxxxxxx\"\r");
   // Replace x with mobile number
   delay(2000);

   gsmSerial.println("Hello from SIM900");    // SMS Text
   delay(200);
   gsmSerial.println((char)26);               // ASCII code of CTRL+Z
   delay(2000);
}

作为练习,您可以尝试在串口监视器上打印AT+CMGS命令的响应。

更新于: 2021年7月30日

10K+ 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告