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