GPS NEO-6M + Arduino + LCD 2004: выводим координаты, время, скорость и расстояние до точки

Полный рабочий проект: подключаем GPS-модуль NEO-6M/NEO-6MV2 к Arduino, выводим на LCD 2004 (I²C) дату, время с поправкой часового пояса, широту/долготу, скорость, количество спутников и расстояние до заданной точки. Два экрана меняются каждые 5 секунд.

Координаты GPS на LCD дисплей Arduino NEO-6M

Что понадобится

  • Arduino Uno/Nano
  • GPS-модуль NEO-6M/NEO-6MV2
  • LCD 2004 или 1602 с I²C-модулем
  • Библиотеки: TinyGPS++, LiquidCrystal_I2C

Схема подключения

  • GPS VCC → 5 В (или 3.3 В)
  • GPS GND → GND
  • GPS TX → D10
  • GPS RX → D11
  • LCD I²C: SDA → A4, SCL → A5

Полный рабочий скетч

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>

SoftwareSerial ss(10, 11);        // RX, TX для GPS
TinyGPSPlus gps;
LiquidCrystal_I2C lcd(0x27, 20, 4); // адрес может быть 0x3F

// Координаты центра Москвы (Кремль)
float target_lat = 55.751244;
float target_lng = 37.618423;

void setup() {
  Serial.begin(9600);
  ss.begin(9600);
  lcd.init();
  lcd.backlight();
  lcd.print("GPS Start...");
  delay(3000);
}

void loop() {
  while (ss.available() > 0)
    gps.encode(ss.read());

  if (gps.location.isUpdated()) {
    lcd.clear();
    
    // Экран 1 — Дата/время + координаты
    lcd.setCursor(0,0);
    lcd.print("Date: ");
    lcd.print(gps.date.day()); lcd.print(".");
    lcd.print(gps.date.month()); lcd.print(".");
    lcd.print(gps.date.year());

    lcd.setCursor(0,1);
    lcd.print("Time: ");
    int hour = gps.time.hour() + 3;   // +3 часа Москва
    if (hour >= 24) hour -= 24;
    if (hour < 10) lcd.print("0");
    lcd.print(hour); lcd.print(":");
    if (gps.time.minute() < 10) lcd.print("0");
    lcd.print(gps.time.minute());

    lcd.setCursor(0,2);
    lcd.print("Lat: "); lcd.print(gps.location.lat(), 6);

    lcd.setCursor(0,3);
    lcd.print("Lng: "); lcd.print(gps.location.lng(), 6);

    delay(5000);
    lcd.clear();

    // Экран 2 — Скорость, спутники, расстояние
    lcd.setCursor(0,0);
    lcd.print("Speed: ");
    lcd.print(gps.speed.kmph(), 1); lcd.print(" km/h");

    lcd.setCursor(0,1);
    lcd.print("Sats: "); lcd.print(gps.satellites.value());

    lcd.setCursor(0,2);
    float distance = gps.distanceBetween(
      gps.location.lat(), gps.location.lng(),
      target_lat, target_lng);
    lcd.print("To Moscow: ");
    lcd.print(distance/1000, 1); lcd.print(" km");

    delay(5000);
  }
}
Принимает данные с GPS-модуля и обрабатывает их библиотекой TinyGPS++.
Отображает на LCD дату, время (с поправкой +3), координаты, скорость и число спутников.
Также вычисляет расстояние до заданной точки (Москва).
Экраны автоматически переключаются каждые 5 секунд.

Что можно добавить

  • Высота над уровнем моря
  • Курс движения
  • Запись трека на SD-карту
  • Звуковое оповещение

Итог

Полноценный GPS-информатор на Arduino: точные координаты, московское время, скорость и расстояние до любой точки. Работает сразу после загрузки скетча. Идеальная основа для трекера, навигатора или геолокационного маячка.

Ставьте лайк, если вывели свои координаты, и пишите в комментариях — куда вы направили свой «навигатор»?

FAQ — GPS NEO-6M с Arduino и вывод на LCD 2004

Почему GPS NEO-6M подключается через SoftwareSerial, а не напрямую?

Прямой порт Arduino (пин 0 и 1) используется для USB-связи и отладки. Если подключить GPS туда, монитор порта перестанет работать. SoftwareSerial на пинах 10 и 11 позволяет одновременно получать данные GPS и выводить отладку в Serial Monitor.

Почему LCD иногда показывает пустой экран или иероглифы?

Чаще всего причина — неверный адрес I²C модуля. Попробуйте 0x27 и 0x3F — это две наиболее распространённые опции. Также важно вызвать lcd.init() и lcd.backlight(), иначе дисплей не инициализируется или остаётся без подсветки.

Как правильно рассчитать расстояние до целевой точки в километрах?

Библиотека TinyGPS++ содержит функцию distanceBetween(lat1, lng1, lat2, lng2), которая возвращает расстояние в метрах. Для вывода в километрах делите результат на 1000. В примере именно так и сделано.

ПочемуGPS-индикатор показывает неверное местное время?

GPS отдаёт время в формате UTC. Для локального времени необходимо добавить смещение часового пояса. В примере используется +3 часа (Москва). Если ваше смещение другое — измените формулу: hour = gps.time.hour() + N.

Сколько спутников нужно для получения точных координат?

Для базовой фиксации достаточно 3–4 спутников, но оптимальная точность достигается при 6 и более. Значение gps.satellites.value() в TinyGPS++ позволяет отслеживать текущее количество доступных спутников.

Можно ли использовать LCD 1602 вместо LCD 2004?

Да. Код полностью совместим, но из-за меньшего количества строк и символов часть информации придётся сократить. Адрес и инициализация остаются такими же: lcd(0x27, 16, 2).

Как увеличить скорость обновления данных GPS?

NEO-6M по умолчанию выдаёт данные 1 раз в секунду. Увеличить частоту можно с помощью команды настройки UBX, но большинство проектов на Arduino работают с частотой 1 Гц. Также не ставьте слишком большие задержки — delay(5000) можно заменить на millis().

📁 Скачать примеры