ESP32 с GPS-модулем NEO-M8N: GPS-логгер и отображение маршрута в Google Earth
Узнайте, как подключить GPS-модуль NEO-M8N к ESP32, программируемому в Arduino IDE, для получения GPS-данных: широта, долгота, высота, время UTC, количество видимых спутников и многое другое. В конце мы покажем, как записывать GPS-данные в файл на microSD-карте и как обработать эти данные для отображения маршрута в Google Earth.
В этом руководстве вы научитесь:
Подключать GPS-модуль NEO-M8N к ESP32 через последовательный порт;
Получать необработанные GPS-данные;
Разбирать необработанные данные для получения выбранной и читаемой GPS-информации;
Определять ваше текущее местоположение;
Записывать местоположение в файл на microSD-карте;
Преобразовывать данные в файл .kml, который может прочитать Google Earth;
Загружать файл .kml в Google Earth для отображения маршрута.
Предварительные требования
Это руководство ориентировано на программирование ESP32 с использованием ядра Arduino. Прежде чем продолжить, у вас должно быть установлено ядро ESP32 Arduino в вашей Arduino IDE. Следуйте следующему руководству для установки ESP32 в Arduino IDE, если вы этого ещё не сделали.
Знакомство с GPS-модулем NEO-M8N
GPS-модуль NEO-M8N — один из самых популярных GPS-приёмников, используемых с микроконтроллерами в проектах навигации и отслеживания. Он может получать данные о широте, долготе, высоте и времени.
Он поддерживает несколько спутниковых систем, включая GPS, Galileo, ГЛОНАСС и BeiDou. Он обеспечивает лучшее отслеживание спутников по сравнению с NEO-6M, что делает его более надёжным в сложных условиях.
Согласно техническому описанию, он имеет точность горизонтального позиционирования от 2,5 до 4 метров и быстрое время запуска (1 секунда для горячего старта, 26–57 секунд для холодного старта — ожидайте более длительное время, если вы находитесь рядом со зданиями).
Модуль включает резервную батарею, встроенную EEPROM и светодиодный индикатор, который мигает при достижении фиксации позиции.
Обычно этот модуль поставляется с керамической GPS-антенной. Но вы можете заменить её на любую другую совместимую антенну, которая лучше подходит для вашего проекта. Например, мне нравится использовать ту, что справа на изображении ниже, потому что она водонепроницаема, и антенна поставляется с длинным кабелем, который обеспечивает большую гибкость.
GPS-модуль NEO-M8N обменивается данными с микроконтроллером по протоколу последовательной связи и работает со стандартными NMEA-сообщениями. NMEA расшифровывается как National Marine Electronics Association, и в мире GPS это стандартный формат данных, поддерживаемый производителями GPS.
Где купить?
Вы можете посетить страницу Maker Advisor Tools, чтобы сравнить цены на GPS-приёмник NEO-M8N в разных магазинах:
Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Подключение GPS-модуля NEO-M8N к ESP32
Мы подключим GPS-модуль NEO-M8N, используя стандартные пины UART2 ESP32. Вы можете использовать следующую картинку и таблицу в качестве справки.
NEO-M8N GPS модуль |
ESP32 |
|---|---|
VCC |
3V3 |
RX |
TX2 (GPIO 17) |
TX |
RX2 (GPIO 16) |
GND |
GND |
Получение необработанных GPS-данных — тестирование GPS-модуля NEO-M8N с ESP32
Для получения необработанных GPS-данных необходимо установить последовательную связь с GPS-модулем и прочитать доступные данные.
Следующий код устанавливает последовательную связь с GPS-модулем и считывает доступные данные.
/*********
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete instructions at https://RandomNerdTutorials.com/esp32-neo-m8n-gps-logger-google-earth/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*********/
// Define the RX and TX pins for Serial 2
#define RXD2 16
#define TXD2 17
#define GPS_BAUD 9600
// Create an instance of the HardwareSerial class for Serial 2
HardwareSerial gpsSerial(2);
void setup(){
// Serial Monitor
Serial.begin(115200);
// Start Serial 2 with the defined RX and TX pins and a baud rate of 9600
gpsSerial.begin(GPS_BAUD, SERIAL_8N1, RXD2, TXD2);
Serial.println("Serial 2 started at 9600 baud rate");
}
void loop(){
while (gpsSerial.available() > 0){
// get the byte data from the GPS
char gpsData = gpsSerial.read();
Serial.print(gpsData);
}
delay(1000);
Serial.println("-------------------------------");
}
Как работает код?
Этот скетч предполагает, что вы используете GPIO 16 и GPIO 17 в качестве пинов RX и TX для установки последовательной связи с GPS-модулем. Если вы используете другие пины, вам нужно изменить их в следующих строках:
// Define the RX and TX pins for Serial 2
#define RXD2 16
#define TXD2 17
Также, если ваш модуль использует другую скорость передачи данных по умолчанию, отличную от 9600 бод, вам следует изменить код в следующей строке:
#define GPS_BAUD 9600
Затем мы создаём экземпляр HardwareSerial для использования UART 2 под именем gpsSerial.
// Create an instance of the HardwareSerial class for Serial 2
HardwareSerial gpsSerial(2);
В setup() мы инициализируем Serial Monitor.
// Serial Monitor
Serial.begin(115200);
Затем мы инициализируем последовательную связь с GPS-модулем.
// Start Serial 2 with the defined RX and TX pins and a baud rate of 9600
gpsSerial.begin(GPS_BAUD, SERIAL_8N1, RXD2, TXD2);
Serial.println("Serial 2 started at 9600 baud rate");
В loop() код слушает последовательный порт GPS, и когда данные получены от модуля, они выводятся в Serial Monitor.
void loop(){
while (gpsSerial.available() > 0){
// get the byte data from the GPS
char gpsData = gpsSerial.read();
Serial.print(gpsData);
}
delay(1000);
Serial.println("-------------------------------");
}
Тестирование кода
Загрузите код на вашу плату.
Убедитесь, что антенна подключена и что модуль или антенна размещены снаружи или рядом с окном, чтобы можно было получать данные со спутников.
Синий светодиод модуля начнёт мигать, когда он найдёт фиксацию позиции.
Serial Monitor будет отображать NMEA-сообщения с GPS-данными.
Важно: если вы запускаете этот скетч впервые, может потребоваться несколько минут, пока модуль не получит фиксацию позиции. Вы начнёте получать актуальные данные, когда синий светодиод начнёт мигать. Если вы находитесь внутри здания, маловероятно, что вы сможете получить GPS-данные. Выйдите на улицу или разместите антенну снаружи, чтобы максимизировать шансы на приём спутникового сигнала.
Вы должны получить множество информации на стандартном языке GPS — NMEA. Каждая строка, которую вы получаете в Serial Monitor, является NMEA-сообщением.
NMEA расшифровывается как National Marine Electronics Association, и в мире GPS это стандартный формат данных, поддерживаемый производителями GPS.
NMEA-сообщения
NMEA-сообщения начинаются с символа $, и каждое поле данных разделяется запятой.
$GNRMC,115209.00,A,4114.5500,N,00861.4900,W,0.129,,160125,,,D*XX
$GNVTG,,T,,M,0.129,N,0.239,K,D*XX
$GNGGA,115209.00,4114.5500,N,00861.4900,W,2,10,0.93,130.6,M,50.1,M,,0000*XX
$GNGSA,A,3,24,25,28,32,29,,,,,,,,1.65,0.93,1.37*XX
$GNGSA,A,3,78,66,67,77,,86,26,083,20*XX
$GLGSV,3,3,09,87,13,131,*XX
$GNGLL,4114.5500,N,00861.4900,W,115209.00,A,D*XX
Существуют различные типы NMEA-сообщений. Тип сообщения указывается символами перед первой запятой.
GN после $ указывает, что это GPS-позиция. $GNGGA — это базовое GNSS NMEA-сообщение, которое предоставляет данные о 3D-местоположении и точности.
В следующем сообщении:
$GNGGA,110827.00,4114.32485,N,00831.79799,W,1,10,0.93,130.6,M,50.1,M,,*5F
Вот как выглядят поля для M8N:
$GNGGA: Глобальные данные GNSS-местоположения.
110827.00: Время в UTC (11:08:27).
4114.32485,N: Широта.
00831.79799,W: Долгота.
1: Качество фиксации (1 = GPS-фиксация, 2 = DGPS и т.д.).
10: Количество отслеживаемых спутников (выше для M8N по сравнению с NEO-6M).
0.93: Горизонтальное снижение точности (чем меньше, тем лучше).
130.6,M: Высота над средним уровнем моря (в метрах).
50.1,M: Высота геоида над эллипсоидом WGS84.
*5F: Пересчитанная контрольная сумма для NEO-M8N.
Другие NMEA-сообщения предоставляют дополнительную информацию:
$GNRMC — Основные данные GNSS PVT (Position, Velocity, Time — Позиция, Скорость, Время)
$GNVTG — Информация о скорости и направлении
$GNGGA — Информация о GNSS-фиксации
$GNGSA — DOP GNSS и активные спутники
$GLGSV — Подробная информация о спутниках (ГЛОНАСС)
$GNGLL — Географическая широта и долгота
Для получения дополнительной информации о NMEA-сообщениях, этот веб-сайт содержит очень подробную информацию.
Вы можете использовать онлайн-анализатор NMEA и вставить туда свои сообщения для интерпретации GPS-данных.
Однако самый простой способ получить и интерпретировать нужные GPS-данные — это разобрать NMEA-сообщения непосредственно в коде. Для этого мы можем использовать библиотеку TinyGPSPlus, которая предоставляет методы для простого извлечения данных из NMEA-сообщений.
Разбор NMEA-сообщений с библиотекой TinyGPSPlus
Библиотека TinyGPSPlus упрощает получение GPS-данных в формате, который легко понять. Вы можете нажать здесь для получения дополнительной информации о библиотеке TinyGPSPlus.
Установка библиотеки TinyGPSPlus
В Arduino IDE перейдите в Sketch > Include Library > Manage Libraries или нажмите на значок Library Manager на левой боковой панели.
Найдите TinyGPSPlus и установите библиотеку от Mikal Hart.
Получение GPS-данных с использованием GPS-модуля NEO-M8N и библиотеки TinyGPSPlus
Следующий код показывает, как получить GPS-данные с помощью библиотеки TinyGPSPlus. Мы получим дату, время, скорость, высоту, количество видимых спутников и HDOP (показатель точности сигнала).
/*********
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete instructions at https://RandomNerdTutorials.com/esp32-neo-m8n-gps-logger-google-earth/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*********/
#include <TinyGPS++.h>
// Define the RX and TX pins for Serial 2
#define RXD2 16
#define TXD2 17
#define GPS_BAUD 9600
// The TinyGPS++ object
TinyGPSPlus gps;
// Create an instance of the HardwareSerial class for Serial 2
HardwareSerial gpsSerial(2);
void setup() {
// Serial Monitor
Serial.begin(115200);
// Start Serial 2 with the defined RX and TX pins and a baud rate of 9600
gpsSerial.begin(GPS_BAUD, SERIAL_8N1, RXD2, TXD2);
Serial.println("Serial 2 started at 9600 baud rate");
}
void loop() {
// This sketch displays information every time a new sentence is correctly encoded.
unsigned long start = millis();
while (millis() - start < 1000) {
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
if (gps.location.isUpdated()) {
Serial.print("LAT: ");
Serial.println(gps.location.lat(), 6);
Serial.print("LONG: ");
Serial.println(gps.location.lng(), 6);
Serial.print("SPEED (km/h) = ");
Serial.println(gps.speed.kmph());
Serial.print("ALT (min)= ");
Serial.println(gps.altitude.meters());
Serial.print("HDOP = ");
Serial.println(gps.hdop.value() / 100.0);
Serial.print("Satellites = ");
Serial.println(gps.satellites.value());
Serial.print("Time in UTC: ");
Serial.println(String(gps.date.year()) + "/" + String(gps.date.month()) + "/" + String(gps.date.day()) + "," + String(gps.time.hour()) + ":" + String(gps.time.minute()) + ":" + String(gps.time.second()));
Serial.println("");
}
}
}
Как работает код?
Вы начинаете с импорта библиотеки TinyGPSPlus.
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
Затем вы определяете пины RX и TX UART 2 и скорость передачи данных GPS. Если ваша плата использует другие пины UART 2 или GPS-модуль использует другую скорость передачи данных, вы можете изменить их в следующих строках.
// Define the RX and TX pins for Serial 2
#define RXD2 16
#define TXD2 17
#define GPS_BAUD 9600
Затем вы создаёте объект TinyGPSPlus:
TinyGPSPlus gps;
Создаёте экземпляр класса HardwareSerial для Serial 2 под именем gpsSerial.
HardwareSerial gpsSerial(2);
В setup() инициализируете Serial Monitor и последовательную связь с GPS-модулем.
void setup() {
// Serial Monitor
Serial.begin(115200);
// Start Serial 2 with the defined RX and TX pins and a baud rate of 9600
gpsSerial.begin(GPS_BAUD, SERIAL_8N1, RXD2, TXD2);
Serial.println("Serial 2 started at 9600 baud rate");
}
В loop() вы запрашиваете информацию. Разбираете данные от GPS-модуля в объект TinyGPSPlus, используя метод encode():
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
Затем вы можете запросить объект gps, чтобы увидеть, были ли обновлены какие-либо поля данных:
if (gps.location.isUpdated()) {
Если есть новые данные, мы можем получить их следующим образом:
Широта |
gps.location.lat() |
Долгота |
gps.location.lng() |
Скорость (км/ч) |
gps.speed.kmph() |
Высота (метры) |
gps.altitude.meters() |
HDOP |
gps.hdop.value() |
Количество видимых спутников |
gps.satellites.value() |
Год |
gps.date.year() |
Месяц |
gps.date.month() |
День |
gps.date.day() |
Час |
gps.time.hour() |
Минуты |
gps.time.minute() |
Секунды |
gps.time.second() |
В коде мы получаем данные и выводим всю информацию в Serial Monitor.
Serial.print("LAT: ");
Serial.println(gps.location.lat(), 6);
Serial.print("LONG: ");
Serial.println(gps.location.lng(), 6);
Serial.print("SPEED (km/h) = ");
Serial.println(gps.speed.kmph());
Serial.print("ALT (min)= ");
Serial.println(gps.altitude.meters());
Serial.print("HDOP = ");
Serial.println(gps.hdop.value() / 100.0);
Serial.print("Satellites = ");
Serial.println(gps.satellites.value());
Serial.print("Time in UTC: ");
Serial.println(String(gps.date.year()) + "/" + String(gps.date.month()) + "/" + String(gps.date.day()) + "," + String(gps.time.hour()) + ":" + String(gps.time.minute()) + ":" + String(gps.time.second()));
Serial.println("");
Тестирование кода
Загрузите код на вашу плату ESP32. Откройте Serial Monitor на скорости 115200 бод. Убедитесь, что GPS-модуль расположен снаружи или рядом с окном для получения данных со спутников.
Примечание: может потребоваться подождать несколько секунд или минут, пока модуль не получит фиксацию позиции.
Вы получите данные в Serial Monitor о вашем текущем местоположении, скорости, высоте, количестве видимых спутников, HDOP и времени.
HDOP расшифровывается как Horizontal Dilution of Precision (горизонтальное снижение точности). Это показатель точности фиксации позиции. Чем выше значение HDOP, тем менее точной будет фиксация позиции. В идеале вы должны получить значение ниже 2. Более низкое значение означает лучшую точность.
GPS-логгер и отображение маршрута в Google Earth
Теперь, когда вы лучше знакомы с использованием GPS-модуля NEO-M8N с ESP32, давайте создадим GPS-логгер, который записывает ваше местоположение с течением времени в файл на microSD-карте. Затем вы сможете модифицировать и использовать этот файл в Google Earth для визуализации того, как менялось местоположение со временем (маршрут).
Обзор проекта
Краткий обзор работы этого проекта:
ESP32 подключён к GPS-модулю NEO-M8N и получает данные о местоположении;
Когда местоположение изменяется минимум на один метр, мы сохраняем данные о местоположении (широта, долгота и высота) в файл на microSD-карте;
Для визуализации данных в Google Earth мы покажем, как вручную преобразовать файл .txt с координатами местоположения в файл .kml, который может прочитать Google Earth;
Мы покажем, как загрузить файл .kml в Google Earth для визуализации маршрута.
Необходимые компоненты
Вот список компонентов, необходимых для этого проекта:
Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Схема подключения
Подключите GPS-модуль к стандартным пинам UART2 ESP32 (как мы делали ранее) и модуль microSD-карты к стандартным SPI-пинам ESP32. Вы можете использовать следующую схему или таблицы ниже в качестве справки.
Вам также может быть полезно: ESP32: руководство по модулю MicroSD-карты с Arduino IDE.
NEO-M8N GPS модуль |
ESP32 |
|---|---|
VCC |
3V3 |
RX |
TX2 (GPIO 17) |
TX |
RX2 (GPIO 16) |
GND |
GND |
Модуль MicroSD-карты |
ESP32 |
|---|---|
3V3* |
3V3 |
CS |
GPIO 5 |
MOSI |
GPIO 23 |
CLK |
GPIO 18 |
MISO |
GPIO 19 |
GND |
GND |
* некоторые модули microSD-карт требуют 5V вместо 3V3
Код
Следующий код инициализирует microSD-карту и GPS-модуль и сохраняет GPS-данные, как только точки данных доступны и новая точка находится на расстоянии не менее 1 метра от предыдущей.
/*********
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete instructions at https://RandomNerdTutorials.com/esp32-neo-m8n-gps-logger-google-earth/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*********/
#include <TinyGPS++.h>
#include <FS.h>
#include <SD.h>
#include <SPI.h>
// Define the RX and TX pins for Serial 2
#define RXD2 16
#define TXD2 17
#define GPS_BAUD 9600
// The TinyGPS++ object
TinyGPSPlus gps;
// Create an instance of the HardwareSerial class for Serial 2
HardwareSerial gpsSerial(2);
String GPSdataToAppend;
// Previous GPS coordinates
double lastLat = 0.0;
double lastLng = 0.0;
// Initialize SD card
void initSDCard() {
if (!SD.begin()) {
Serial.println("Card Mount Failed");
return;
}
uint8_t cardType = SD.cardType();
if (cardType == CARD_NONE) {
Serial.println("No SD card attached");
return;
}
Serial.print("SD Card Type: ");
if (cardType == CARD_MMC) {
Serial.println("MMC");
} else if (cardType == CARD_SD) {
Serial.println("SDSC");
} else if (cardType == CARD_SDHC) {
Serial.println("SDHC");
} else {
Serial.println("UNKNOWN");
}
uint64_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.printf("SD Card Size: %lluMB\n", cardSize);
}
// Append data to the SD card
void appendFile(fs::FS &fs, const char *path, const char *message) {
Serial.printf("Appending to file: %s\n", path);
File file = fs.open(path, FILE_APPEND);
if (!file) {
Serial.println("Failed to open file for appending");
return;
}
if (file.print(message)) {
Serial.println("Message appended");
} else {
Serial.println("Append failed");
}
file.close();
}
void setup() {
// Serial Monitor
Serial.begin(115200);
// Initialize the microSD card
initSDCard();
// Start Serial 2 with the defined RX and TX pins and a baud rate of 9600
gpsSerial.begin(GPS_BAUD, SERIAL_8N1, RXD2, TXD2);
Serial.println("Serial 2 started at 9600 baud rate");
}
void loop() {
unsigned long start = millis();
while (millis() - start < 1000) {
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
if (gps.location.isUpdated()) {
double currentLat = gps.location.lat();
double currentLng = gps.location.lng();
// Check if the distance from the last point is at least 1 meter
double distance = TinyGPSPlus::distanceBetween(lastLat, lastLng, currentLat, currentLng);
if (distance >= 1.0) {
lastLat = currentLat;
lastLng = currentLng;
// Prepare data to append
GPSdataToAppend = String(currentLng, 6) + "," + String(currentLat, 6) + "," + String(gps.altitude.meters());
Serial.println(GPSdataToAppend);
// Append to file
appendFile(SD, "/data.txt", GPSdataToAppend.c_str());
}
}
}
}
Для сохранения данных в формате, который может прочитать Google Earth, нам нужно сохранить долготу, широту и высоту в этом порядке, разделённые запятыми. Это то, что мы делаем в этом примере. Позже нам нужно будет преобразовать эту информацию в файл .kml.
Как работает код?
Мы начинаем с импорта необходимых библиотек.
#include <TinyGPS++.h>
#include <FS.h>
#include <SD.h>
#include <SPI.h>
Затем мы определяем пины, которые будут использоваться для связи с GPS-модулем через протокол последовательной связи. Как мы видели ранее, мы используем стандартные пины UART2.
// Define the RX and TX pins for Serial 2
#define RXD2 16
#define TXD2 17
Мы определяем скорость передачи данных GPS, создаём экземпляр TinyGPSPlus под именем gps и запускаем Hardware Serial 2.
#define GPS_BAUD 9600
// The TinyGPS++ object
TinyGPSPlus gps;
// Create an instance of the HardwareSerial class for Serial 2
HardwareSerial gpsSerial(2);
Мы создаём строковую переменную, которая будет хранить всю информацию для записи на microSD-карту (долгота, широта и высота в этом порядке).
String GPSdataToAppend;
Затем мы инициализируем следующие переменные для сохранения последних значений широты и долготы. Эти переменные нужны для сравнения текущей позиции с предыдущей.
// Previous GPS coordinates
double lastLat = 0.0;
double lastLng = 0.0;
Функция initSDCard() вызывает все необходимые методы для инициализации microSD-карты.
// Initialize SD card
void initSDCard() {
if (!SD.begin()) {
Serial.println("Card Mount Failed");
return;
}
uint8_t cardType = SD.cardType();
if (cardType == CARD_NONE) {
Serial.println("No SD card attached");
return;
}
Serial.print("SD Card Type: ");
if (cardType == CARD_MMC) {
Serial.println("MMC");
} else if (cardType == CARD_SD) {
Serial.println("SDSC");
} else if (cardType == CARD_SDHC) {
Serial.println("SDHC");
} else {
Serial.println("UNKNOWN");
}
uint64_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.printf("SD Card Size: %lluMB\n", cardSize);
}
Функция appendFile() добавляет данные в файл на microSD-карте. Она создаёт файл, если он ещё не существует.
// Append data to the SD card
void appendFile(fs::FS &fs, const char *path, const char *message) {
Serial.printf("Appending to file: %s\n", path);
File file = fs.open(path, FILE_APPEND);
if (!file) {
Serial.println("Failed to open file for appending");
return;
}
if (file.print(message)) {
Serial.println("Message appended");
} else {
Serial.println("Append failed");
}
file.close();
}
Для получения дополнительной информации о функциях microSD-карты ознакомьтесь с этим руководством: ESP32: руководство по модулю MicroSD-карты с Arduino IDE.
В setup() мы инициализируем Serial Monitor, microSD-карту и GPS-модуль.
void setup() {
// Serial Monitor
Serial.begin(115200);
// Initialize the microSD card
initSDCard();
// Start Serial 2 with the defined RX and TX pins and a baud rate of 9600
gpsSerial.begin(GPS_BAUD, SERIAL_8N1, RXD2, TXD2);
Serial.println("Serial 2 started at 9600 baud rate");
}
В loop() мы проверяем наличие новых данных от GPS-модуля каждую секунду. Если они есть, мы кодируем доступные данные и получаем текущую широту и долготу.
unsigned long start = millis();
while (millis() - start < 1000) {
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
if (gps.location.isUpdated()) {
double currentLat = gps.location.lat();
double currentLng = gps.location.lng();
Затем мы проверяем, находится ли текущая позиция на расстоянии не менее одного метра от предыдущей.
// Check if the distance from the last point is at least 1 meter
double distance = TinyGPSPlus::distanceBetween(lastLat, lastLng, currentLat, currentLng);
Если да, мы обновляем переменные lastLat и lastLng текущей позицией.
if (distance >= 1.0) {
lastLat = currentLat;
Мы также подготавливаем данные в виде строки для сохранения на microSD-карту.
GPSdataToAppend = String(currentLng, 6) + "," + String(currentLat, 6) + "," + String(gps.altitude.meters());
Выводим данные в Serial Monitor.
Serial.println(GPSdataToAppend);
И наконец, добавляем данные в файл data.txt на microSD-карте.
appendFile(SD, "/data.txt", GPSdataToAppend.c_str());
Тестирование проекта
Загрузите код на вашу плату. Должна произойти инициализация microSD-карты, и через несколько секунд начнётся добавление данных на microSD-карту (убедитесь, что вы находитесь на улице или рядом с окном).
Если всё работает правильно, отключите ESP32 от компьютера и подайте питание с помощью портативного зарядного устройства или аккумулятора. Отправляйтесь на прогулку с вашей схемой, чтобы она начала записывать ваши координаты с течением времени, и вы могли получить значительное количество точек для построения маршрута.
После записи некоторых данных отключите microSD-карту от модуля и подключите её к компьютеру. На microSD-карте должен быть файл data.txt с координатами вашего маршрута.
Чтобы загрузить эти данные в Google Earth и построить маршрут, нам нужно преобразовать этот файл в формат .kml.
KML-файлы
KML — это формат файлов, используемый для отображения географических данных в браузере Земли, таком как Google Earth. KML использует структуру на основе тегов с вложенными элементами и атрибутами и основан на стандарте XML. Мы не будем подробно рассматривать структуру этого файла. Если вы хотите узнать больше, вы можете ознакомиться с этим руководством по KML-файлам от Google.
Преобразование файла data.txt в формат .kml
1) Откройте файл data.txt с GPS-данными, собранными с GPS-модуля.
2) Отредактируйте файл так, чтобы координаты находились между тегами <coordinates></coordinates> следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<Style id="yellowPoly">
<LineStyle>
<color>7f00ffff</color>
<width>4</width>
</LineStyle>
<PolyStyle>
<color>7f00ff00</color>
</PolyStyle>
</Style>
<Placemark><styleUrl>#yellowPoly</styleUrl>
<LineString>
<extrude>1</extrude>
<tesselate>1</tesselate>
<altitudeMode>absolute</altitudeMode>
<coordinates>
YOUR COORDINATES GO HERE
</coordinates>
</LineString></Placemark>
</Document></kml>
3) Сохраните этот файл.
4) Измените его имя с data.txt на data.kml. Вы получите предупреждение об изменении формата файла. Подтвердите его. Теперь файл готов для загрузки в Google Earth.
Отображение маршрута в Google Earth
Теперь выполните следующие шаги для отображения и визуализации вашего маршрута в Google Earth.
1) Перейдите на веб-сайт Google Earth.
2) Создайте новый проект и дайте ему имя.
3) Перейдите в File > Import File to Project > Upload from device.
4) Выберите файл .kml, созданный ранее.
5) Ваш маршрут будет отображён в Google Earth с жёлтым контуром.
Заключение
В этом руководстве вы узнали, как использовать GPS-модуль NEO-M8N с ESP32 и как получать информацию о местоположении и времени.
Мы также показали, как записывать GPS-данные на microSD-карту и как отредактировать эти данные в формате, который Google Earth может интерпретировать для отображения вашего маршрута.
Надеемся, вы нашли это руководство полезным. У нас есть другие проекты, которые могут вас заинтересовать:
ESP32 TFT с LVGL: отображение GPS-местоположения, даты и времени
ESP32 Wi-Fi робот-машинка с дистанционным управлением (Arduino IDE)
ESP32 Datalogger: скачивание файла данных через веб-сервер (Arduino IDE)
Если вы хотите узнать больше о ESP32, обязательно ознакомьтесь с нашими ресурсами:
Источник: :doc:`Random Nerd Tutorials — ESP32 with NEO-M8N GPS Module: GPS Logger and Display on Google Earth <../esp32-neo-m8n-gps-logger-google-earth/index>`