2024年7月17日 星期三

ESP32 與 GPS 模組日期時間經緯度資料解析

本實作使用 WeMos LoLin32 開發板配合U8g2程式庫於OLED中顯示訊息。直接將 WeMos LoLin32 以 USB 線連接到開發電腦進行程式編譯上傳即可。使用Arduino IDE 編譯 ESP32 程式前請先確認已經正確選定開發板規格。接收GPS訊使用本實作使用GY-NEO6MV2模組來實作,ESP32與用GY-NEO6MV2接線如下:

ESP32 與 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(); // 經度

    Serial.printf("座標:%.6f, %.6f\n", lat, lng);
  }
  else
  {
    Serial.printf("座標資料錯誤\n");
  }

  if (gps.date.isValid() && gps.time.isValid())
  {
     uint16_t y = gps.date.year(); // 年
    uint8_t m = gps.date.month(); // 月
    uint8_t d = gps.date.day();   // 日
    uint8_t hr = gps.time.hour();    // 時
    uint8_t mn = gps.time.minute();  // 分
    uint8_t sec = gps.time.second(); // 秒
    float lat = gps.location.lat(); // 緯度
    float lng = gps.location.lng(); // 經度
    u8g2.firstPage();
      do {
    u8g2.setCursor(5, 20);
    u8g2.printf("%d/%d/%d", y, m, d);  //列印日期
    u8g2.setCursor(5, 40);
    u8g2.printf("%d:%d:%d", hr, mn, sec);  //列印時間
    u8g2.setCursor(5, 60);
    u8g2.printf("%.2f,%.2f", lat, lng);  //列印座標
    } while ( u8g2.nextPage() );
  }
  else
  {
    Serial.println("時間資料錯誤");
  }
}

void setup()
{
  Serial.begin(9600);
  Serial2.begin(GPS_BAUD);
  u8g2.begin(); //初始顯示器物件
  u8g2.setFont(u8g2_font_t0_18b_te); //指定字型
}

void loop()
{
  while (Serial2.available() > 0) //是否有資料傳入
  {
    if (gps.encode(Serial2.read())) //讀取GPS資訊
    {
      parseGPS();
    }
  }
}
將實驗模組移到戶外或可接收到衛星訊號的場所進行GPS信號接收測試。

沒有留言:

張貼留言

熱門文章