本實作使用 WeMos LoLin32 開發板配合U8g2程式庫於OLED中顯示訊息。直接將 WeMos LoLin32 以 USB 線連接到開發電腦進行程式編譯上傳即可。使用Arduino IDE 編譯 ESP32 程式前請先確認已經正確選定開發板規格。
ESP32 與 OLED 接腳設定
1. 電源接線:
【ESP32】3.3V →【OLED】VCC
【ESP32】GND →【OLED】GND
2. 信號接線:
【ESP32】22→【ESP-01】SCL
【ESP32】21→【ESP-01】SDA
想要取得全球位置定位座標,就必須使用GPS模組來取得衛星定位信號,本實作使用GY-NEO6MV2來實作取得衛星訊號的經緯度座標。
GY-NEO6MV2模組核心採用 UBLOX 公司的 NEO-6M 模組,具有 50 個通道,追蹤靈敏度高達-161dBm,測量輸出頻率最高可達 5Hz。NEO-6M 模組自帶高效能無源陶瓷天線,相容 3.3V 和5V 微控制器系統,並自帶可充電後備電池。
GPS模組的訊息為MNEA標準格式,訊息內容以 ASCII 編碼,且每一則訊息皆以 $ 符號開頭,訊息最後則以 \r\n 作為結尾。
- $ GPGSA - GPS DOP和主動衛星
- $ GPGSV - 詳細的GPS衛星資訊
- $ GPGLL - 地理緯度和經度
- $ GPRMC - 基本的GPS pvt(位置、速度、時間)資料
- $ GPVTG - 速度很好
SSP32 與 GY-NEO6MV2 接腳設定
1. 電源接線:
【ESP32】3.3V →【NEO-6M】VCC
【ESP32】GND →【NEO-6MD】GND
2. 信號接線:對應 ESP32 的 UART2 序列接腳
【ESP32】16→【NEO-6M】RX
【ESP32】17→【NEO-6M】TX
為了解析GPS模組的MNEA訊息,可以直接使用前輩們所開發的程式庫加以利用,本實作使用 Mikal Hart 所開發的 TinyGPS PLUS :
將下載下來的程式庫模組壓縮檔以 匯入 方式加入開發程式中:
撰寫實驗程式如下並進行編譯燒錄:
#include <TinyGPS++.h> //引入GPS程式庫 #define GPS_BAUD 9600 // GPS的序列通訊速率 #include <U8g2lib.h> //引入OLED程式庫 U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); TinyGPSPlus gps; // 宣告gps物件 void parseGPS() { if (gps.location.isValid()) { float lat = gps.location.lat(); // 緯度 float lng = gps.location.lng(); // 經度 u8g2.firstPage(); do { u8g2.setCursor(5, 20); u8g2.printf("Coordinate:"); u8g2.setCursor(5, 40); u8g2.printf("%.6f", lat); //列印緯度座標 u8g2.setCursor(5, 60); u8g2.printf("%.6f", lng); //列印經度座標 } while ( u8g2.nextPage() ); Serial.printf("座標:%.6f, %.6f\n", lat, lng); } else { u8g2.clearBuffer(); //清除暫存區 u8g2.drawStr(10, 50, "ERROR"); //設定繪製內容 u8g2.sendBuffer(); //送出繪製內容 Serial.printf("座標資料錯誤\n"); } } void setup() { Serial.begin(9600); Serial2.begin(GPS_BAUD); u8g2.begin(); //初始顯示器物件 u8g2.setFont(u8g2_font_t0_22b_te); //指定字型 } void loop() { while (Serial2.available() > 0) //是否有資料傳入 { if (gps.encode(Serial2.read())) //讀取GPS資訊 { parseGPS(); } } }將實驗模組移到戶外或可接收到衛星訊號的場所進行GPS信號接收測試。
沒有留言:
張貼留言