车速表用于测量车辆的行驶速度。我们之前使用 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
外置天线和内置 EEPROM。
GPS模块的引脚排列:
VCC: 模块输入电压引脚
GND: 接地引脚
我们之前已经将 GPS 与 Arduino 连接,并使用 GPS 模块 构建了许多 项目, 包括 车辆跟踪。
1.3英寸I2C OLED显示屏
OLED 一词代表“有机发光二极管”, 它使用与我们大多数电视中使用的技术相同的技术,但与它们相比像素更少。将这些看起来很酷的显示模块与 Arduino 连接起来真的很有趣,因为它会让我们的项目看起来很酷。我们在此处介绍了有关 OLED 显示器及其类型的完整文章。在这里,我们使用的是 单色 4 针 SH1106 OLED 1.28 英寸 OLED 显示屏。此显示器只能在 I2C 模式下工作。
技术规格:
驱动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 速度计的电路图。
完整的设置如下所示:
为 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);
}
评论
查看更多