Главная страница » DIY проекты » GPS-трекер на ESP32 для велосипеда или автомобиля: DIY-проект для умного дома
GPS-трекер на ESP32 для велосипеда или автомобиля: DIY-проект для умного дома
DIY проекты

GPS-трекер на ESP32 для велосипеда или автомобиля: DIY-проект для умного дома

31.03.2026 229
GPS-трекер на ESP32 для велосипеда или автомобиля: DIY-проект для умного дома

Пошаговый DIY-проект: собираем GPS-трекер на ESP32. От схемы и кода до интеграции с Home Assistant. Отслеживайте свой транспорт в реальном времени!

Всем привет! Сегодня я хочу поделиться с вами проектом, который родился из моего желания всегда знать, где припаркован мой велосипед, и отслеживать маршруты поездок. Покупка готового GPS-трекера — это просто, но куда интереснее собрать свой, на базе ESP32. Получится универсальное устройство, которое можно спрятать в автомобиле, закрепить на велосипеде или даже положить в рюкзак. А главное — все данные будут отправляться прямо в ваш умный дом или на карту в реальном времени. Это проект про самостоятельность, контроль и интерес к технологиям.

Почему именно ESP32?

Микроконтроллер ESP32 — идеальная платформа для такого трекера. У него есть Wi-Fi для отправки данных, Bluetooth (который нам может пригодиться для конфигурации), низкое энергопотребление в режимах сна и, что критически важно, поддержка UART для подключения GPS-модуля. Плюс — его программирование в среде Arduino IDE знакомо и доступно большинству энтузиастов.

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

  1. Плата ESP32 (любая, например, ESP32 DevKit V1). Если вы думаете о будущем апгрейде, присмотритесь к ESP32-S3: Новое поколение.
  2. GPS-модуль NEO-6M (или NEO-8M). Классический и недорогой вариант с хорошей чувствительностью.
  3. Аккумулятор и модуль зарядки (TP4056). Для мобильности. Можно использовать power bank.
  4. Провода «папа-мама» и макетная плата для прототипирования.
  5. Корпус (например, от старого power bank’а или распечатанный на 3D-принтере).

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

Подключение очень простое. GPS-модуль общается с ESP32 по последовательному интерфейсу (UART).

ESP32 (GPIO) Модуль NEO-6M Примечание
GPIO 16 (RX2) TX Принимаем данные с GPS
GPIO 17 (TX2) RX Может понадобиться для конфигурации модуля
3.3V VCC Питание 3.3В!
GND GND Общая земля

Важный момент: Питать GPS-модуль НУЖНО от 3.3V ESP32, а не от 5V. Многие модули NEO-6M имеют стабилизатор, но перестраховка никогда не помешает.

Аккумулятор подключаем к модулю TP4056, а с него питание (+5V) подаём на контакт VIN или 5V на ESP32. Не забудьте выключатель!

Прошивка ESP32: Пишем код трекера

Мы создадим трекер, который будет определять координаты и отправлять их на внешний сервис — ThingSpeak или в ваш Home Assistant. Для начала используем ThingSpeak, это наглядно.

  1. Установите необходимые библиотеки в Arduino IDE. Через меню «Инструменты» -> «Управлять библиотеками» найдите и установите:

    • TinyGPSPlus (для удобного парсинга данных с GPS)
    • WiFi (входит в базовый набор для ESP32)
  2. Создайте канал на ThingSpeak. Зарегистрируйтесь на thingspeak.com, создайте новый Channel. Запишите его ID и Write API Key. Они понадобятся в коде.

  3. Основной скетч для ESP32.

#include <WiFi.h>
#include <TinyGPSPlus.h>
#include <HTTPClient.h>

// ========== НАСТРОЙКИ ==========
const char* ssid = "ВАШ_SSID_WIFI";
const char* password = "ВАШ_ПАРОЛЬ_WIFI";

// Ключи ThingSpeak
const char* serverName = "http://api.thingspeak.com/update";
String apiKey = "ВАШ_WRITE_API_KEY";
unsigned long channelID = ВАШ_CHANNEL_ID; // Без кавычек!

// Интервал отправки данных (в миллисекундах)
const unsigned long sendInterval = 30000; // 30 секунд
unsigned long lastSendTime = 0;

// ========== ОБЪЕКТЫ ==========
// Создаем объект для работы с GPS
TinyGPSPlus gps;
// Используем Hardware Serial 2 на ESP32
HardwareSerial SerialGPS(2);

void setup() {
  Serial.begin(115200); // Для отладки в мониторе порта
  SerialGPS.begin(9600, SERIAL_8N1, 16, 17); // RX=16, TX=17

  WiFi.begin(ssid, password);
  Serial.print("Подключение к WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("Подключено! IP адрес: " + WiFi.localIP().toString());
}

void loop() {
  // Читаем данные с GPS-модуля
  while (SerialGPS.available() > 0) {
    char c = SerialGPS.read();
    // Serial.write(c); // Раскомментируйте для сырого вывода NMEA в монитор
    gps.encode(c); // Парсим данные
  }

  // Проверяем, есть ли валидные данные о местоположении
  if (gps.location.isValid() && gps.location.age() < 2000) { // Данные не старше 2 секунд
    Serial.print("Широта: "); Serial.println(gps.location.lat(), 6);
    Serial.print("Долгота: "); Serial.println(gps.location.lng(), 6);
    Serial.print("Спутников: "); Serial.println(gps.satellites.value());

    // Отправляем данные на сервер по интервалу
    if (millis() - lastSendTime > sendInterval) {
      sendToThingSpeak(gps.location.lat(), gps.location.lng(), gps.satellites.value());
      lastSendTime = millis();
    }
  } else {
    Serial.println("GPS: данные невалидны или устарели. Спутников: " + String(gps.satellites.value()));
  }

  delay(100); // Небольшая задержка для стабильности
}

void sendToThingSpeak(float latitude, float longitude, int satellites) {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    String url = serverName;
    url += "?api_key=" + apiKey;
    url += "&field1=" + String(latitude, 6);
    url += "&field2=" + String(longitude, 6);
    url += "&field3=" + String(satellites);

    http.begin(url);
    int httpResponseCode = http.GET();

    if (httpResponseCode > 0) {
      Serial.print("Данные отправлены. Код ответа: ");
      Serial.println(httpResponseCode);
    } else {
      Serial.print("Ошибка отправки. Код: ");
      Serial.println(httpResponseCode);
    }
    http.end();
  } else {
    Serial.println("Ошибка: Нет подключения к WiFi");
  }
}

Комментарии к коду: * Мы используем второй аппаратный UART (Serial2) на пинах 16 и 17. * gps.encode() — это «волшебная» функция библиотеки TinyGPSPlus, которая разбирает поток NMEA-строк и заполняет объект gps актуальными данными. * Проверка gps.location.age() критически важна. Она не даст вам отправить устаревшие координаты, которые модуль мог «помнить» с прошлой успешной фиксации. * Интервал отправки в 30 секунд выбран для баланса между актуальностью данных и энергопотреблением. Для автомобиля можно уменьшить, для велосипеда на батарее — увеличить.

Типичные ошибки и их решение

  1. «Нет спутников» или «Данные невалидны» в помещении. Это нормально. GPS-модулю нужна прямая видимость неба. Для первого включения вынесите устройство на открытое место и подождите 1-3 минуты. У NEO-6M есть маленький аккумулятор для хранения альманаха, который ускоряет последующие «холодные старты».
  2. ESP32 не подключается к Wi-Fi. Проверьте правильность SSID и пароля. Убедитесь, что ваша сеть работает на частоте 2.4 ГГц (ESP32 не поддерживает 5 ГГц).
  3. Данные в ThingSpeak не обновляются. Проверьте Write API Key и ID канала. Убедитесь, что в коде правильно сформирован URL. Посмотрите ответ сервера в мониторе порта (код 200 — успех).
  4. Большое энергопотребление. В текущей схеме ESP32 и GPS работают постоянно. Чтобы трекер на аккумуляторе работал неделями, нужно реализовать режим Deep Sleep. Идея: просыпаться раз в минуту, включать GPS, ждать фиксации, отправлять данные и снова уходить в сон.

Интеграция с Home Assistant

ThingSpeak — это отлично для начала, но настоящая мощь раскрывается при интеграции в умный дом. Вы можете отправлять данные напрямую в Home Assistant через его REST API или, что еще удобнее, через MQTT.

  1. Установите в Home Assistant интеграцию MQTT (она часто встроена по умолчанию).
  2. Разверните MQTT-брокер. Самый простой способ — установить аддон Mosquitto broker прямо в Home Assistant.
  3. Модифицируйте код ESP32, добавив библиотеку PubSubClient для отправки данных в топик MQTT, например, home/gps_tracker/coordinates.
// ... (остальные include)
#include <PubSubClient.h>

// Настройки MQTT
const char* mqtt_server = "192.168.1.100"; // IP вашего Home Assistant
WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  // ... (прежний код setup)
  client.setServer(mqtt_server, 1883); // Порт MQTT по умолчанию
}

void reconnectMQTT() {
  while (!client.connected()) {
    if (client.connect("ESP32_GPS_Tracker")) {
      Serial.println("Подключено к MQTT-брокеру");
    } else {
      Serial.print("Ошибка MQTT, rc=");
      Serial.print(client.state());
      delay(5000);
    }
  }
}

void loop() {
  // ... (прежний код чтения GPS)
  if (!client.connected()) {
    reconnectMQTT();
  }
  client.loop();

  if (gps.location.isValid()) {
    // ... (прежняя проверка интервала)
    // Отправка в MQTT
    String payload = "{"lat":" + String(gps.location.lat(),6) +
                     ","lon":" + String(gps.location.lng(),6) +
                     ","sat":" + String(gps.satellites.value()) + "}";
    client.publish("home/gps_tracker/coordinates", payload.c_str());
  }
}
  1. В Home Assistant создайте датчики через конфигурацию YAML или автоматически, используя discovery. Данные с MQTT можно визуализировать на карте в Lovelace с помощью карточки map или интеграции GPSLogger.

Для создания сложных сценариев на основе местоположения (например, «включи наружное освещение, когда я подъезжаю к дому») вам может пригодиться связка Node-RED + Home Assistant.

Проверка результата и тестирование

  1. Монитор порта. Первый этап — открыть Монитор порта в Arduino IDE (скорость 115200). Вы должны увидеть процесс подключения к Wi-Fi и сырые NMEA-строки (если раскомментировали Serial.write(c)), а затем читаемые координаты.
  2. ThingSpeak. Перейдите на страницу вашего канала. На вкладке «Private View» должна появиться карта с маркером вашего местоположения. Данные будут обновляться с заданным интервалом.
  3. Полевые испытания. Положите собранный прототип на подоконник, а затем возьмите с собой на прогулку. Проверьте, как обновляется трек на карте.
  4. Home Assistant. Убедитесь, что в логах MQTT-брокера или Home Assistant появляются сообщения из топика home/gps_tracker/coordinates. Создайте карту в интерфейсе Lovelace.

Заключение и идеи для развития

Мы собрали полностью рабочий GPS-трекер. Это основа, которую можно развивать в разных направлениях:

  • Энергосбережение: Реализуйте Deep Sleep для работы от аккумулятора месяцами.
  • Геозоны в Home Assistant: Настройте автоматизацию, которая будет включать сигнализацию, если велосипед покинет «безопасную зону» вокруг дома.
  • Логирование маршрутов: Пишите координаты на SD-карту (используйте модуль для ESP32) для создания треков, которые потом можно открыть в Google Earth.
  • Дополнительные датчики: Добавьте акселерометр (MPU-6050) для определения движения и удара — это уже полноценная автосигнализация.
  • Резервный канал связи: Используйте GSM-модуль (SIM800L) для отправки данных через мобильную сеть, когда Wi-Fi недоступен.

Главное в таких DIY-проектах — начать, получить первый работающий прототип и затем постепенно его улучшать, подстраивая под свои нужды. Удачи в сборке! Надеюсь, ваш трекер будет полезным и интересным гаджетом.

Понравилась статья?

Поставьте лайк и сохраните полезный материал в закладки.

Комментарии (0)
Добавить комментарий
Ваш комментарий
Кликните на изображение чтобы обновить код, если он неразборчив

Войдите в аккаунт, чтобы пользоваться закладками, сообщениями и другими возможностями сайта.