使用连接到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命令的响应。