車速表用于測量車輛的行駛速度。我們之前使用 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);
}
?
評論
查看更多