车速表用于测量车辆的行驶速度。我们之前使用红外传感器和霍尔传感器分别构建了模拟速度表和数字速度表。今天,我们将使用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定位引擎的首次定位时间(TTFF)不到1秒。该模块支持4800-230400 bps的波特率,默认波特率为9600。
特征:
- 工作电压:(2.7-3.6)V DC
- 工作电流:67 mA
- 波特率: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
- 分辨率:128x64
- 接口:I2C
- 电流消耗:8 mA
- 像素颜色:蓝色
- 可视角度:> 160度
引脚说明:
VCC:输入电源3.3-5V DC
GND:接地参考引脚
SCL: I2C接口的时钟引脚
SDA: I2C接口的串行数据引脚
Arduino社区已经为我们提供了许多库,可以直接使用它们来简化此过程。我试用了一些库,发现 Adafruit_SH1106.h 库非常易于使用,并且具有少量图形选项,因此在本教程中将使用相同的库。
OLED看起来很酷,可以很容易地与其他微控制器接口以构建一些有趣的项目:
- 将SSD1306 OLED显示器与Raspberry Pi连接
- 将SSD1306 OLED显示屏与Arduino接口
- 使用ESP32和OLED显示屏的Internet时钟
- 使用Arduino,DHT11和IR Blaster的自动交流温度控制器
电路原理图
下面给出了使用OLED的Arduino GPS速度计的电路图。
完整的设置如下所示:
为Arduino OLED速度计编程Arduino
该项目的完整代码在教程的底部。在这里,我们逐行解释完整的代码。
首先,包括所有库。这里的TinyGPS ++。h库用于使用GPS接收器模块获取GPS坐标,而 Adafruit_SH1106.h 用于OLED。
#包括
然后,定义OLED I2C地址,可以是OX3C或OX3D,在我的情况下是OX3C。同样,必须定义显示器的复位引脚。在我的情况下,它定义为-1,因为显示器共享Arduino的Reset引脚。
#define OLED_ADDRESS 0x3C #define OLED_RESET -1 Adafruit_SH1106 display(OLED_RESET);
接下来,定义 TinyGPSPlus 和 Softwareserial 类的对象,如下所示。软件串行类需要Arduino引脚号。用于串行通信,此处定义为2和3。
int RX = 2,TX = 3; TinyGPSPlus GPS; 软件串行gpssoft(RX,TX);
在 setup() 内部,完成了串行通信和OLED的初始化。软件串行通信的默认波特率定义为9600。此处 SH1106_SWITCHCAPVCC 用于从内部从3.3V产生显示电压,而 display.begin 函数用于初始化显示。
void setup() { Serial.begin(9600); gpssoft.begin(9600); display.begin(SH1106_SWITCHCAPVCC,OLED_ADDRESS); display.clearDisplay(); }
里面 虽然 如此循环,串口接收到的数据进行验证,如果接收到有效的GPS信号,然后 displayspeed() 被调用,以显示在OLED的速度值。
while(gpssoft.available()> 0) 如果(gps.encode(gpssoft.read())) displayspeed();
在 displayspeed() 函数内部,使用 gps.speed.isValid() 函数检查来自GPS模块的速度数据,如果返回的是真值,则该速度值将显示在OLED显示屏上。这里对OLED文本大小是使用定义 display.setTextSize 功能和光标位置是使用定义 display.setCursor 功能。来自GPS模块的速度数据使用 gps.speed.kmph() 函数解码,最后使用 display.display() 显示。
如果(gps.speed.isValid()) { display.setTextSize(2); display.setCursor(40,40); display.print(gps.speed.kmph()); display.display(); }
最后,将代码上传到Arduino Uno并将系统放置在行驶中的车辆上,您可以在OLED显示屏上看到速度,如下图所示。
下面给出了带有演示视频的完整代码。