Этот GPS-трекер на базе ESP32 должен стать увлекательным проектом, особенно для новичков, интересующихся электроникой и разработкой программного обеспечения (ПО). Он пробуждает детское любопытство к отслеживанию всего, что нас окружает. Хотя его аппаратная настройка относительно проста, настоящая его сложность кроется в программном обеспечении. Но это больше не проблема благодаря появлению API GeoLinker.
Сервис Circuit Digest Cloud запустил простой в использовании бесплатный API GeoLinker. Этот API позволяет вам составлять графики и маршрутизировать данные о местоположении, отправляемые с вашего устройства на сервер, что упрощает визуализацию и отслеживание местоположения.
![]()
В этой статье мы рассмотрим создание GPS-трекера на базе GPS-модуля Neo-6M и платы ESP32, подробно расскажем о настройке оборудования и использовании GeoLinker в качестве программного компонента.
Также на нашем сайте вы можете посмотреть другие проекты GPS-трекеров:
- GPS-трекер на ESP32, модуле Quectel L86 GPS и OLED-дисплее;
- GPS трекер на основе Arduino и технологии Lora.
Требуемые компоненты
Для этого проекта требуется лишь минимальное количество компонентов. Однако перед использованием важно проверить работоспособность каждого компонента. Как всегда, выбор компонентов зависит от вашего бюджета и креативности, без ограничений на адаптацию. Ниже представлены компоненты, которые мы использовали для сборки GPS-трекера на базе ESP32.
- Плата разработки ESP32 (купить на AliExpress).
- GPS модуль NEO-6M (купить на AliExpress).
- Светодиоды - 2 шт. (купить на AliExpress).
- Резистор 1 кОм - 2
- Макетная плата.
- Соединительные провода — по мере необходимости.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Нет никаких особых причин выбрать GPS-модуль Neo-6M, кроме его экономичности. Если вы используете Neo-6M, как и я, и ваш GPS-модуль не работает, ознакомьтесь со статьёй по ссылке, чтобы узнать, как устранить неполадки. Вы также можете использовать любой другой GPS-модуль для ESP32 для завершения этого проекта.
Как работает GPS-трекер ESP32?
В этом проекте мы создадим простой GPS-трекер, сочетающий GPS-модуль для ESP32 с подключением к облаку, что упростит реализацию как на аппаратном, так и на программном уровне. В качестве аппаратной части мы будем использовать известную плату разработки ESP32 вместе с GPS-модулем Neo-6M. В качестве программного обеспечения мы будем использовать API GeoLinker, разработанный Circuit Digest Cloud.

Мы будем получать GPS-данные с GPS-модуля Neo-6M с помощью ESP32 и отправлять их в API для построения карт и маршрутизации с помощью простого HTTP-запроса. Каждая точка данных будет добавлена в базу данных. Войдя в свою учётную запись на Circuit Digest Cloud, вы сможете просматривать данные построения карт в режиме реального времени и отслеживать маршрут.
Дополнительная функция, реализованная в этом проекте, — это онлайн- и офлайн-обработка данных. В частности, при отсутствии интернета данные сохраняются в локальной переменной. После восстановления соединения сначала на сервер отправляются сохранённые данные, а затем — вновь полученные. Это весьма интересная и полезная функция, особенно в регионах с нестабильным интернет-соединением.
Настройка GeoLinker для GPS-трекера
Как и большинство облачных API CircuitDigest, GeoLinker также требует API-ключа для авторизации. Чтобы получить бесплатный API-ключ, выполните следующие действия.
Если вы новичок в CircuitDigest Cloud, вам необходимо зарегистрировать новую учетную запись, выполнив следующие шаги.
Регистрация новой учетной записи в Circuit Digest Cloud

Шаг 1: Посетите домашнюю страницу Circuit Digest Cloud. Нажмите кнопку "Login" («Войти») в правом верхнем углу, чтобы перейти на страницу входа.
Шаг 2: Если у вас уже есть учётная запись, войдите в систему, используя свои текущие данные. Если нет, перейдите на страницу регистрации, чтобы создать учётную запись, заполнив необходимые данные. Для этого нажмите "Register Now" («Зарегистрироваться»).
Шаг 3: После регистрации используйте свой адрес электронной почты и пароль для входа на страницу входа.
Следующий шаг — генерация ключа API.
Генерация ключа API

Шаг 4: После входа в систему нажмите "My Account" («Моя учетная запись») в правом верхнем углу.
Шаг 5: Вы будете перенаправлены на страницу, где сможете сгенерировать ключ API. Введите текст капчи в соответствующее поле и нажмите кнопку "Generate API Key" («Сгенерировать ключ API)» .
Шаг 6: Если капча верна, вы увидите таблицу с вашим API-ключом , сроком его действия и количеством использований. Нажмите на значок копирования рядом с API-ключом, и ваш ключ мгновенно скопируется в буфер обмена.
В настоящее время существует ограничение на количество использований одного ключа для SMS и API ANPR, а также на 10 000 точек данных для GPS-отслеживания. По достижении этого лимита вы можете сгенерировать другой ключ, который обеспечит ещё 100 использований.
Это ограничение использования введено для предотвращения перегрузки сервера.
Теперь мы готовы перейти к аппаратному обеспечению.
Схема GPS-трекера на ESP32
Принципиальная схема достаточно проста в понимании, так как содержит всего несколько соединений. Полная схема для сборки GPS-трекера на базе ESP32 представлена ниже.
ESP32 питается через USB-порт, а GPS-модуль получает стабильное напряжение 3,3 В от ESP32. Связь между двумя модулями осуществляется через UART, где контакт TX (передача) GPS-модуля подключается к контакту RX (IO16) ESP32, а контакт RX (приём) GPS — к контакту TX (IO17) ESP32. Если вам нужна дополнительная информация, ознакомьтесь с нашей статьей о том, как использовать GPS-модуль NEO-6M с ESP32.
![]()
Собранная на макетной плате конструкция проекта показана на следующем рисунке.
![]()
При сборке компонентов внимательно проверяйте правильность соединений между компонентами и макетной платой, так как неправильные соединения могут привести к необнаруженным проблемам.
Объяснение кода программы
Полный код программы приведен в конце статьи, здесь же мы кратко расмотрим его основные аспекты.
Благодаря официальной библиотеке Arduino GeoLinker, программирование стало проще благодаря функциям, присутствующим в ней. Итак, приступим к объяснению.
1. Подключение библиотеки
|
1 |
#include <GeoLinker.h> |
Назначение: основная библиотека для GPS-отслеживания и подключения к облаку.
Функциональность:
- Выполняет анализ данных GPS (протокол NMEA)
- Управляет сетевым взаимодействием (Wi-Fi/GSM)
- Обеспечивает интеграцию облачных сервисов
- Обеспечивает автономное хранение данных
- Управляет автоматическим переподключением
Ссылка на репозиторий: https://github.com/Circuit-Digest/GeoLinker
2. Конфигурация GPS
|
1 2 3 4 |
HardwareSerial gpsSerial(1); #define GPS_RX 16 #define GPS_TX 17 #define GPS_BAUD 9600 |
Связь с модулем GPS устанавливается через аппаратный последовательный интерфейс с использованием HardwareSerial gpsSerial(1), который создает экземпляр класса для работы с последовательгым портом с использованием UART1.
Физические соединения определяются следующим образом: GPIO16 выполняет функцию контакта RX для приема данных от модуля GPS, а GPIO17 функционирует как контакт TX для отправки данных на модуль GPS.
Связь осуществляется со стандартной скоростью 9600 бод, что является типичной скоростью для модулей NMEA GPS. Аппаратный последовательный порт был выбран специально, а не программный, поскольку он обеспечивает гораздо более надёжную связь для непрерывной потоковой передачи данных GPS, гарантируя отсутствие потери критически важных данных о местоположении во время передачи.
3. Конфигурация Wi-Fi
|
1 2 |
const char* ssid = "yourSSID"; const char* password = "yourPASSWORD"; |
Сетевое подключение устанавливается с помощью двух простых переменных конфигурации: SSID и пароль . Эти строковые константы следует заменить на ваши реальные учётные данные сети Wi-Fi, чтобы GPS-трекер мог подключиться к Интернету.
4. Переменные конфигурации GeoLinker
API-аутентификация
|
1 2 |
const char* apiKey = "xxxxxxxxxxxx"; const char* deviceID = "ESP-32_Tracker"; |
Объяснение: API-ключ, который аутентифицирует ваше устройство с помощью облачного сервиса GeoLinker.
Идентификатор устройства: уникальный идентификатор, позволяющий отличить этот трекер от других.
Настройки передачи данных
|
1 2 3 |
const uint16_t updateInterval = 5; const bool enableOfflineStorage = true; const uint8_t offlineBufferLimit = 20; |
-
updateInterval: как часто данные GPS отправляются в облако (5 секунд);
-
enableOfflineStorage: логический флаг для автономной буферизации данных;
-
offlineBufferLimit: максимальное количество сохраняемых записей в автономном режиме (управление памятью). При достижении лимита старые данные будут заменены новыми. Другими словами, в памяти будут сохранены самые последние (например, 20) данные.
Управление подключением
|
1 2 3 |
const bool enableAutoReconnect = true; const int8_t timeOffsetHours = 5; const int8_t timeOffsetMinutes = 30; |
Автоматическое переподключение: автоматически пытается повторно подключиться к сети Wi-Fi в случае отключения.
Смещение часового пояса: корректирует временные метки в соответствии с местным временем (пример: IST = UTC+5:30).
Экземпляр класса GeoLinker
|
1 |
GeoLinker geo; |
Основные операции отслеживания выполняются через единый геообъект GeoLinker, который служит основным интерфейсом для всех функций GPS-отслеживания, обработки данных и облачной связи.
5. Объяснение функции setup()
Инициализация последовательной связи
|
1 2 3 |
Serial.begin(115200); delay(1000); gpsSerial.begin(GPS_BAUD, SERIAL_8N1, GPS_RX, GPS_TX); |
-
Отладочный последовательный порт: 115200 бод для быстрого отладочного вывода.
-
Задержка: обеспечивает стабилизацию последовательного порта.
-
Последовательный порт GPS: настраивает пользовательские контакты в формате 8N1 (8 бит данных, без контроля четности, 1 стоповый бит).
Последовательность конфигурации GeoLinker
|
1 2 3 4 5 |
geo.begin(gpsSerial); geo.setApiKey(apiKey); geo.setDeviceID(deviceID); geo.setUpdateInterval_seconds(updateInterval); geo.setDebugLevel(DEBUG_BASIC); |
-
Инициализация: связывает последовательный интерфейс GPS с GeoLinker.
-
Аутентификация: настраивает доступ к облачному сервису.
-
Идентификация устройства: устанавливает уникальное отслеживание устройства.
-
Время: контролирует частоту отправки данных.
-
Отладка: устанавливает уровень вывода информации.
Расширенные настройки
|
1 2 3 4 |
geo.enableOfflineStorage(enableOfflineStorage); geo.enableAutoReconnect(enableAutoReconnect); geo.setOfflineBufferLimit(offlineBufferLimit); geo.setTimeOffset(timeOffsetHours, timeOffsetMinutes);м |
-
Автономное хранилище: сохраняет данные, когда сеть недоступна.
-
Автоматическое переподключение: автоматическая обработка разрывов соединения.
-
Ограничение буфера: предотвращает переполнение памяти на небольших микроконтроллерах.
-
Часовой пояс: обеспечивает точность местных временных меток.
Сетевое подключение
|
1 2 3 4 5 |
geo.setNetworkMode(GEOLINKER_WIFI); geo.setWiFiCredentials(ssid, password); if (!geo.connectToWiFi()) { Serial.println("WiFi connection failed!"); } |
-
setNetworkMode: выбирает Wi-Fi вместо GSM/сотовой связи.
-
setWiFiCredentials: предоставляет информацию о доступе к сети.
-
Подключение: попытки первоначального подключения к WiFi и сообщения в случае сбоев подключения.
6. Объяснение функции loop()
Основной цикл обработки
|
1 |
uint8_t status = geo.loop(); |
Сердцем системы GPS-слежения является функция geo.loop(), которая выполняет комплексный цикл обработки на каждой итерации. Эта функция непрерывно считывает предложения NMEA из GPS-модуля, анализируя необработанные данные для извлечения координат, информации о временных метках и показателей качества спутникового сигнала.
Система проверяет качество GPS-координат для обеспечения точности определения местоположения перед передачей данных. Сетевое подключение постоянно отслеживается для поддержания надёжной связи с облачным сервисом.
При наличии подключения данные о местоположении передаются в облачный сервис в режиме реального времени. При сбоях в сети система автономного управления сохраняет данные локально для последующей передачи. На протяжении всех операций комплексные механизмы восстановления после ошибок обрабатывают различные сценарии сбоев для поддержания надежности системы.
Обработка кода статуса
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
if (status > 0) { Serial.print("[STATUS] GeoLinker Operation: "); // Interpret status codes and provide user feedback switch(status) { case STATUS_SENT: Serial.println("✓ Data transmitted successfully to cloud!"); break; case STATUS_GPS_ERROR: Serial.println("✗ GPS module connection error - Check wiring!"); break; case STATUS_NETWORK_ERROR: Serial.println("⚠ Network connectivity issue - Data buffered offline"); break; case STATUS_BAD_REQUEST_ERROR: Serial.println("✗ Server rejected request - Check API key and data format"); break; case STATUS_PARSE_ERROR: Serial.println("✗ GPS data parsing error - Invalid NMEA format"); break; case STATUS_INTERNAL_SERVER_ERROR: Serial.println("✗ GeoLinker server internal error - Try again later"); break; default: Serial.print("? Unknown status code: "); Serial.println(status); break; } } |
Коды успеха
-
STATUS_SENT: данные успешно переданы в облако.
Ошибки, связанные с GPS
-
STATUS_GPS_ERROR: ошибка связи с GPS-модулем.
-
STATUS_PARSE_ERROR: неверный формат данных NMEA.
Ошибки, связанные с сетью
-
STATUS_NETWORK_ERROR: проблемы с подключением к Wi-Fi/интернету.
-
STATUS_BAD_REQUEST_ERROR: сервер отклонил данные (аутентификация/формат).
-
STATUS_INTERNAL_SERVER_ERROR: проблемы с облачным сервисом.
На этом объяснение кода завершено. Полный код доступен в конце статьи. Теперь осталось только загрузить его в ESP32, и волшебство свершится.
Тестирование работы проекта
После успешной загрузки кода система должна начать работать. В этом проекте идея проста.
Данные GPS собираются и отправляются на сервер. При отсутствии интернета данные сохраняются локально и загружаются после восстановления соединения.
Именно это мы и проверили во время нашего испытания.
Для подключения к сети я использовал мобильную точку доступа. После того, как я подключил систему через USB-порт компьютера, я включил точку доступа Wi-Fi на мобильном устройстве, и ESP32 мгновенно подключился.

Убедившись, что всё работает нормально, мы отправились в короткий путь из офиса. На карте было замечено небольшое движение.
Для тестирования система была настроена на отправку данных каждые 2 секунды.
Примечание: для реального использования идеальная задержка составляет от 15 до 60 секунд.
![]()
Когда всё заработало как надо, мы решили протестировать функцию автономного хранения. Для этого я отключил мобильную точку доступа на 1 минуту, принудительно переведя устройство в автономный режим.

В период офлайн данные сохранялись в буфере без каких-либо потерь.

После восстановления интернета буферизованные точки данных были мгновенно загружены одна за другой, и система вернулась в онлайн-режим.
Через 20 минут мы завершили тест и вернулись в офис.
![]()
Мы успешно продемонстрировали и проверили работу GPS-трекера и его применение.
Благодаря будущим обновлениям GeoLinker его использование в качестве универсальной платформы для построения и маршрутизации GPS станет еще более удобным.
Исходный код программы
Исходный код данного проекта можно также скачать с репозитория GitHub
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
/* * =============================================================== * GEOLINKER GPS TRACKER * =============================================================== * * FEATURES: * - Real-time GPS tracking with NMEA data parsing * - WiFi connectivity for data transmission * - Offline data storage with configurable buffer limits * - Automatic reconnection capabilities * - Timezone offset configuration * - Multiple debug levels for troubleshooting * - Status monitoring with detailed error codes * - Configurable update intervals * * WORKING: * 1. Initializes GPS module on Serial1 with custom RX/TX pins * 2. Connects to WiFi network using provided credentials * 3. Continuously reads GPS data in main loop * 4. Processes and validates GPS coordinates * 5. Transmits location data to GeoLinker cloud service * 6. Stores data offline when network is unavailable * 7. Provides real-time status feedback via serial monitor * * HARDWARE REQUIREMENTS: * - ESP32 development board * - GPS module (NMEA compatible) * - WiFi network access * * PIN CONNECTIONS: * - GPS RX: GPIO16 * - GPS TX: GPIO17 * * CREDITS: * - GeoLinker Library: GPS tracking and cloud connectivity * - ESP32 Arduino Core: Hardware abstraction layer * - NMEA GPS Protocol: Location data standardization * * Author: CircuitDigest/Rithik_Krisna_M * Version: 1.0 * Last Modified: 28/06/2025 * * =============================================================== */ #include <GeoLinker.h> // ================================================================== // HARDWARE CONFIGURATION // ================================================================== // GPS Serial Communication Setup HardwareSerial gpsSerial(1); // Using Serial1 for GPS communication #define GPS_RX 16 // GPIO16 connected to GPS module TX pin #define GPS_TX 17 // GPIO17 connected to GPS module RX pin // GPS Communication Settings #define GPS_BAUD 9600 // Standard NMEA GPS baud rate (9600 bps) // ================================================================== // NETWORK CONFIGURATION // ================================================================== // WiFi Network Credentials const char* ssid = "yourSSID"; // Your WiFi network name (SSID) const char* password = "yourPassword"; // Your WiFi network password // ================================================================== // GEOLINKER CONFIGURATION // ================================================================== // API Authentication const char* apiKey = "xxxxxxxxxxxx"; // Your unique GeoLinker API key const char* deviceID = "ESP-32_Tracker"; // Unique identifier for this device // Data Transmission Settings const uint16_t updateInterval = 2; // How often to send data (seconds) const bool enableOfflineStorage = true; // Store data when offline const uint8_t offlineBufferLimit = 20; // Maximum offline records to store // Keep minimal for MCUs with limited RAM // Connection Management const bool enableAutoReconnect = true; // Automatically reconnect to WiFi // Note: Only applies to WiFi, ignored with GSM // Timezone Configuration const int8_t timeOffsetHours = 5; // Timezone hours offset from UTC const int8_t timeOffsetMinutes = 30; // Timezone minutes offset from UTC // Example: IST = UTC+5:30 // Create GeoLinker instance GeoLinker geo; // ================================================================== // INITIALIZATION SETUP // ================================================================== void setup() { // Initialize serial communication for debugging Serial.begin(115200); delay(1000); // Allow serial to initialize Serial.println("Starting GeoLinker GPS Tracker..."); // Initialize GPS serial communication with custom pins gpsSerial.begin(GPS_BAUD, SERIAL_8N1, GPS_RX, GPS_TX); Serial.println("GPS Serial initialized on pins 16(RX) and 17(TX)"); // ================================================================== // GEOLINKER LIBRARY SETUP // ================================================================== // Initialize GeoLinker with GPS serial interface geo.begin(gpsSerial); Serial.println("GeoLinker library initialized"); // Configure API authentication geo.setApiKey(apiKey); Serial.println("API key configured"); // Set unique device identifier geo.setDeviceID(deviceID); Serial.println("Device ID set"); // Configure data transmission interval geo.setUpdateInterval_seconds(updateInterval); Serial.print("Update interval set to "); Serial.print(updateInterval); Serial.println(" seconds"); // Set debug verbosity level // Options: DEBUG_NONE, DEBUG_BASIC, DEBUG_VERBOSE geo.setDebugLevel(DEBUG_BASIC); Serial.println("Debug level set to BASIC"); // Enable offline data storage capability geo.enableOfflineStorage(enableOfflineStorage); if(enableOfflineStorage) { Serial.println("Offline storage enabled"); } // Enable automatic WiFi reconnection geo.enableAutoReconnect(enableAutoReconnect); if(enableAutoReconnect) { Serial.println("Auto-reconnect enabled"); } // Set maximum offline buffer size (important for memory management) geo.setOfflineBufferLimit(offlineBufferLimit); Serial.print("Offline buffer limit set to "); Serial.print(offlineBufferLimit); Serial.println(" records"); // Configure timezone offset for accurate timestamps geo.setTimeOffset(timeOffsetHours, timeOffsetMinutes); Serial.print("Timezone offset set to UTC+"); Serial.print(timeOffsetHours); Serial.print(":"); Serial.println(timeOffsetMinutes); // ================================================================== // NETWORK CONNECTION SETUP // ================================================================== // Configure for WiFi mode (alternative: GEOLINKER_GSM for cellular) geo.setNetworkMode(GEOLINKER_WIFI); Serial.println("Network mode set to WiFi"); // Set WiFi network credentials geo.setWiFiCredentials(ssid, password); Serial.println("WiFi credentials configured"); // Attempt WiFi connection Serial.print("Connecting to WiFi network: "); Serial.println(ssid); if (!geo.connectToWiFi()) { Serial.println("ERROR: WiFi connection failed!"); Serial.println("Device will continue with offline storage mode"); } else { Serial.println("WiFi connected successfully!"); } Serial.println("\n" + String("=").substring(0,50)); Serial.println("GeoLinker GPS Tracker setup complete!"); Serial.println("Starting main tracking loop..."); Serial.println(String("=").substring(0,50) + "\n"); } // ================================================================== // MAIN PROGRAM LOOP // ================================================================== void loop() { // ========================================== // GEOLINKER MAIN OPERATION // ========================================== // Execute main GeoLinker processing cycle // This function handles: // - GPS data reading and parsing // - Network connectivity checking // - Data transmission to cloud service // - Offline storage management // - Error handling and recovery uint8_t status = geo.loop(); // Process and display status information if (status > 0) { Serial.print("[STATUS] GeoLinker Operation: "); // Interpret status codes and provide user feedback switch(status) { case STATUS_SENT: Serial.println("✓ Data transmitted successfully to cloud!"); break; case STATUS_GPS_ERROR: Serial.println("✗ GPS module connection error - Check wiring!"); break; case STATUS_NETWORK_ERROR: Serial.println("⚠ Network connectivity issue - Data buffered offline"); break; case STATUS_BAD_REQUEST_ERROR: Serial.println("✗ Server rejected request - Check API key and data format"); break; case STATUS_PARSE_ERROR: Serial.println("✗ GPS data parsing error - Invalid NMEA format"); break; case STATUS_INTERNAL_SERVER_ERROR: Serial.println("✗ GeoLinker server internal error - Try again later"); break; default: Serial.print("? Unknown status code: "); Serial.println(status); break; } } // Small delay to prevent overwhelming the serial output // The actual timing is controlled by GeoLinker's internal mechanisms delay(100); } |


