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

Пошаговый DIY-проект: собираем GPS-трекер на ESP32. От схемы и кода до интеграции с Home Assistant. Отслеживайте свой транспорт в реальном времени!
Всем привет! Сегодня я хочу поделиться с вами проектом, который родился из моего желания всегда знать, где припаркован мой велосипед, и отслеживать маршруты поездок. Покупка готового GPS-трекера — это просто, но куда интереснее собрать свой, на базе ESP32. Получится универсальное устройство, которое можно спрятать в автомобиле, закрепить на велосипеде или даже положить в рюкзак. А главное — все данные будут отправляться прямо в ваш умный дом или на карту в реальном времени. Это проект про самостоятельность, контроль и интерес к технологиям.
Почему именно ESP32?
Микроконтроллер ESP32 — идеальная платформа для такого трекера. У него есть Wi-Fi для отправки данных, Bluetooth (который нам может пригодиться для конфигурации), низкое энергопотребление в режимах сна и, что критически важно, поддержка UART для подключения GPS-модуля. Плюс — его программирование в среде Arduino IDE знакомо и доступно большинству энтузиастов.
Что нам понадобится
- Плата ESP32 (любая, например, ESP32 DevKit V1). Если вы думаете о будущем апгрейде, присмотритесь к ESP32-S3: Новое поколение.
- GPS-модуль NEO-6M (или NEO-8M). Классический и недорогой вариант с хорошей чувствительностью.
- Аккумулятор и модуль зарядки (TP4056). Для мобильности. Можно использовать power bank.
- Провода «папа-мама» и макетная плата для прототипирования.
- Корпус (например, от старого 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, это наглядно.
-
Установите необходимые библиотеки в Arduino IDE. Через меню «Инструменты» -> «Управлять библиотеками» найдите и установите:
TinyGPSPlus(для удобного парсинга данных с GPS)WiFi(входит в базовый набор для ESP32)
-
Создайте канал на ThingSpeak. Зарегистрируйтесь на thingspeak.com, создайте новый Channel. Запишите его ID и Write API Key. Они понадобятся в коде.
-
Основной скетч для 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 секунд выбран для баланса между актуальностью данных и энергопотреблением. Для автомобиля можно уменьшить, для велосипеда на батарее — увеличить.
Типичные ошибки и их решение
- «Нет спутников» или «Данные невалидны» в помещении. Это нормально. GPS-модулю нужна прямая видимость неба. Для первого включения вынесите устройство на открытое место и подождите 1-3 минуты. У NEO-6M есть маленький аккумулятор для хранения альманаха, который ускоряет последующие «холодные старты».
- ESP32 не подключается к Wi-Fi. Проверьте правильность SSID и пароля. Убедитесь, что ваша сеть работает на частоте 2.4 ГГц (ESP32 не поддерживает 5 ГГц).
- Данные в ThingSpeak не обновляются. Проверьте Write API Key и ID канала. Убедитесь, что в коде правильно сформирован URL. Посмотрите ответ сервера в мониторе порта (код 200 — успех).
- Большое энергопотребление. В текущей схеме ESP32 и GPS работают постоянно. Чтобы трекер на аккумуляторе работал неделями, нужно реализовать режим Deep Sleep. Идея: просыпаться раз в минуту, включать GPS, ждать фиксации, отправлять данные и снова уходить в сон.
Интеграция с Home Assistant
ThingSpeak — это отлично для начала, но настоящая мощь раскрывается при интеграции в умный дом. Вы можете отправлять данные напрямую в Home Assistant через его REST API или, что еще удобнее, через MQTT.
- Установите в Home Assistant интеграцию MQTT (она часто встроена по умолчанию).
- Разверните MQTT-брокер. Самый простой способ — установить аддон Mosquitto broker прямо в Home Assistant.
- Модифицируйте код 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());
}
}
- В Home Assistant создайте датчики через конфигурацию YAML или автоматически, используя discovery. Данные с MQTT можно визуализировать на карте в Lovelace с помощью карточки
mapили интеграцииGPSLogger.
Для создания сложных сценариев на основе местоположения (например, «включи наружное освещение, когда я подъезжаю к дому») вам может пригодиться связка Node-RED + Home Assistant.
Проверка результата и тестирование
- Монитор порта. Первый этап — открыть Монитор порта в Arduino IDE (скорость 115200). Вы должны увидеть процесс подключения к Wi-Fi и сырые NMEA-строки (если раскомментировали
Serial.write(c)), а затем читаемые координаты. - ThingSpeak. Перейдите на страницу вашего канала. На вкладке «Private View» должна появиться карта с маркером вашего местоположения. Данные будут обновляться с заданным интервалом.
- Полевые испытания. Положите собранный прототип на подоконник, а затем возьмите с собой на прогулку. Проверьте, как обновляется трек на карте.
- 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-проектах — начать, получить первый работающий прототип и затем постепенно его улучшать, подстраивая под свои нужды. Удачи в сборке! Надеюсь, ваш трекер будет полезным и интересным гаджетом.
Понравилась статья?
Поставьте лайк и сохраните полезный материал в закладки.
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Мониторинг качества воздуха: CO2, PM2.5 и VOC своими руками на ESP32
DIY умный звонок с камерой на ESP32-CAM и Home Assistant
Умный счётчик электроэнергии своими руками: мониторинг потребления в реальном времени
Умный аквариум своими руками: автодолив, контроль температуры и освещение по расписанию
DIY ИБП для Raspberry Pi: как не дать умному дому «уснуть» при отключении света
Умная кормушка для кота на ESP32: кормим питомца по расписанию