如何使用STM32F103C8的GPS模块获取位置坐标

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 称为 全球定位系统修复数据。
下面是一个示例 $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,fq,nos,hdp,altitude,m,height,m,,校验和数据
但是在本教程中,我们使用了一个tinygpsplus gps 库,它从 nmea 语句中提取所有需要的信息,我们只需要编写一行简单的代码来获取纬度和经度,我们将在本教程后面看到。
stm32f103c8 的引脚输出
stm32f103c8 (blue pill) usart 串​​行通信端口如下图所示。这些是蓝色的(pa9-tx1、pa10-rx1、pa2-tx2、pa3-rx2、pb10-tx3、pb11-rx3)。它有三个这样的沟通渠道。
电路图和连接
gps模块和stm32f103c8之间的电路连接
16x2 lcd 和 stm32f103c8 之间的连接
整个设置如下所示:
为 gps 模块接口编程 stm32f103c8
本项目末尾给出了使用 stm32 使用 gps 模块查找位置的完整程序。stm32f103c8 可以使用 arduino ide 进行编程,只需通过 usb 端口将其连接到 pc。确保在上传代码时移除引脚 tx 和 rx,并在上传后连接。
要将 gps 与 stm32 连接,首先我们必须从 github 链接tinygpsplus下载一个库。下载库后,可以通过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);  
然后创建一个名为tinygpsplus 类的gps对象。
tinygpsplus 全球定位系统;  
接下来在void setup中,使用serial1.begin(9600)开始与 gps 模块的串行通信。serial1 用作 stm32f103c8 的 serial 1 端口(pins-pa9、pa10)。
serial1.开始(9600);  
然后显示一段时间的欢迎信息。
lcd.开始(16,2); lcd.print(电路文摘); lcd.setcursor(0,1); lcd.print(stm32 带 gps); 延迟(4000); lcd.clear();  
接下来在void loop() 中,我们从 gps 接收经纬度,并检查接收到的数据是否有效,并在串行监视器和 lcd 中显示信息。
检查可用的位置数据是否有效
loc_valid = gps.location.isvalid();  
接收纬度数据
lat_val = gps.location.lat();  
接收经度数据
lng_val = gps.location.lng();  
如果接收到无效数据,则串行监视器显示“*****”,lcd 显示“等待”。
if (!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(纬度:); lcd.print(lat_val,6); serial.print(经度:); serial.println(lng_val, 6); lcd.setcursor(0,1); lcd.print(长:); lcd.print(lng_val,6); 延迟(4000);  
以下函数提供读取数据的延迟。它一直在寻找串行端口上的数据。
静态无效 gpsdelay(unsigned long ms) { unsigned long start = millis(); do { while (serial1.available()) gps.encode(serial1.read()); } while (millis() - start < ms); }  
使用 gps 和 stm32 查找纬度和经度
建立设置并上传代码后,请确保将 gps 模块放置在空旷区域以快速接收信号。有时需要几分钟才能收到信号,所以请等待一段时间。当 gps 模块开始接收信号时,led 将开始闪烁,并且 lcd 显示屏上会显示位置坐标。
您可以使用谷歌地图验证位置的纬度和经度。只需打开 gps 转到 google 地图,然后单击蓝点。它将显示带有纬度和经度的地址,如下图所示
#include //lcd显示函数库
#include //gps函数库
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 全球定位系统;//类tinygpsplus的对象gps
无效设置()
{
serial1.begin(9600);//在串行端口 1 以 9600 波特率开始串行通信
lcd.begin(16,2); //设置显示为 16x2 模式
lcd.print(circuit digest);
lcd.setcursor(0,1);
lcd.print(stm32 带 gps);
延迟(4000);
lcd.clear();
}
无效循环()
{
gpsdelay(1000);
无符号长开始;
双纬度,lng_val;
布尔 loc_valid;
lat_val = gps.location.lat(); //获取纬度
loc_valid = gps.location.isvalid();
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); //在串行监视器打印纬度
lcd.setcursor(0,0);
lcd.print(纬度:);
lcd.print(lat_val,6); //在lcd显示屏上打印纬度
serial.print(经度:);
serial.println(lng_val, 6); //在串口监视器上打印经度
lcd.setcursor(0,1);
lcd.print(长:);
lcd.print(lng_val,6); //在液晶显示屏上打印经度
延迟(4000);
}
}
static void gpsdelay(unsigned long ms) //从 gps 接收数据的延迟
{
unsigned long start = millis();
do
{
while (serial1.available())
gps.encode(serial1.read());
} while (millis() - start < ms);
}

无线蓝牙耳机哪个品牌好、口碑最好的蓝牙耳机
你需要支持VR的手机吗?还是普通手机就好
物联网连接解决方案正在重新定义海上石油和天然气监测的可能性
EPON技术介绍及所面临的测试挑战
智慧园区解决方案现状分析,目前存在着哪些问题
如何使用STM32F103C8的GPS模块获取位置坐标
PL4056锂电池1A充电管理IC,双指示灯,可调电流
电机空载电流影响因素_减小电机空载电流的方法
基于51单片机温湿度控制器仿真设计
华为GPU芯片对标英伟达
2020-2030年中国5G的直接和间接经济产出统计情况及预测
美国一公司推便携式Linux服务器 仅名片大小
基于空心微针的等离子体传感器检测真皮间质液中的生物标志物
北汽决定放弃燃油车,全力投产新能源车
东风标致展车车顶芭蕾舞是不是在内涵特斯拉?官方回应
所有交易所的币都能买吗
Xilinx推出基于28nm Kintex-7 FPGA 的全新目标参考设计和全新开发基板
新品华为Vision智慧屏 3发布,年轻人智慧新生活首选
手机简介
华硕ROGMaximusXIHero主板评测 i9-9900K成功超频的前提只是温度