如何使用Arduino和OLED设计一个GPS车速表

汽车电子

2360人已加入

描述

  车速表用于测量车辆的行驶速度。我们之前使用 IR 传感器和霍尔传感器分别构建了模拟车速表和数字车速表。今天我们将使用 GPS 来测量移动车辆的速度。GPS车速表比标准车速表更准确,因为它可以连续定位车辆并计算速度。GPS 技术广泛用于智能手机和车辆中,用于导航和交通警报。

  在这个项目中,我们将使用带有 OLED 显示屏的 NEO6M GPS 模块 构建一个Arduino GPS 速度计。

  使用的材料

  Arduino纳米

  NEO6M GPS模块

  1.3英寸I2C OLED显示屏

  面包板

  连接跳线

  NEO6M GPS模块

  这里我们使用 NEO6M GPS 模块。NEO-6M GPS模块是一款流行的GPS接收器,内置陶瓷天线,提供强大的卫星搜索能力。该接收器能够感知位置并跟踪多达 22 颗卫星并识别世界任何地方的位置。通过板载信号指示灯,我们可以监控模块的网络状态。具有数据备份电池,当主电源意外关闭时,模块可以保存数据。

gps

  GPS 接收器模块内部的核心是 u-blox 的 NEO-6M GPS 芯片。它可以在 50 个通道上跟踪多达 22 颗卫星,并具有令人印象深刻的灵敏度水平,即 -161 dBm。这款 50 通道 u-blox 6 定位引擎拥有不到 1 秒的首次定位时间 (TTFF)。该模块支持的波特率范围为 4800-230400 bps,默认波特率为 9600。

  特征:

  工作电压:(2.7-3.6)V DC

  工作电流:67毫安

  波特率:4800-230400 bps(9600 默认)

  通讯协议:NEMA

  接口:UART

  外置天线和内置 EEPROM。

  GPS模块的引脚排列:

gps

  VCC: 模块输入电压引脚

  GND: 接地引脚

  RX, TX: 与微控制器的 UART 通信引脚

  我们之前已经将 GPS 与 Arduino 连接,并使用 GPS 模块 构建了许多 项目, 包括 车辆跟踪。

  1.3英寸I2C OLED显示屏

  OLED 一词代表“有机发光二极管”, 它使用与我们大多数电视中使用的技术相同的技术,但与它们相比像素更少。将这些看起来很酷的显示模块与 Arduino 连接起来真的很有趣,因为它会让我们的项目看起来很酷。我们在此处介绍了有关 OLED 显示器及其类型的完整文章。在这里,我们使用的是 单色 4 针 SH1106 OLED 1.28 英寸 OLED 显示屏。此显示器只能在 I2C 模式下工作。

gps

  技术规格:

  驱动IC:SH1106

  输入电压:3.3V-5V DC

  分辨率:128x64

  接口:I2C

  电流消耗:8毫安

  像素颜色:蓝色

  视角:》160度

  引脚说明:

  VCC:输入电源3.3-5V DC

  GND:接地参考引脚

  SCL: I2C接口的时钟管脚

  SDA: I2C 接口的串行数据引脚

  Arduino 社区已经为我们提供了很多库,可以直接使用这些库来简化此操作。我尝试了几个库,发现 Adafruit_SH1106.h 库非常易于使用并且有一些图形选项,因此我们将在本教程中使用相同的库。

  电路原理图

  下面给出了这个使用 OLED 的 Arduino GPS 速度计的电路图。

gps

  完整的设置如下所示:

gps

为 Arduino OLED 车速表编程 Arduino

该项目的完整代码在教程的底部给出。这里我们逐行解释完整的代码。

首先,包括所有库。这里TinyGPS++.h 库用于使用 GPS 接收器模块获取 GPS 坐标,Adafruit_SH1106.h用于 OLED。

 

#include  
#include  
#include  
#include 

 

然后,定义 OLED I2C 地址,可以是 OX3C 或 OX3D,在我的例子中是 OX3C。此外,必须定义显示器的复位引脚。在我的例子中,它被定义为 -1,因为显示器共享 Arduino 的复位引脚。

 

#define OLED_ADDRESS 0x3C 
#define OLED_RESET -1 
Adafruit_SH1106 display(OLED_RESET);

 

接下来,TinyGPSPlus和Softwareserial类的对象定义如下所示。软件串行类需要 Arduino 引脚号。用于串口通信,这里定义为2和3。

 

int RX = 2,TX = 3;
TinyGPSPlus 全球定位系统;
SoftwareSerial gpssoft(RX, TX);

 

在setup()中,为串行通信和 OLED 进行了初始化。软件串行通信的默认波特率定义为 9600。这里SH1106_SWITCHCAPVCC用于在内部从 3.3V 生成显示电压,display.begin函数用于初始化显示。

 

无效设置()
{
  序列.开始(9600);
  gpssoft.开始(9600);
  display.begin(SH1106_SWITCHCAPVCC, OLED_ADDRESS); 
  display.clearDisplay(); 
}

 

在while true 循环内部,验证接收到的串行数据,如果接收到有效的 GPS 信号,则调用displayspeed()以在 OLED 上显示速度值。

 

while (gpssoft.available() > 0) 
    if (gps.encode(gpssoft.read())) 
      displayspeed();

 

在displayspeed()函数中,使用函数gps.speed.isValid()检查来自 GPS 模块的速度数据,如果它返回真值,则速度值显示在 OLED 显示屏上。这里 OLED 上的文本大小使用display.setTextSize函数定义,光标位置使用display.setCursor函数定义。来自 GPS 模块的速度数据使用gps.speed.kmph()函数解码,最后使用display.display()显示。

 

if (gps.speed.isValid()) 
  { 
    display.setTextSize(2); 
    display.setCursor(40, 40); 
    display.print(gps.speed.kmph()); 
    显示.显示();
  }

 

  最后,在 Arduino Uno 中上传代码并将系统放在移动的车辆中,您可以在 OLED 显示屏上看到速度,如下图所示。

gps
 

#include
#include
#include
#include
#define OLED_ADDRESS 0x3C
#define OLED_RESET -1
Adafruit_SH1106 显示器(OLED_RESET);
int RX = 2,TX = 3;
TinyGPSPlus 全球定位系统;
SoftwareSerial gpssoft(RX, TX);
无效设置()
{
序列号.开始(9600);
gpssoft.开始(9600);
display.begin(SH1106_SWITCHCAPVCC, OLED_ADDRESS);
display.clearDisplay();
显示.显示();
}
无效循环()
{
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(白色);
display.setCursor(27, 2);
display.print("电路文摘");
display.setTextSize(1);
display.setCursor(35, 20);
display.print("速度(公里)");
显示.显示();
而 (gpssoft.available() > 0)
如果 (gps.encode(gpssoft.read()))
显示速度();
if (millis() > 5000 && gps.charsProcessed() < 10)
{
display.setTextSize(1);
display.setCursor(35, 40);
display.print("错误!!!");
显示.显示();
而(真);
}
}
无效显示速度()
{
如果 (gps.speed.isValid())
{
display.setTextSize(2);
display.setCursor(40, 40);
display.print(gps.speed.kmph());
显示.显示();
}
别的
{
display.setTextSize(1);
display.setCursor(35, 40);
display.print("没有数据!!!");
显示.显示();
}
延迟(100);
}

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分