GPS代表全球定位系统,用于检测地球上任意位置的经纬度,有准确的UTC时间(协调世界时)。该设备每秒接收来自卫星的坐标,包括时间和日期。GPS提供高精度,并提供除位置坐标之外的其他数据。
我们都知道GPS是一个非常有用的设备,它经常被用来跟踪手机和其他便携式设备中的位置。它被广泛应用于各个领域,从在家里叫出租车到跟踪飞机的高度。
在本教程中,我们将GPS模块与STM32F103C8微控制器相连,以找到位置坐标并将其显示在16x2 LCD屏幕上。
必需的组件
STM32F103C8微控制器
GPS模块
16x2液晶显示器
面包板
连接线
GPS模块
这是一个GY-NEO6MV2 XM37-1612 GPS模块。GPS模块有四个5V引脚,分别是GND、TXD和RXD。它使用串行引脚进行通信,可以方便地连接到STM32F103C8的串行端口。
GPS模块以NMEA格式发送数据(见下面的截图)。NMEA格式由几个句子组成,其中我们只需要一个句子。这个句子以$GPGGA开头,包含坐标、时间和其他有用的信息。这个GPGGA叫做GPS修复数据。
以下是GPGGA字符串及其描述的示例:
$GPGGA,104534.000,7791.0381,N,06727.4434,E,1.08,0.9,510.4,M,43.9,M,*47
$GPGGA,HHMMSS。SSS,纬度,n,经度,e,FQ,NOS,HDP,海拔,m,高度,m,和校验和数据。
但是在本教程中,我们使用TinyGPSPlus GPS库,它从NMEA语句中提取所有必要的信息。我们只需要编写一行简单的代码来获取纬度和经度,我们将在本教程的后面看到。
STM32F103C8的引脚输出
STM32F103C8(蓝色药丸)USART的串行通信端口如下图所示。这些是蓝色的(pa9-tx1、 pa10-rx1、 pa2-tx2、 pa3-rx2、 pb10-tx3、 pb11-rx3)。它有三个这样的沟通渠道。
线路图和连接
GPS模块和STM32F103C8之间的电路连接
16x2液晶显示器与STM32F103C8的连接
整个设置如下:
为GPS模块接口编程STM32F103C8
最后,给出了利用STM32和GPS模块进行定位的完整程序。STM32F103C8可以用Arduino IDE编程,只需通过USB口连接PC即可。确保在上传代码时移除引脚TX和RX,并在上传后连接它们。
要连接GPS和STM32,我们必须先从TinyGPSPlus下载一个库,这是一个GitHub链接。下载完库后,可以通过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液晶显示器(rs,en,d4,d5,d6,D7);
然后创建一个名为TinygpsPlus类的GPS对象。
TinyGPSPlus全球定位系统;
接下来,在无效设置中,使用Serial1.begin(9600)启动与GPS模块的串行通信。Serial1用作STM32F103C8的串行1端口(引脚PA9、PA10)。
序列号1开始(9600);
然后显示一段时间的欢迎消息。
液晶显示器。Start (16,2);Lcd.print('电路摘要');lcd.setCursor(0,1);Lcd.print('带GPS的STM 32 ');延时(4000);LCD . clear();
接下来,在void loop()中,我们从GPS接收纬度和经度,检查接收到的数据是否有效,并在串行监视器和LCD中显示信息。
检查可用的位置数据是否有效。
loc _ valid=GPS . location . is valid();
接收纬度数据
lat _ val=GPS . location . lat();
接收经度数据
LNG _ val=GPS . location . LNG();
如果接收到无效数据,串行监视器显示“* * * *”,LCD显示“等待”。
如果(!loc _ valid){ LCD . print(' Waiting ');Serial.print('纬度:');serial . println(' * * * * ');Serial.print('经度:');serial . println(' * * * * ');延时(4000);LCD . clear();}
如果收到有效数据,纬度和经度将显示在串行监视器和LCD屏幕上。
LCD . clear();Serial.println('GPS读数:');Serial.print('纬度:');Serial.println(lat_val,6);lcd.setCursor(0,0);LCD . print(' latitude:');lcd.print(lat_val,6);Serial.print('经度:');Serial.println(lng_val,6);lcd.setCursor(0,1);Lcd.print('长度:');lcd.print(lng_val,6);延时(4000);
以下函数提供了读取数据的延迟。它一直在串行端口上寻找数据。
静态无效GPS延迟(无符号长ms){无符号长start=millis();do { while(serial 1 . available())GPS . encode(serial 1 . read());} while(millis()-start ms);}
使用GPS和STM32查找纬度和经度
设置好设置并上传代码后,请确保将GPS模块放置在开阔区域,以便快速接收信号。有时需要几分钟才能收到信号,所以请稍等一会儿。当GPS模块开始接收信号时,LED将开始闪烁,位置坐标将显示在LCD屏幕上。
您可以使用谷歌地图来验证位置的纬度和经度。打开GPS,进入谷歌地图,点击蓝点。它会显示地址和经纬度,如下图所示。
#include //LCD显示函数库#include //GPS函数库constint RS=PB11,en=PB10,D4=PB0,D5=PB1,D6=PC13,D7=PC14//LCD引脚和STM 32液晶显示(RS,EN,D4,D5,D6,D7);TinyGPSPlus全球定位系统;//TinygpsPlus(){ serial 1 . begin(9600)类的对象GPS设置无效;//在串口1开始串行通信,波特率9600。lcd.begin(16,2);//设置lcd.print('电路摘要')以16x2模式显示;lcd.setCursor(0,1);Lcd.print('带GPS的STM 32 ');延时(4000);LCD . clear();}无效loop () {GPS延迟(1000);无符号长开始;两个纬度,lng _ val;布尔loc _ validlat _ val=GPS . location . lat();//获取纬度loc _ valid=GPS . location . is valid();LNG _ val=GPS . location . LNG();//获取经度if(!Loc_valid) //接收到GPS无效数据时执行{ LCD . print(' Waiting ');Serial.print('纬度:');serial . println(' * * * * ');Serial.print('经度:');serial . println(' * * * * ');延时(4000);LCD . clear();}else //接收GPS有效数据时执行{ LCD . clear();Serial.println('GPS读数:');Serial.print('纬度:');Serial.println(lat_val,6);//在串口显示器上打印latitude lcd.setCursor(0,0);LCD . print(' latitude:');lcd.print(lat_val,6);//在液晶屏上打印纬度Serial.print('经度:');Serial.println(lng_val,6);//在串口监视器上打印经度lcd.setCursor(0,1);Lcd.print('长度:');lcd.print(lng_val,6);//在液晶屏上打印经度延时(4000);} } Static Void GPS Delay(unsigned long ms)//从GPS接收数据的延迟{ unsigned long start=millis();do { while(serial 1 . available())GPS . encode(serial 1 . read());} while(millis()-start ms);}
标签:GPS纬度经度