ESP32를 사용하여 간단한 GPS 추적기를 만드는 방법 및 지도에 데이터 시각화

ESP32와 GeoLinker를 사용한 GPS 추적기
ESP32를 사용하는 이 GPS 추적기는 특히 전자공학과 소프트웨어 개발에 관심 있는 초보자들에게 흥미로운 프로젝트가 될 것입니다. 우리 주변의 모든 것을 추적하고 싶어 하는 어린 시절의 호기심을 현실로 만들어 주는 프로젝트입니다. 하드웨어 설정은 비교적 간단하지만, 진짜 어려운 점은 소프트웨어입니다. 하지만 GeoLinker API 덕분에 소프트웨어는 더 이상 걱정할 필요가 없습니다 .
Circuit Digest Cloud 에서 GeoLinker 라는 사용하기 쉬운 무료 API를 출시했습니다 . 이 API를 사용하면 기기에서 서버로 전송된 위치 데이터를 표시하고 라우팅할 수 있어 위치를 손쉽게 시각화하고 추적할 수 있습니다.
이 튜토리얼에서는 ESP32를 탑재한 Neo-6M GPS 모듈을 사용하여 GPS 추적기를 만들어 보겠습니다. 하드웨어 설정과 GeoLinker를 소프트웨어 구성 요소로 사용하는 방법을 다룹니다. 자, 이제 본격적으로 시작해 볼까요! SIM800L과 Neo-6M을 사용한 Arduino GPS 추적기 , Raspberry Pi Pico GPS 추적기 등 다른 GPS 추적기 프로젝트도 살펴보세요. ESP32를 사용하여 여러분이 좋아할 만한 다른 프로젝트도 많이 만들어 봤습니다 .
ESP32 및 GeoLinker API를 사용한 GPS 추적기 - 빠른 개요
- 제작 시간: 3-5시간 | 비용: $20-30 | 난이도: 초급-중급
- 학습 내용: ESP32 프로그래밍, Neo-6M GPS 모듈, GeoLinker API, UART 통신
- 응용 분야: 차량 추적, 개인 위치 모니터링, 자산 관리, 경로 시각화
목차
필요한 구성 요소
GeoLinker 설정
회로도
아두이노 코드
데모 및 테스트
GitHub 저장소
ESP32 GPS 추적기는 어떻게 작동하나요?
이 프로젝트에서는 ESP32용 GPS 모듈과 클라우드 연결을 결합한 간단한 GPS 추적기를 구축하여 하드웨어 및 소프트웨어 레벨 모두에서 구현을 더욱 쉽게 만들 것입니다. 하드웨어 측면에서는 잘 알려진 ESP32 개발 보드 와 Neo-6M GPS 모듈을 사용할 것입니다. 소프트웨어 측면에서는 Circuit Digest Cloud 에서 개발한 GeoLinker API를 활용할 것입니다 .

ESP32 GPS 모듈 데이터 전송 아키텍처는 Neo-6M GPS 모듈이 ESP32 마이크로컨트롤러에 연결되어 GeoLinker 클라우드 API와 통신하여 실시간 위치 추적 및 시각화를 수행하는 모습을 보여줍니다.
ESP32를 사용하여 Neo-6M GPS 모듈에서 GPS 데이터를 가져와 간단한 HTTP 요청을 통해 지도 작성 및 경로 설정 API로 전송합니다. 각 데이터 포인트는 데이터베이스에 추가됩니다. Circuit Digest 클라우드 계정에 로그인하면 경로 추적과 함께 실시간으로 작성된 데이터를 확인할 수 있습니다.
이 프로젝트에 구현된 추가 기능은 온라인/오프라인 데이터 처리입니다. 구체적으로, 인터넷 연결이 끊어지면 데이터는 로컬 변수 에 저장됩니다 . 연결이 복구되면 저장된 데이터가 먼저 서버에 푸시되고, 그 후 새로 가져온 데이터가 푸시됩니다. 이는 특히 인터넷 연결이 불안정한 지역에서 매우 흥미롭고 유용한 기능입니다.
이제 이 프로젝트에 필요한 구성 요소를 살펴보겠습니다.
필요한 구성 요소
이 프로젝트에는 최소한의 구성 요소만 필요합니다. 하지만 사용하기 전에 각 구성 요소의 기능을 확인하는 것이 중요합니다. 항상 그렇듯이, 예산과 창의성에 따라 구성 요소를 자유롭게 선택하실 수 있으며, 맞춤 설정에는 제한이 없습니다. 아래는 esp32를 사용하여 GPS 추적기를 제작하는 데 사용한 구성 요소입니다 .
- ESP32 개발 보드 - 1
- LED - 2개
- 1K 저항기 - 2
- 브레드보드 - 1
- Neo-6M GPS 모듈 - 1
- 전선 연결 - 필요에 따라
Neo-6M GPS 모듈을 선택할 특별한 이유는 없습니다. 비용 효율성 외에는 없습니다. 저처럼 Neo-6M을 사용하고 있고 GPS 모듈이 작동하지 않는다면 링크된 문제 해결 관련 글을 확인해 보세요. 다른 ESP32용 GPS 모듈을 사용하여 이 프로젝트를 완료할 수도 있습니다. 이론은 잠시 접어두고, 소프트웨어부터 시작하여 실제 프로젝트로 넘어가 보겠습니다.
NEO-6M GPS 모듈 GY-GPS6MV2 구매 - 디바이스마트
GPS 추적기를 위한 GeoLinker 설정
대부분의 CircuitDigest Cloud API와 마찬가지로 GeoLinker도 권한 부여를 위해 API 키가 필요합니다. 무료 API 키를 받으려면 아래 단계를 따르세요.
CircuitDigest Cloud를 처음 사용하시는 경우 아래 단계에 따라 새 계정을 등록해야 합니다 .
Circuit Digest Cloud에 새 계정 등록

Circuit Digest Cloud 계정 생성을 위한 등록 및 로그인 옵션을 보여주는 ESP32 GPS 추적기용 GeoLinker 로그인 인터페이스
1단계: Circuit Digest.Cloud 홈페이지를 방문하세요 . 오른쪽 상단에 있는 " 로그인 " 버튼을 클릭하면 로그인 페이지로 이동합니다.
2단계: 이미 계정이 있는 경우, 기존 계정 정보를 사용하여 로그인하세요. 계정이 없는 경우, 등록 페이지로 이동하여 필요한 정보를 입력하여 계정을 생성하세요. 완료되면 " 지금 등록 "을 클릭하여 가입하세요.
3단계: 등록 후 이메일 ID 와 비밀번호를 사용하여 로그인 페이지에 로그인하세요.
다음 단계는 API 키를 생성하는 것입니다.
API 키 생성

ESP32 GPS 추적기 인증을 위한 캡차 검증 및 키 생성 프로세스를 보여주는 GeoLinker API 키 생성 인터페이스
4단계: 로그인 후 오른쪽 상단에 있는 " 내 계정 "을 클릭하세요.
5단계: API 키를 생성할 수 있는 페이지로 이동합니다. 제공된 상자에 캡차를 입력하고 "API 키 생성" 버튼을 클릭하세요.
6단계: 캡차가 정확하면 API 키 와 만료일 , 사용 횟수가 표시된 표가 나타납니다. API 키 옆에 있는 복사 아이콘을 누르면 키가 클립보드에 즉시 복사됩니다.
현재 SMS 및 ANPR API 의 경우 키당 사용 횟수는 100회로 제한 되며 , GPS 추적 의 경우 데이터 포인트는 10,000개로 제한됩니다 . 이 제한에 도달하면 100회 사용 가능한 추가 키를 생성할 수 있습니다.
이러한 사용 제한은 서버 과부하를 방지하기 위해 적용됩니다.
이제 하드웨어로 넘어갈 준비가 되었습니다.
ESP32 GPS 추적기 회로도
회로도는 연결 부분이 몇 개뿐이어서 설명이 필요 없을 정도로 명확하여 이해하기 쉽습니다. ESP32를 사용하여 GPS 추적기를 만드는 전체 회로도는 아래와 같습니다.
ESP32는 USB 포트를 통해 전원을 공급받고, GPS 모듈은 ESP32로부터 안정적인 3.3V 전원을 공급받습니다. 두 모듈 간의 통신은 UART를 통해 이루어지며, GPS 모듈의 TX(송신) 핀은 ESP32의 RX(IO16)에 연결되고 GPS RX(수신) 핀은 ESP32의 TX(IO17)에 연결됩니다. 더 자세한 정보가 필요하시면 ESP32와 함께 NEO-6M GPS 모듈을 사용하는 방법에 대한 글을 참고하시기 바랍니다.

Neo-6M GPS 모듈 연결, LED 표시기 및 위치 추적 시스템을 위한 브레드보드 배선 레이아웃을 보여주는 완전한 ESP32 GPS 추적기 회로도
이것으로 회로 연결이 완료되었습니다. 아래에서 하드웨어 구성 요소의 조립 과정을 보실 수 있습니다.

LED 표시기 및 점퍼 와이어가 있는 브레드보드의 ESP32 개발 보드에 연결된 Neo-6M GPS 모듈을 보여주는 ESP32 GPS 추적기 하드웨어의 물리적 조립
구성 요소를 조립할 때 구성 요소와 브레드보드 사이의 연결이 적절한지 주의 깊게 확인하세요. 배선이 부적절하면 알 수 없는 문제가 발생할 수 있습니다.
다음으로 코딩 부분으로 넘어가겠습니다.
아두이노 코드
코딩 부분은 간단하고 직관적입니다. 따로 신경 써야 할 부분이 많지 않습니다.
새로 출시된 GeoLinker 공식 아두이노 라이브러리 덕분에 필요한 모든 기능을 활용하여 코딩이 더욱 쉬워졌습니다. 자, 이제 설명을 시작해 보겠습니다.
1. 라이브러리 및 종속성
#include <GeoLinker.h>
목적: GPS 추적 및 클라우드 연결을 위한 주요 라이브러리
기능:
- GPS 데이터 파싱(NMEA 프로토콜)을 처리합니다.
- 네트워크 통신(WiFi/GSM)을 관리합니다.
- 클라우드 서비스 통합을 제공합니다
- 오프라인 데이터 저장을 처리합니다
- 자동 재연결을 관리합니다
저장소 링크: https://github.com/Circuit-Digest/GeoLinker
2. GPS 설정
HardwareSerial gpsSerial(1);
#define GPS_RX 16
#define GPS_TX 17
#define GPS_BAUD 9600
GPS 모듈 통신은 UART1을 사용하여 안정적인 직렬 인스턴스를 생성하는 HardwareSerial gpsSerial(1)을 사용하는 하드웨어 직렬 인터페이스를 통해 설정됩니다.
물리적 연결은 GPIO16이 GPS 모듈에서 데이터를 수신하는 RX 핀 역할을 하고, GPIO17이 GPS 모듈로 데이터를 전송하는 TX 핀 역할을 하도록 정의됩니다.
통신은 NMEA GPS 모듈의 일반적인 속도인 9600의 표준 전송 속도로 작동합니다. 하드웨어 직렬 방식은 소프트웨어 직렬 방식보다 지속적인 GPS 데이터 스트리밍을 위한 훨씬 더 안정적인 통신을 제공하고, 전송 중 중요한 위치 데이터가 손실되지 않도록 특별히 선택되었습니다.
3. WiFi 구성 변수
const char* ssid = "yourSSID";
const char* password = "yourPASSWORD";
네트워크 연결은 ssid 와 password라는 두 가지 간단한 구성 변수를 통해 설정됩니다 . GPS 추적기의 인터넷 연결을 활성화하려면 이 문자열 상수를 실제 WiFi 네트워크 자격 증명으로 바꿔야 합니다.
4. GeoLinker 구성 변수
API 인증
const char* apiKey = "xxxxxxxxxxxx";
const char* deviceID = "ESP-32_Tracker";
설명:
- API 키: GeoLinker 클라우드 서비스를 통해 장치를 인증합니다.
- 장치 ID : 이 추적기를 다른 추적기와 구별하는 고유 식별자
데이터 전송 설정
const uint16_t updateInterval = 5;
const bool enableOfflineStorage = true;
const uint8_t offlineBufferLimit = 20;
- updateInterval : GPS 데이터가 클라우드로 전송되는 빈도(5초)
- enableOfflineStorage : 오프라인 데이터 버퍼링을 위한 부울 플래그
- offlineBufferLimit : 오프라인 시 저장되는 최대 레코드 수(메모리 관리). 이 제한에 도달하면 이전 데이터는 새 데이터로 대체됩니다. 즉, 최신 데이터(예: 20개)를 메모리에 저장합니다.
연결 관리
const bool enableAutoReconnect = true;
const int8_t timeOffsetHours = 5;
const int8_t timeOffsetMinutes = 30;
자동 재연결: 연결이 끊어지면 자동으로 WiFi 재연결을 시도합니다.
시간대 오프셋: 타임스탬프를 현지 시간으로 조정합니다(예: IST = UTC+5:30)
GeoLinker 인스턴스
GeoLinker geo;
주요 추적 작업은 단일 GeoLinker 지리 객체를 통해 처리되며, 이는 모든 GPS 추적, 데이터 처리 및 클라우드 통신 기능에 대한 기본 인터페이스 역할을 합니다.
5. 설정 기능 설명
직렬 초기화
Serial.begin(115200);
delay(1000);
gpsSerial.begin(GPS_BAUD, SERIAL_8N1, GPS_RX, GPS_TX);
- 디버그 직렬: 빠른 디버깅 출력을 위한 115200보드
- 지연: 직렬 포트가 안정화되도록 보장합니다.
- GPS 직렬: 8N1 형식(8개 데이터 비트, 패리티 없음, 1개 정지 비트)으로 사용자 정의 핀을 구성합니다.
GeoLinker 구성 순서
geo.begin(gpsSerial);
geo.setApiKey(apiKey);
geo.setDeviceID(deviceID);
geo.setUpdateInterval_seconds(updateInterval);
geo.setDebugLevel(DEBUG_BASIC);
- 초기화: GPS 직렬 인터페이스를 GeoLinker에 연결합니다.
- 인증: 클라우드 서비스 액세스를 설정합니다.
- 장치 ID : 고유한 장치 추적을 설정합니다.
- 타이밍: 데이터가 전송되는 빈도를 제어합니다.
- 디버깅: 정보 출력 수준 설정
고급 설정
geo.enableOfflineStorage(enableOfflineStorage);
geo.enableAutoReconnect(enableAutoReconnect);
geo.setOfflineBufferLimit(offlineBufferLimit);
geo.setTimeOffset(timeOffsetHours, timeOffsetMinutes);
- 오프라인 저장: 네트워크를 사용할 수 없을 때 데이터를 저장합니다.
- 자동 재연결: 연결이 끊어지면 자동으로 처리합니다.
- 버퍼 제한: 소형 MCU에서 메모리 오버플로 방지
- 시간대: 정확한 현지 타임스탬프를 보장합니다.
네트워크 연결
geo.setNetworkMode(GEOLINKER_WIFI);
geo.setWiFiCredentials(ssid, password);
if (!geo.connectToWiFi()) {
Serial.println("WiFi connection failed!");
}
- setNetworkMode: GSM/셀룰러 대신 WiFi 선택
- setWiFiCredentials: 네트워크 접속 정보 제공
- Connection: 초기 WiFi 연결 시도 및 연결 실패 시 보고
6. 루프 함수 설명
주요 처리 주기
uint8_t status = geo.loop();
GPS 추적 시스템의 핵심은 geo.loop() 함수를 통해 작동하며, 이 함수는 각 반복마다 포괄적인 처리 사이클을 실행합니다. 이 함수는 GPS 모듈에서 NMEA 문장을 지속적으로 읽고, 원시 데이터를 분석하여 좌표, 타임스탬프 정보, 위성 품질 지표를 추출합니다.
시스템은 데이터 전송을 진행하기 전에 GPS 위치 정확도를 검증하여 위치 정확도를 보장합니다. 클라우드 서비스와의 안정적인 통신을 유지하기 위해 네트워크 연결 상태를 지속적으로 모니터링합니다.
연결이 가능하면 위치 데이터가 실시간으로 클라우드 서비스로 전송됩니다. 네트워크 장애 발생 시 오프라인 관리 시스템은 추후 전송을 위해 데이터를 로컬에 저장합니다. 모든 운영 과정에서 포괄적인 오류 복구 메커니즘을 통해 다양한 장애 시나리오를 처리하여 시스템 안정성을 유지합니다.
상태 코드 처리
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: WiFi/인터넷 연결 문제
- STATUS_BAD_REQUEST_ERROR: 서버가 데이터(인증/형식)를 거부했습니다 .
- STATUS_INTERNAL_SERVER_ERROR: 클라우드 서비스 문제
이것으로 코드 설명이 완료되었습니다. 전체 코드는 이 글의 마지막 부분에서 확인하실 수 있습니다. 이제 남은 작업은 ESP32에 업로드하는 것뿐이며, 마법 같은 일이 일어납니다.
ESP32 GPS 추적기 - 데모 및 테스트
코드를 성공적으로 업로드하면 시스템이 작동을 시작할 것입니다.
이 프로젝트의 아이디어는 간단합니다.
GPS 데이터는 수집되어 서버로 전송됩니다. 인터넷 연결이 불가능한 경우, 데이터는 로컬에 저장되었다가 연결이 복구되면 업로드됩니다.
우리가 시험 기간 동안 테스트한 것이 바로 그것입니다.
네트워크 연결에는 모바일 핫스팟을 사용했습니다 . PC의 USB 포트를 사용하여 시스템에 전원을 공급한 후, 모바일 기기의 Wi-Fi 핫스팟을 켜자 ESP32가 즉시 연결되었습니다.
ESP32 GPS 추적기가 모바일 WiFi 핫스팟에 성공적으로 연결되어 클라우드 서비스로의 실시간 GPS 데이터 전송을 위한 네트워크 연결 상태를 보여줍니다.

모든 것이 제대로 작동하는지 확인한 후, 우리는 사무실에서 출발하여 짧은 여정을 시작했습니다. 지도에서 약간의 움직임이 감지되었습니다.
테스트를 위해 시스템은 2초마다 데이터를 푸시하도록 설정되었습니다.
참고 : 실제 사용 시 15~60초의 지연이 이상적입니다.

Neo-6M GPS 모듈 데이터 전송을 통해 2초마다 맵 인터페이스에 실시간 위치를 표시하는 실시간 ESP32 GPS 추적 데모
모든 것이 순조롭게 진행되자 오프라인 저장 기능을 테스트해 보기로 했습니다.
이를 위해 모바일 핫스팟을 1분 동안 꺼서 기기를 오프라인 모드로 전환했습니다.

인터넷 연결이 불가능할 때 로컬 데이터 버퍼링을 보여주는 ESP32 GPS 추적기 오프라인 모드 데모, 나중에 전송할 GPS 좌표 저장
오프라인 기간 동안 데이터는 손실 없이 버퍼에 저장되었습니다.

ESP32 GPS 추적기 자동 데이터 동기화는 인터넷 연결 복구 후 버퍼링된 GPS 좌표가 클라우드 서비스에 업로드되는 것을 보여줍니다.
인터넷이 복구되자 버퍼링된 데이터 포인트가 차례로 즉시 푸시 되었고 , 시스템은 온라인 모드로 돌아갔습니다.
20분 후, 우리는 시험을 마치고 사무실로 돌아왔습니다.

GeoLinker 맵 인터페이스에서 타임스탬프 데이터가 포함된 전체 경로 추적, 경유지 및 실시간 위치 시각화를 보여주는 완전한 ESP32 GPS 추적기 데모 결과
우리는 GPS 추적기와 그 응용 프로그램의 작동을 성공적으로 시연하고 검증했습니다.
GeoLinker의 향후 업데이트를 통해 이를 일반 GPS 플로팅 및 라우팅 플랫폼 으로 사용하는 것이 더욱 원활해질 것입니다.
코드와 회로가 포함된 GitHub 저장소
ESP32를 사용하는 이 GPS 추적기 프로젝트 의 전체 코드는 이 페이지 하단 에 제공됩니다 . 또한, 아래 링크된 GitHub 저장소에서 소스 코드를 확인하실 수 있습니다.
코드 및 회로도 다운로드 받은 데이터 직접 첨부합니다.
이전에 저희는 다양한 프로젝트에서 GPS 추적기를 사용하여 위치 데이터를 수집하고 시각화해 왔습니다. 이러한 프로젝트에 대해 자세히 알아보려면 아래 링크를 확인하세요.
이 튜토리얼의 원본 문서를 참고하시려면 이 링크를 따라가세요. 튜토리얼 아래에 여러 프로젝트를 확인하세요.
취업, 창업의 막막함, 외주 관리, 제품 부재!
당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약,
아이디어는 있지만 구현할 기술이 없는 막막함.
우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.
이제 고민을 멈추고, 캐어랩을 만나세요!
코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.
제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!
귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.
지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.
귀사가 성공하기까지의 긴 고난의 시간을 캐어랩과 함께 하세요.
캐어랩