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

车速表用于测量车辆的行驶速度。我们之前使用 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 接收器模块内部的核心是 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模块的引脚排列:

VCC: 模块输入电压引脚

GND: 接地引脚

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

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

1.3英寸I2C OLED显示屏

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

技术规格:

驱动IC:SH1106

输入电压:3.3V-5V DC

分辨率:128×64

接口:I2C

电流消耗:8毫安

像素颜色:蓝色

视角:》160度

引脚说明:

VCC:输入电源3.3-5V DC

GND:接地参考引脚

SCL: I2C接口的时钟管脚

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

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

电路原理图

下面给出了这个使用 OLED 的 Arduino 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 显示屏上看到速度,如下图所示。

#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);

}

发表评论