GSM 模塊經常用于物聯網項目,因為它能夠遠程發送和接收數據。GSM 模塊沒有像 Wi-Fi 模塊那樣的依賴項。雖然其他無線模塊如Wi-Fi或Zigbee具有短距離和成本等缺點,但 GSM 模塊具有可靠性、長距離,因為有效計劃只需要一張 SIM 卡。盡管 GSM 模塊無法發送傳感器生成的大量數據,但它非常適合需要發送少量合理數據的應用。
在本教程中,此類GSM 模塊將與 STM32F103C8 ARM 微控制器連接,以從程序中配置的蜂窩移動號碼發送和接收文本消息 (SMS)。為了顯示接收和發送的消息,一個16x2 LCD將與兩個按鈕一起使用,這兩個按鈕將在按下相關按鈕后啟動文本消息的發送和接收。
所需組件
STM32F103C8 Cortex-M3微控制器
GSM模塊(本教程使用SIM800C)
16x2 液晶顯示器
按鈕 (2)
10k 電位器
面包板
連接電線
什么是 SIM800C GSM 模塊?
SIM800C 是一種廣泛使用的 GSM 模塊,帶有串行接口調制解調器,可在 3.4V-4.4V 電壓等級之間運行。SIM800C 是一款四頻 GSM/GPRS 模塊,用于需要遠程數據傳輸的嵌入式應用。SIM800C 工作在 850/900/1800/1900MHz。它還可以低功耗接收和發送語音電話,短信。模塊通過 AT 指令控制。它支持一個 SIM 卡接口,并具有 UART(TX 和 RX)引腳以及一個 RS232 串行協議,可用于與嵌入式應用中的不同微控制器接口。
為 SIM800C GSM 模塊供電
SIM800C GSM 模塊使用一個 12V 的 DC 電源適配器供電。
將 SIM 卡插入 SIM800C GSM 模塊
SIM800C GSM 模塊的背面插入了一張 SIM 卡。注意SIM800C不支持4G,所以不要插入4G SIM卡。
GSM SIM800C與STM32F103C8接口
為了將SIM800C 與 STM32F103C8 微控制器連接,將使用 UART 串??行端口,它是 STM32F103C8 的硬件串行接口。下圖表示 STM32F103C8 中的 UART 引腳,分別是 A9 和 A10。
STM32F103C8 具有三個 UART 接口,用于連接三個外部串行外設。
AT 命令
AT 命令將用于訪問 GSM 模塊的功能,例如發送和接收語音呼叫、短信。下面給出了一些 AT 命令,它們在本教程中很重要,并且會經常使用。
電路原理圖
GSM 與 STM32的連接如下圖所示。
STM32F103C8和GSM SIM800C之間的電路連接
STM32F103C8 和 16x2 LCD 之間的電路連接
兩個帶有 10k 下拉電阻的按鈕連接到 STM32 微控制器的引腳 PA0 和 PA1。完整的設置如下所示:
為 GSM 接口編程 STM32F103C8 微控制器
STM32F103C8 微控制器可以使用 ARDUINO IDE 進行編程。在本教程中,無需 FTDI 或 ST-LINK 編程器即可對 STM32 進行編程。要將代碼上傳到 STM32F103C8,只需將 microUSB 端口插入 STM32,然后使用 USB 電纜將 USB 端口插入 PC,然后開始在ARDUINO IDE中編寫代碼。如有任何疑問,請按照我們之前關于如何在不使用任何外部 FTDI 或 ST-LINK 編程器的情況下對 STM32 進行編程的教程進行操作。
完整的代碼和工作視頻可以在本教程的末尾找到。
首先包括本教程中使用的外圍設備的必要庫。還要定義 LCD 的引腳配置。
#includeconst int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
接下來,選擇函數lcd.begin(16,2) 初始化 LCD;其中(16,2)告訴 LCD 類型,例如 16x2 塊 LCD 顯示器。只需打印一條消息以調試 LCD 是否提供輸出并正確連接。
lcd.開始(16,2); lcd.print("STM32 帶 GSM"); lcd.setCursor(0,1); lcd.print("SIM800C");
將 Push button 數據方向定義為 Input Mode 并定義使用的引腳號。
pinMode(PA0,輸入); pinMode(PA1,輸入);
選擇用于串行通信的波特率。
Serial1.開始(9600);
代碼中有兩個函數,一個是發送消息,另一個是接收消息。下面給出詳細解釋。
發信息
此功能用于向某個號碼發送短信。AT命令被發送到GSM模塊,指示消息文本模式以及需要發送消息的號碼。
以下語句通過發送 AT 命令(AT+CMGF=1)將 GSM 模塊設置為文本模式。
Serial1.println("AT+CMGF=1"); //將GSM模塊設置為文本模式
之后,指示發送帶有手機號碼的 SMS 的 AT 指令(AT+CMGS)通過 serial1 端口發送到 GSM 模塊。
Serial1.println("AT+CMGS="+91XXXXXXXXXX"\r"); // 將 x 替換為手機號碼
消息每隔一秒使用 AT 命令發送,然后需要發送 CLRL+Z,因此 CTRL+Z 的 ASCII 碼通過 Serial1 端口發送到 GSM 模塊。
延遲(1000); Serial1.println("來自 GSM 模塊的 Hi 電路文摘"); // 要發送的短信 Serial1.println((char)26);// CTRL+Z 的 ASCII 碼
然后在 16X2 LCD 顯示屏上顯示“SMS sent”。
lcd.print("短信發送");
接收消息
在此功能中,信息被接收并打印在 LCD 顯示屏上。
Serial1.println("AT+CNMI=2,2,0,0,0");
因此,要接收實時消息,使用上述 AT 命令。
收到 SMS 后,它包含一個在 serial1 端口可用的字符串,其中還包含其他數據,例如時間、日期等。因此,在出現第六個雙引號 (“) 后,剩下的就是收到的 SMS。因此,其他信息被省略,接收到的消息的剩余信息顯示在16x2 LCD 顯示屏上。
while(1) { if(Serial1.available()) { 做 { while ( !Serial1.available() ); } while ( '"' != Serial1.read() ); 做 { while ( !Serial1.available() ); } while ( '"' != Serial1.read() ); 做 { 而 ( !Serial1.available() ); } while ( '"' != Serial1.read() ); 做 { while ( !Serial1.available() ); } while ( '"' != Serial1.read() ); 做 { while ( !Serial1.available() ); } while ( '"' != Serial1.read() ); 做 { 而 ( !Serial1.available() ); } while ( '"' != Serial1.read() ); while ( !Serial1.available() ); 接收 = Serial1.read(); 而 ( !Serial1.available() ); 接收 = Serial1.read() ; lcd.clear(); while(1) { while (!Serial1.available()); 接收 = Serial1.read(); if (receive == '\r') 中斷; 否則 lcd.write(receive); } } }
使用 STM32 發送和接收短信的演示
1. 要發送短信,只需按左按鈕。短信將發送到代碼中輸入的手機號碼。
2. 要接收短信,只需按右按鈕,短信就會被接收并顯示在液晶顯示屏上。
這就是將GSM 模塊與 STM32F103C8 ARM微控制器連接起來的全部內容。
#include
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //LCD和STM32之間連接的引腳
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int接收= 0;
無效設置()
{
lcd.begin(16,2); //LCD 設置為 16x2 模式
pinMode(PA0,INPUT); //按鈕作為輸入引腳
pinMode(PA1,INPUT);
lcd.print("STM32 帶 GSM"); //顯示歡迎信息
lcd.setCursor(0,1);
lcd.print("SIM800C");
Serial1.開始(9600);// 設置GSM模塊的波特率
延遲(1000);
lcd.clear();
}
無效循環()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("S 發送短信");
lcd.setCursor(0,1);
lcd.print("R 接收短信");
延遲(100);
int a = digitalRead(PA0); //讀取按鈕的狀態
int b = digitalRead(PA1);
if (a == 1) // 取決于按下哪個按鈕,調用相應的函數
{
SendMessage();
}
else if( b == 1)
{
RecieveMessage();
}
}
void SendMessage() //發送消息的函數
{
lcd.clear();
lcd.print("發送短信");
延遲(1000);
Serial1.println("AT+CMGF=1"); //將GSM模塊設置為文本模式
延遲(1000);
Serial1.println("AT+CMGS="+91XXXXXXXXXX"\r"); // 將 x 替換為手機號碼
延遲(1000);
Serial1.println("來自 GSM 模塊的 Hi 電路文摘"); // 您要發送的 SMS 文本
延遲(100);
Serial1.println((char)26);// CTRL+Z的ASCII碼
延遲(1000);
lcd.clear();
lcd.print("短信發送");
延遲(1000);
}
void RecieveMessage() //接收消息的函數
{
lcd.clear();
lcd.print("接收短信");
Serial1.println("AT+CNMI=2,2,0,0,0"); // AT 命令接收實時短信
延遲(1000);
while(1)
{
if(Serial1.available())
{
做
{
而(!Serial1.available());
} while ( '"' != Serial1.read() );
做
{
而(!Serial1.available());
} while ( '"' != Serial1.read() );
做
{
而(!Serial1.available());
} while ( '"' != Serial1.read() );
做
{
而(!Serial1.available());
} while ( '"' != Serial1.read() );
做
{
而(!Serial1.available());
} while ( '"' != Serial1.read() );
做
{
而 ( !Serial1.available() );
} while ( '"' != Serial1.read() );
而(!Serial1.available());
接收 = Serial1.read();
而(!Serial1.available());
接收 = Serial1.read();
lcd.clear();
而(1)
{
而(!Serial1.available());
接收 = Serial1.read();
if (receive == '\r')
中斷;
別的
lcd.write(接收);
}
}
}
}
-
微控制器
+關注
關注
48文章
7496瀏覽量
151085 -
ARM
+關注
關注
134文章
9057瀏覽量
366877 -
GPS模塊
+關注
關注
0文章
87瀏覽量
16426 -
STM32F103C8
+關注
關注
1文章
23瀏覽量
8074
發布評論請先 登錄
相關推薦
評論