ESP8266 NodeMCU с GPS-модулем NEO-M8N (Arduino IDE)
Узнайте, как подключить GPS-модуль NEO-M8N к плате ESP8266 NodeMCU, программируемой в Arduino IDE, для получения данных GPS: широты, долготы, высоты, времени UTC, количества видимых спутников и многого другого.
В этом руководстве вы научитесь:
Подключать GPS-модуль NEO-M8N к ESP8266 через последовательный интерфейс;
Парсить необработанные данные для получения выбранной и читаемой GPS-информации;
Получать ваше текущее местоположение, дату, время и многое другое…
Оглавление
В этом руководстве мы рассмотрим следующие темы:
Знакомство с GPS-модулем NEO-M8N
GPS-модуль NEO-M8N является одним из самых популярных GPS-приёмников, используемых с микроконтроллерами в навигационных и трекинговых проектах. Он может получать данные о широте, долготе, высоте и времени.
Модуль поддерживает несколько спутниковых систем, включая GPS, Galileo, GLONASS и BeiDou. Он обеспечивает лучшее отслеживание спутников, чем NEO-6M, что делает его более надёжным в сложных условиях.
Согласно даташиту, модуль имеет горизонтальную точность позиционирования от 2,5 до 4 метров и быстрое время запуска (1 секунда для горячего старта, 26–57 секунд для холодного старта — ожидайте более длительное время, если вы находитесь рядом со зданиями).
Модуль включает резервную батарею, встроенную EEPROM и светодиодный индикатор, который мигает при достижении фиксации позиции.
Этот модуль обычно поставляется с керамической GPS-антенной. Но вы можете заменить её на любую другую совместимую антенну, которая лучше подходит для вашего проекта. Например, мне нравится использовать ту, что справа на фотографии ниже, потому что она водонепроницаемая, а антенна поставляется с длинным кабелем, что обеспечивает большую гибкость.
GPS-модуль NEO-M8N взаимодействует с микроконтроллером по протоколу последовательной связи и работает со стандартными NMEA-сообщениями. NMEA означает National Marine Electronics Association (Национальная ассоциация морской электроники), и в мире GPS это стандартный формат данных, поддерживаемый производителями GPS.
Где купить?
Вы можете посетить страницу инструментов Maker Advisor для сравнения цен на GPS-приёмник NEO-M8N в разных магазинах:
Вы можете воспользоваться приведёнными выше ссылками или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все комплектующие для ваших проектов по лучшей цене!
Подключение GPS-модуля NEO-M8N к ESP8266
Для связи с GPS-модулем NEO-M8N мы будем использовать программный последовательный порт (Software Serial), поэтому вы можете использовать любые доступные GPIO. Мы будем использовать: GPIO 14 (D5) и GPIO 12 (D6).
Рекомендуемое чтение: Распиновка ESP8266: какие выводы GPIO следует использовать?
GPS-модуль NEO-M8N |
ESP8266 NodeMCU |
|---|---|
VCC |
3V3 |
RX |
GPIO 12 (D6) |
TX |
GPIO 14 (D5) |
GND |
GND |
Установка библиотеки TinyGPSPlus
Мы будем программировать ESP8266 NodeMCU с помощью Arduino IDE. Убедитесь, что у вас установлены платы ESP8266, следуя этому руководству: Установка платы ESP8266 в Arduino IDE 2 (Windows, Mac OS X, Linux).
Для декодирования NMEA-сообщений, получаемых от GPS-модуля, мы будем использовать библиотеку TinyGPSPlus. Установите её перед продолжением.
В Arduino IDE перейдите в Sketch > Include Library > Manage Libraries или нажмите на значок Library Manager на левой боковой панели.
Найдите TinyGPSPlus и установите библиотеку от Mikal Hart.
ESP8266 NodeMCU с GPS-модулем NEO-M8N — получение данных GPS
Следующий код показывает, как получить данные GPS с помощью библиотеки TinyGPSPlus. Мы получим дату, время, скорость, высоту, количество видимых спутников и HDOP (показатель точности сигнала).
/*********
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete instructions at https://RandomNerdTutorials.com/esp8266-nodemcu-neo-m8n-gps-arduino/
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 <SoftwareSerial.h>
#include <TinyGPS++.h>
// Define the RX and TX pins for Software Serial
#define RX 14
#define TX 12
#define GPS_BAUD 9600
// The TinyGPS++ object
TinyGPSPlus gps;
// Create an instance of Software Serial
SoftwareSerial gpsSerial(RX, TX);
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.println("Software Serial 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 и SoftwareSerial.
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
Затем вы определяете GPIO, которые хотите использовать для Software Serial, и скорость передачи данных GPS-модуля.
// Define the RX and TX pins for Software Serial 2
#define RX 14
#define TX 12
#define GPS_BAUD 9600
Затем вы создаёте объект TinyGPS++:
TinyGPSPlus gps;
Создаёте экземпляр SoftwareSerial на определённых ранее пинах.
SoftwareSerial gpsSerial(RX, TX);
В функции 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.println("Software Serial started at 9600 baud rate");
}
В функции loop() происходит запрос информации. Парсинг данных от GPS-модуля в объект TinyGPS++ выполняется с помощью метода 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 Arduino IDE.
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("");
Тестирование кода
Загрузите код на вашу плату ESP8266. Откройте Serial Monitor со скоростью 115200 бод. Убедитесь, что ваш GPS-модуль размещён на улице или рядом с окном для получения данных со спутников.
Примечание: вам может потребоваться подождать несколько секунд или минут, пока модуль сможет получить фиксацию позиции.
Вы получите данные в Serial Monitor о вашем текущем местоположении, скорости, высоте, количестве видимых спутников, HDOP и времени.
HDOP расшифровывается как Horizontal Dilution of Precision (горизонтальное снижение точности). Это показатель точности определения позиции. Чем выше значение HDOP, тем менее точным будет определение позиции. В идеале вы должны получить значение ниже 2. Более низкое значение означает лучшую точность.
Заключение
В этом руководстве вы узнали, как использовать GPS-модуль NEO-M8N с ESP8266 и как получить информацию о местоположении, времени, высоте, скорости, количестве спутников и многом другом.
Надеемся, что это руководство было для вас полезным. У нас есть руководства по другим модулям, которые могут вам пригодиться:
ESP8266 NodeMCU: Руководство по модулю часов реального времени DS1307 (RTC) (Arduino IDE)
ESP8266 NodeMCU: 20+ бесплатных руководств по датчикам и модулям
Если вы хотите узнать больше о ESP8266, обязательно ознакомьтесь с нашими ресурсами: