用ESP32打造一台能实时上报位置的GPS追踪器

如果你想做一个不依赖Wi-Fi,能实时把位置信息上传到服务器的 DIY 设备,可以试试这个项目。它结合了 ESP32 + SIM800L GSM 模块 + NEO-6M GPS,能在移动场景下持续获取坐标,并通过移动网络上传,实现一个可部署、可移动、可扩展的简易 GPS 追踪器。

ESP32 GPS追踪器,配备SIM800L和NEO-6M


项目功能概览



✔ 获取实时 GPS 定位

NEO-6M 模块负责定位,输出经纬度、卫星状态、信号质量等。

✔ 使用 SIM800L 通过 HTTP 上传数据

设备会把采集到的位置数据周期性上传到服务器,SIM800L 负责移动网络连接,并通过简单的 HTTP 请求上报信息。

✔ 自动运行

上电后会自动开始定位 → 获取数据 → 通过网络发送。

硬件组成



  • ESP32 开发板

  • SIM800L GSM 模块

  • NEO-6M GPS 模块(带天线)

  • 2个LED灯

  • 2个470Ω电阻

  • 面包板

  • 若干杜邦线

  • SIM卡一张

  • 一个 5V 电源(根据搭建方式可由 USB 或独立供电)

SIM800L 需稳定供电,否则容易因瞬时电流不足而重启或无法注册网络。


系统如何工作



项目的整体逻辑非常直接:

  1. NEO-6M 获取 GPS 数据
    ESP32 通过串口读取 NMEA 字符串,再从中提取 lat、lng、speed 等字段。

  2. ESP32 构建 HTTP GET 请求
    作者在代码中将 GPS 数据拼接为 URL 参数。

  3. SIM800L 通过 GPRS 将数据传到服务器
    通过 AT 指令:

    • 激活 GPRS

    • 配置 APN

    • 打开 TCP 连接

    • 发送 HTTP 请求

  4. PHP 接收并写入 MySQL
    服务器端脚本将纬度、经度、IMEI、时间等字段写入数据库。

  5. 网页端调用 Google Maps API 显示位置点
    页面会从数据库读取最新坐标并在地图上展示。


电路连接方式



作者给出了明确的连接结构:

ESP32 → SIM800L

  • TX 与 RX 交叉连接

  • 供电通过外部稳定电源(SIM800L 对电流较敏感)

ESP32 → NEO-6M GPS

  • GPS 的 TX → ESP32 的 RX

  • GPS 的 GND 与系统共地

  • GPS 的 VCC 接 3.3V


软件与代码介绍



作者给出的程序使用 Arduino IDE,可以快速编译上传。功能模块包括:

1. 初始化 GSM & GPS

程序先启动 SIM800L,随后启动 GPS 模块。

2. 从 GPS 读取数据

代码循环读取串口输出,解析 NMEA 字符串获得经纬度。

3. 通过 SIM800L 执行 HTTP 请求

程序构建 HTTP 包,将位置上传到指定服务器。

4. 循环执行

持续采集 → 上传 → 等待下一次周期。

#include <GeoLinker.h>// GPS ConfigurationHardwareSerial gpsSerial(1);#define GPS_RX 16        #define GPS_TX 17            #define GPS_BAUD 9600// GSM ConfigurationHardwareSerial gsmSerial(2);#define GSM_RX 18        #define GSM_TX 19            #define GSM_BAUD 9600#define GSM_PWR_PIN -1#define GSM_RST_PIN -1// Network credentialsconst char* apn = "yourAPN";  // Replace with your carrier's APNconst char* gsmUser = nullptr;const char* gsmPass = nullptr;// GeoLinker settingsconst char* apiKey = "xxxxxxxxxxxx";  // Replace with your API keyconst char* deviceID = "ESP32_Sim800l";const uint16_t updateInterval = 30;const bool enableOfflineStorage = true;const uint8_t offlineBufferLimit = 20;const bool enableAutoReconnect = true;const int8_t timeOffsetHours = 5;const int8_t timeOffsetMinutes = 30;// LED pinsconst int DataSent_LED = 32;const int GPSFix_LED = 23;GeoLinker geo;void setup() {  Serial.begin(115200);  gpsSerial.begin(GPS_BAUD, SERIAL_8N1, GPS_RX, GPS_TX);  gsmSerial.begin(GSM_BAUD, SERIAL_8N1, GSM_RX, GSM_TX);  pinMode(DataSent_LED, OUTPUT);  pinMode(GPSFix_LED, OUTPUT);  geo.begin(gpsSerial);  geo.setApiKey(apiKey);  geo.setDeviceID(deviceID);  geo.setUpdateInterval_seconds(updateInterval);  geo.setDebugLevel(DEBUG_BASIC);  geo.enableOfflineStorage(enableOfflineStorage);  geo.enableAutoReconnect(enableAutoReconnect);  geo.setOfflineBufferLimit(offlineBufferLimit);  geo.setTimeOffset(timeOffsetHours, timeOffsetMinutes);  geo.setNetworkMode(GEOLINKER_CELLULAR);  geo.setModemCredentials(apn, gsmUser, gsmPass);  geo.beginModem(gsmSerial, GSM_PWR_PIN, GSM_RST_PIN, true);  geo.setModemTimeouts(5000, 15000);}void loop() {  uint8_t status = geo.loop();  switch (status) {    case STATUS_SENT:      Serial.println("Data sent successfully!");      break;    case STATUS_GPS_ERROR:      Serial.println("GPS connection error!");      break;    case STATUS_NETWORK_ERROR:      Serial.println("Network error (buffered).");      break;    case STATUS_BAD_REQUEST_ERROR:      Serial.println("Bad request error!");      break;    case STATUS_PARSE_ERROR:      Serial.println("GPS data format error!");      break;    case STATUS_CELLULAR_NOT_REGISTERED:      Serial.println("GSM: Not registered to network!");      break;  }  if ((status != STATUS_GPS_ERROR) && (status != STATUS_PARSE_ERROR)) {    digitalWrite(GPSFix_LED, HIGH);  } else {    digitalWrite(GPSFix_LED, LOW);  }  if (status == STATUS_SENT) {    digitalWrite(DataSent_LED, HIGH);    delay(1000);    digitalWrite(DataSent_LED, LOW);  }}


项目实测



状态指示:

SIM800L NETLIGHT 指示灯状态:

  • 每 1 秒闪一次: 模块已启动,但尚未连接到网络

  • 每 2 秒闪一次: GPRS 数据连接已激活

  • 每 3 秒闪一次: 已成功连接到蜂窝网络

  • 快速闪烁: 正在进行数据传输

NEO-6M GPS 指示灯:

  • 常灭: 尚未获得卫星定位

  • 开始闪烁: 已成功定位(GPS fix)


作者在项目里展示了多张实测结果,包括:

  • GPS 获取到正确经纬度

  • SIM800L 成功发送 HTTP 数据

  • 谷歌地图上正确出现定位点

  • 数据库成功写入上传记录

查看您的跟踪数据


可扩展方向



虽然原文没有加入额外功能,但从其结构可以看出非常适合扩展:

  • 记录更多 GPS 字段(速度、卫星数)

  • 增加设备状态上报

  • Web 端加入历史轨迹折线

  • 增加电池与低功耗逻辑

  • 加入地理围栏报警(服务器端扩展即可)


这个项目提供了一个非常清晰的参考:
用最简单的组合模块,就能做出一个可用的实时定位设备。它不依赖复杂服务器,不需要大型框架,也没有多余功能。如果你想入手“GPS + GSM + IoT”领域,可以尝试下这个入门项目。

注:以上内容经AI总结生成,欢迎点击“阅读原文”自己复刻。

点击阅读原文查看原项目

发表评论