GPS代表全球定位系統(tǒng),用于檢測(cè)地球上任何位置的緯度和經(jīng)度,具有精確的UTC時(shí)間(協(xié)調(diào)世界時(shí))。該設(shè)備每秒接收來自衛(wèi)星的坐標(biāo),包括時(shí)間和日期。GPS 提供了很高的準(zhǔn)確性,并且除了位置坐標(biāo)之外還提供其他數(shù)據(jù)。
我們都知道 GPS 是一個(gè)非常有用的設(shè)備,在手機(jī)和其他便攜式設(shè)備中非常常用來跟蹤位置。它在各個(gè)領(lǐng)域都有非常廣泛的應(yīng)用,從在家中叫出租車到跟蹤飛機(jī)的高度。
在本教程中,我們將GPS 模塊與 STM32F103C8 微控制器連接,以查找位置坐標(biāo)并將其顯示在16x2 LCD 顯示屏上。
所需組件
STM32F103C8微控制器
GPS模塊
16x2 液晶顯示器
面包板
連接電線
GPS模塊
這是一個(gè) GY-NEO6MV2 XM37-1612 GPS 模塊。該 GPS 模塊有四個(gè)引腳 +5V、GND、TXD 和 RXD。它使用串行引腳進(jìn)行通信,并且可以輕松地與 STM32F103C8 的串行端口連接。
GPS 模塊 以 NMEA 格式發(fā)送數(shù)據(jù)(參見下面的屏幕截圖)。NMEA 格式由幾個(gè)句子組成,其中我們只需要一個(gè)句子。這句話從 $GPGGA開始 ,包含坐標(biāo)、時(shí)間和其他有用的信息。此 GPGGA 稱為 全球定位系統(tǒng)修復(fù)數(shù)據(jù)。
下面是一個(gè)示例 $GPGGA 字符串及其描述:
$GPGGA,104534.000,7791.0381,N,06727.4434,E,1,08,0.9,510.4,M,43.9,M,,*47
$GPGGA,HHMMSS.SSS,latitude,N,longitude,E,F(xiàn)Q,NOS,HDP,altitude,M,height,M,,校驗(yàn)和數(shù)據(jù)
但是在本教程中,我們使用了一個(gè)TinyGPSPlus GPS 庫,它從 NMEA 語句中提取所有需要的信息,我們只需要編寫一行簡單的代碼來獲取緯度和經(jīng)度,我們將在本教程后面看到。
STM32F103C8 的引腳輸出
STM32F103C8 (BLUE PILL) USART 串??行通信端口如下圖所示。這些是藍(lán)色的(PA9-TX1、PA10-RX1、PA2-TX2、PA3-RX2、PB10-TX3、PB11-RX3)。它有三個(gè)這樣的溝通渠道。
電路圖和連接
GPS模塊和STM32F103C8之間的電路連接
16x2 LCD 和 STM32F103C8 之間的連接
整個(gè)設(shè)置如下所示:
本項(xiàng)目末尾給出了使用 STM32 使用 GPS 模塊查找位置的完整程序。STM32F103C8 可以使用 Arduino IDE 進(jìn)行編程,只需通過 USB 端口將其連接到 PC。確保在上傳代碼時(shí)移除引腳 TX 和 RX,并在上傳后連接。
要將 GPS 與 STM32 連接,首先我們必須從 GitHub 鏈接TinyGPSPlus下載一個(gè)庫。下載庫后,可以通過Sketch -》 Include Library -》 Add .zip Library 將其包含在 Arduino IDE 中。相同的庫可用于將GPS 與 Arduino 接口。
所以首先包含必要的庫文件并為 16x2 LCD 定義引腳:
#include#include const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
然后創(chuàng)建一個(gè)名為TinyGPSPlus 類的gps對(duì)象。
TinyGPSPlus 全球定位系統(tǒng);
接下來在void setup中,使用Serial1.begin(9600)開始與 GPS 模塊的串行通信。Serial1 用作 STM32F103C8 的 Serial 1 端口(Pins-PA9、PA10)。
Serial1.開始(9600);
然后顯示一段時(shí)間的歡迎信息。
lcd.開始(16,2); lcd.print("電路文摘"); lcd.setCursor(0,1); lcd.print("STM32 帶 GPS"); 延遲(4000); lcd.clear();
接下來在void loop() 中,我們從 GPS 接收經(jīng)緯度,并檢查接收到的數(shù)據(jù)是否有效,并在串行監(jiān)視器和 LCD 中顯示信息。
檢查可用的位置數(shù)據(jù)是否有效
loc_valid = gps.location.isValid();
接收緯度數(shù)據(jù)
lat_val = gps.location.lat();
接收經(jīng)度數(shù)據(jù)
lng_val = gps.location.lng();
如果接收到無效數(shù)據(jù),則串行監(jiān)視器顯示“*****”,LCD 顯示“等待”。
if (!loc_valid) { lcd.print("Waiting"); Serial.print("緯度:"); Serial.println("*****"); Serial.print("經(jīng)度:"); Serial.println("*****"); 延遲(4000); lcd.clear(); }
如果接收到有效數(shù)據(jù),則緯度和經(jīng)度將顯示在串行監(jiān)視器以及 LCD 顯示屏上。
lcd.clear(); Serial.println("GPS 讀數(shù):"); Serial.print("緯度:"); Serial.println(lat_val, 6); lcd.setCursor(0,0); lcd.print("緯度:"); lcd.print(lat_val,6); Serial.print("經(jīng)度:"); Serial.println(lng_val, 6); lcd.setCursor(0,1); lcd.print("長:"); lcd.print(lng_val,6); 延遲(4000);
以下函數(shù)提供讀取數(shù)據(jù)的延遲。它一直在尋找串行端口上的數(shù)據(jù)。
靜態(tài)無效 GPSDelay(unsigned long ms) { unsigned long start = millis(); do { while (Serial1.available()) gps.encode(Serial1.read()); } while (millis() - start < ms); }
使用 GPS 和 STM32 查找緯度和經(jīng)度
建立設(shè)置并上傳代碼后,請(qǐng)確保將 GPS 模塊放置在空曠區(qū)域以快速接收信號(hào)。有時(shí)需要幾分鐘才能收到信號(hào),所以請(qǐng)等待一段時(shí)間。當(dāng) GPS 模塊開始接收信號(hào)時(shí),LED 將開始閃爍,并且 LCD 顯示屏上會(huì)顯示位置坐標(biāo)。
您可以使用谷歌地圖驗(yàn)證位置的緯度和經(jīng)度。只需打開 GPS 轉(zhuǎn)到 Google 地圖,然后單擊藍(lán)點(diǎn)。它將顯示帶有緯度和經(jīng)度的地址,如下圖所示
#include
#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);
TinyGPSPlus 全球定位系統(tǒng);//類TinyGPSPlus的對(duì)象gps
無效設(shè)置()
{
Serial1.begin(9600);//在串行端口 1 以 9600 波特率開始串行通信
lcd.begin(16,2); //設(shè)置顯示為 16x2 模式
lcd.print("Circuit Digest");
lcd.setCursor(0,1);
lcd.print("STM32 帶 GPS");
延遲(4000);
lcd.clear();
}
無效循環(huán)()
{
GPSDelay(1000);
無符號(hào)長開始;
雙緯度,lng_val;
布爾 loc_valid;
lat_val = gps.location.lat(); //獲取緯度
loc_valid = gps.location.isValid();
lng_val = gps.location.lng(); //獲取經(jīng)度
if (!loc_valid) //從 GPS 接收到無效數(shù)據(jù)時(shí)執(zhí)行
{
lcd.print("Waiting");
Serial.print("緯度:");
Serial.println("*****");
Serial.print("經(jīng)度:");
Serial.println("*****");
延遲(4000);
lcd.clear();
}
else //從 GPS 接收到有效數(shù)據(jù)時(shí)執(zhí)行
{
lcd.clear();
Serial.println("GPS 讀數(shù):");
Serial.print("緯度:");
Serial.println(lat_val, 6); //在串行監(jiān)視器打印緯度
lcd.setCursor(0,0);
lcd.print("緯度:");
lcd.print(lat_val,6); //在LCD顯示屏上打印緯度
Serial.print("經(jīng)度:");
Serial.println(lng_val, 6); //在串口監(jiān)視器上打印經(jīng)度
lcd.setCursor(0,1);
lcd.print("長:");
lcd.print(lng_val,6); //在液晶顯示屏上打印經(jīng)度
延遲(4000);
}
}
static void GPSDelay(unsigned long ms) //從 GPS 接收數(shù)據(jù)的延遲
{
unsigned long start = millis();
do
{
while (Serial1.available())
gps.encode(Serial1.read());
} while (millis() - start < ms);
}
-
微控制器
+關(guān)注
關(guān)注
48文章
7714瀏覽量
152640 -
GPS模塊
+關(guān)注
關(guān)注
0文章
89瀏覽量
16722 -
LCD顯示屏
+關(guān)注
關(guān)注
1文章
91瀏覽量
13564 -
STM32F103C8
+關(guān)注
關(guān)注
1文章
23瀏覽量
8159
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
用STM32F103C8控制伺服馬達(dá)的電路連接及代碼說明

使用ESP8266將STM32F103C8連接到互聯(lián)網(wǎng)的方法

如何在STM32F103C8中使用中斷

將伺服電機(jī)與STM32F103C8板連接起來的教程

stm32f103c8
移植Alios Things 到STM32F103C8
stm32f103C8如何移植FreeRTOS
怎樣在STM32F103C8上去移植FreeRTOS操作系統(tǒng)呢
IAP在STM32F103C8上的實(shí)現(xiàn)
STM32F103C8的電路原理圖免費(fèi)下載

基于STM32F103C8 輸入捕獲實(shí)驗(yàn)

使用STM32F103C8和SIM800C GSM模塊發(fā)送/接收短信

基于MCP4725設(shè)計(jì)使用STM32F103C8的數(shù)模轉(zhuǎn)換器

評(píng)論