這個基于GPS的Arduino時鐘的一個主要用途是戶外探索,它可以作為一個緊湊的,一體化的工具來跟蹤時間,位置和運動數(shù)據(jù)。它也可以用于實地研究,在那里需要精確的GPS信息和時間戳數(shù)據(jù)進行科學研究。這個拆解對業(yè)余愛好者和學生來說是一個很好的資源,所以讓我們開始吧!
硬件
按鈕的接線方式如下:
按鈕連接
OLED顯示器是另一個非常有用的組件,可用于廣泛的主題,涵蓋顯示輸入,GUI(圖形用戶界面)等等!線路是這樣的:
OLED布線
GPS模塊是市場上最方便、最簡單的遠程通信設備之一。雖然一些LoRa和其他GPS模塊可以遠距離傳輸數(shù)據(jù),但在這種情況下NEO-6m僅用于提取數(shù)據(jù)。(在這里查看GPS模塊的快速概述)。下面是它是如何工作的總結(jié):
衛(wèi)星通信:接收來自GPS衛(wèi)星的信號,以確定其在地球上的位置。
NMEA數(shù)據(jù)輸出:將包含位置、速度和時間數(shù)據(jù)的標準NMEA語句通過串行通信發(fā)送到Arduino。這些都是通過TinyGPS++庫翻譯的。
天線要求:需要外置或內(nèi)置天線才能有效接收衛(wèi)星信號。
以下是Neo-6m GPS模塊的布線:
全球定位系統(tǒng)(GPS)布線
出于本設備的目的,我們將只使用4個按鈕中的3個(示意圖如下),但其中任何數(shù)量的按鈕都可以用于任何其他應用程序(在評論中分享它們,我很想看到它們)。
下面是完整的示意圖:
代碼
在我們開始之前,從這里下載u8g zip庫并從Sketch > Include Libraries > add . zip library將其添加到Arduino項目中心。關于安裝TinyGPS++庫的說明可以在這里找到。
讓我們一步一步地分解代碼:
變量聲明:
?設置u8g庫以優(yōu)化速度和刷新率。
?設置GPS設備,RX在引腳10上,TX在引腳11上。
?pd_bitmap_Aerospace_qr_code:存儲任何你想要的64x64 QR碼的信息(看看下面如何制作64x64 QR碼)。
?bitmap_icon_……:為每個菜單項存儲16x16像素的圖標信息
?Bitmap_icons[8]:按照菜單在屏幕上顯示的順序存儲菜單
?Bitmap_scrollbar_background[]:顯示光標位置的邊欄
?Bitmap_item_sel_outline:顯示在項目周圍的光暈
?不同按鈕的引腳聲明(在引腳10上添加另一個按鈕以用于其他用例)
?button_up_clicked, button_select_clicked和button down clicked:對按鈕的變量進行拆分(單擊時為1,釋放時為0)
?item_selected, item_sel_previous & item_sel_next:跟蹤光標在菜單列表上的位置
?current_screen:從menu_items數(shù)組中跟蹤當前屏幕索引。
?如果數(shù)據(jù)有效且更新,這些變量存儲來自GPS模塊的數(shù)據(jù)。
?進度:跟蹤加載屏幕上的進度條。
?buffer:構(gòu)建字符串在進度條上顯示進度。
循環(huán)()函數(shù):
?按鈕導航:它檢查按鈕按下(BUTTON_UP_PIN, BUTTON_DOWN_PIN, BUTTON_SELECT_PI),并相應地調(diào)整item_selected索引。例如,按“上”會減少所選項目,而按“下”會增加所選項目。當?shù)竭_菜單末尾時,所選內(nèi)容環(huán)繞。
?debating: button_up_clicked, button_down_clicked和button_select_clicked標志用于防止重復的按鈕按下被注冊多次。一旦按鈕被釋放,標志被重置,允許再次按下。
?屏幕導航:基于當前屏幕(current_screen),當按下“選擇”按鈕時,它在不同的屏幕之間切換。它要么轉(zhuǎn)到下一個屏幕(menu_item),要么返回到菜單屏幕(current_screen = 0)。
?菜單顯示:如果current_screen == 0,則顯示菜單。它使用u8g圖形庫繪制上一菜單項、當前菜單項和下一菜單項及其相應的圖標,并更新滾動條以反映所選項。
?GPS數(shù)據(jù)顯示:在特定的屏幕上(current_screen == 2用于位置/速度/高度,current_screen == 3用于時間/日期),程序讀取GPS數(shù)據(jù)并在顯示器上顯示值(緯度,經(jīng)度,速度,高度,時間和日期)。它在顯示GPS數(shù)據(jù)之前檢查其有效性。
?QR碼顯示:如果current_screen == 1,則使用u8 . drawbitmapp()函數(shù)在屏幕上顯示QR碼的位圖圖像。
PrintSomething()函數(shù):
?打印通過使用string()類聲明將float轉(zhuǎn)換為字符串而收集的數(shù)據(jù)。
?使用c_str()函數(shù)將字符串轉(zhuǎn)換為char[]以在OLED顯示器上打印。
getData()函數(shù):
?使用gps.speed.isValid()檢查速度是否有效,如果有效,則將速度設置為以米每秒為單位測量的速度。
注意:所有其他get()函數(shù)的工作方式相同。
QR碼說明
?將鏈接減少到不超過15個字符。
?去barcode.tec-it.com并生成一個32 × 32像素的條形碼。
?使用這個圖像到cpp網(wǎng)站將QR碼轉(zhuǎn)換為數(shù)組
?復制/粘貼這個數(shù)組到epd_bitmap_qr_code
本文編譯自hackster.io





