如何將Arduino與GSM模組介面並讀取簡訊?


在這篇文章中,我們將瞭解如何將Arduino與GSM模組介面,並讀取傳送到模組所連線SIM卡的簡訊。

您將需要以下內容:

  • 一個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+CMGL,它不是簡訊讀取指令,而是簡訊列表指令。我個人認為它比簡訊讀取指令更方便。

雖然AT+CMGR要求您指定要從中讀取簡訊的儲存位置,但AT+CMGL要求您提供要讀取的簡訊型別(已儲存、未讀等)。然後它獲取該型別的所有簡訊並將其作為列表返回。

語法

其語法為:

AT+CMGL = <stat>[,<mode>]

如方括號所示,mode引數是可選的。

<stat> 引數接受以下值:

  • "REC UNREAD": 收到的未讀訊息

  • "REC READ": 收到的已讀訊息

  • "STO UNSENT": 儲存的未傳送訊息

  • "STO SENT": 儲存的已傳送訊息

  • "ALL": 所有訊息

**<mode>** 引數(可選)接受以下值:

  • 0:正常模式(預設)

  • 1:不更改指定簡訊記錄的狀態(即,即使使用此命令獲取未讀訊息,未讀訊息仍然保持未讀狀態)

此命令的詳細返回輸出可以在此GSM模組的AT 指令手冊 的 102-104 頁找到。

下面給出了包含上述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 read received SMSes");
}
void loop()
{
   ReadUnreadMessages();
   delay(1000);
}
void ReadUnreadMessages()
{
   Serial.println("Setting the GSM in text mode");
   gsmSerial.println("AT+CMGF=1\r");
   delay(2000);
   Serial.println("Fetching list of received unread SMSes!");
   gsmSerial.println("AT+CMGL=\"REC UNREAD\"\r");
   delay(2000);
   // Print the response on the Serial Monitor
   while (gsmSerial.available() > 0) {
      Serial.write(gsmSerial.read());
   }
}

收到簡訊時,相關的序列埠監視器輸出將類似於以下內容:

+CMGL: 1,"REC UNREAD","+911234567890",,"06/06/21,00:04:10+40"
SMS List Demo.
+CMGL: 2,"REC UNREAD","+911234567890",,"06/06/21,00:06:12+30"
SMS List Demo Again.

請注意,您會收到簡訊傳送方的電話號碼和訊息的時間戳,以及實際的簡訊文字。手機號碼和時間戳之間的空白欄位理想情況下包含電話簿中與電話號碼關聯的名稱或文字。

您可以編寫一個簡單的函式來解析從CMGL輸出接收到的資訊。

更新於:2021年7月24日

3K+ 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.