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