




Os sistemas de posicionamento por satélite estão presentes em praticamente todas as áreas da tecnologia moderna. Seja em aplicativos de navegação, sistemas de rastreamento veicular, drones, agricultura de precisão ou dispositivos de Internet das Coisas (IoT), os receptores GPS tornaram-se componentes essenciais para aplicações que dependem da localização geográfica.
Atualmente, diversos módulos GPS de baixo custo estão disponíveis no mercado, permitindo que desenvolvedores integrem funcionalidades de geolocalização em seus projetos utilizando plataformas como Arduino e ESP32. Esses módulos são capazes de fornecer informações bastante precisas, como latitude, longitude, altitude, velocidade, horário UTC e quantidade de satélites utilizados no posicionamento.
Apesar da facilidade de utilização desses dispositivos, grande parte dos exemplos encontrados na internet limita-se a exibir essas informações no Monitor Serial da Arduino IDE. Embora essa abordagem seja suficiente para validar o funcionamento do hardware, ela não oferece uma forma prática de visualizar ou compartilhar os dados obtidos pelo GPS.
Neste artigo desenvolveremos um servidor web utilizando o ESP32 que recebe os dados de um módulo GPS, organiza essas informações em uma página HTML e disponibiliza um botão que abre automaticamente a localização atual no Google Maps.
Além de ser um excelente projeto para aprendizado, essa aplicação pode servir como base para rastreadores, sistemas de telemetria, monitoramento de veículos, embarcações, ativos industriais e inúmeras soluções de Internet das Coisas.
O ESP32 possui um controlador Wi-Fi integrado, permitindo que ele hospede páginas web sem a necessidade de um servidor externo. Isso significa que qualquer dispositivo conectado à mesma rede poderá acessar as informações diretamente pelo navegador, utilizando apenas o endereço IP do ESP32. Nesses artigos você pode aprender mais sobre WebServer no ESP32: WebServer Assíncrono com ESP32 e Criando uma página web para ESP32
Essa abordagem apresenta diversas vantagens.
A primeira delas é a praticidade. Em vez de depender do Monitor Serial da Arduino IDE, basta abrir o navegador do computador ou do smartphone para visualizar os dados. Outra vantagem é a possibilidade de criar interfaces muito mais amigáveis. Utilizando HTML e CSS, é possível organizar as informações em cartões, indicadores, tabelas e até mesmo adicionar gráficos e mapas interativos.
Além disso, uma interface web facilita bastante a expansão do projeto. No futuro, por exemplo, seria possível incluir botões para configurar o GPS, registrar rotas, visualizar históricos de deslocamento ou integrar o sistema a serviços em nuvem.
Para desenvolver o projeto apresentado neste artigo serão utilizados alguns componentes, todos facilmente encontrados na loja da Eletrogate.
Os materiais necessários são:
Antes de iniciarmos o desenvolvimento do projeto, é importante compreender como um módulo GPS obtém sua localização. O GPS (Global Positioning System) é um sistema de navegação por satélite capaz de determinar a posição de um receptor em praticamente qualquer lugar do planeta. Para isso, o módulo recebe sinais de diversos satélites e calcula sua posição por meio da medição do tempo de propagação desses sinais. Na prática, o receptor precisa visualizar pelo menos quatro satélites para calcular com precisão a latitude, longitude, altitude e o horário UTC.
Além das coordenadas geográficas, os módulos GPS modernos também fornecem diversas outras informações úteis, como velocidade de deslocamento, direção do movimento (curso), número de satélites utilizados, qualidade do sinal e data e hora sincronizadas com os relógios atômicos presentes nos satélites. Essas informações são transmitidas por meio de mensagens no padrão NMEA, amplamente utilizado por receptores GNSS (Global Navigation Satellite System, ou Sistema Global de Navegação por Satélite) e facilmente interpretado por bibliotecas como a TinyGPS++. Abaixo uma imagem com os sistemas de GNSS mais conhecidos.

Se você deseja entender em detalhes como o sistema GPS funciona, como ocorre o cálculo da posição e qual é a infraestrutura composta pela constelação de satélites e pelas estações de controle em solo, recomendamos a leitura do artigo Por Trás da Tecnologia: GPS, disponível no blog. Esse conteúdo apresenta os fundamentos da tecnologia e explica os conceitos que tornam possível a navegação por satélite.
Caso seja seu primeiro contato com módulos GPS, também vale a pena conferir o artigo GPS Neo-6M com Arduino – Aprenda a Usar, no qual são apresentados os princípios de funcionamento do módulo NEO-6M, sua ligação ao Arduino e a utilização da biblioteca TinyGPS para obter informações como latitude, longitude, velocidade e número de satélites.
Uma das vantagens deste projeto é sua simplicidade de montagem. Como o módulo GPS comunica-se através de uma interface serial UART, são necessárias apenas quatro conexões entre o GPS e o ESP32.
O pino de transmissão (TX) do módulo GPS deve ser conectado ao pino de recepção da segunda UART do ESP32, enquanto o pino de recepção (RX) do GPS será ligado ao pino de transmissão correspondente. Além disso, é necessário conectar os pinos de alimentação e o GND comum entre os dispositivos.
A Tabela abaixo apresenta uma sugestão de ligação.
| Módulo GPS | ESP32 |
|---|---|
| VCC | 3,3 V ou 5 V* |
| GND | GND |
| TX | GPIO16 (RX2) |
| RX | GPIO17 (TX2) |
* Verifique a tensão de alimentação recomendada pelo fabricante do módulo GPS utilizado o NEO-6M precisa de 2,7V a 3,6V.
Depois de energizado, o módulo iniciará automaticamente a busca pelos satélites disponíveis. Em ambientes abertos, o primeiro posicionamento normalmente ocorre em poucos segundos. Já em ambientes internos ou com muitos obstáculos, esse processo pode levar mais tempo.
Esquema de ligação entre o ESP32 e o módulo GPS.

/* ============================================================================ GPS TRACKER WEB SERVER - ESP32 ============================================================================ Artigo para o blog Eletrogate. ============================================================================ * @author Saulo Aislan ([email protected]) * @brief Firmware para GPS Tracker Web Server. * @version 0.1 * @date 2026-08-11 * @copyright Copyright (c) 2026 */ #include <Arduino.h> #include <WiFi.h> #include <WebServer.h> #include <TinyGPSPlus.h> // ============================================================================ // CONFIGURACOES DO USUARIO - PREENCHA COM OS DADOS DA SUA REDE WI-FI // ============================================================================ const char *ssid = "SUA_REDE_WIFI"; const char *password = "SUA_SENHA_WIFI"; // ============================================================================ // CONFIGURACOES DE HARDWARE - MODULO GPS (UART2) // ============================================================================ static const int GPS_RX_PIN = 16; // GPIO16 <- conectado ao TX do modulo GPS static const int GPS_TX_PIN = 17; // GPIO17 -> conectado ao RX do modulo GPS static const uint32_t GPS_BAUD_RATE = 9600; HardwareSerial GPSSerial(2); // Usa a UART2 do ESP32 (UART0 fica livre p/ o Monitor Serial) TinyGPSPlus gps; // Objeto responsavel por decodificar as sentencas NMEA // ============================================================================ // SERVIDOR WEB (porta 80) // ============================================================================ WebServer server(80); // ============================================================================ // ESTRUTURA COM OS DADOS ATUAIS DO GPS // (evita uso de String dinamica; usa buffers fixos de char) // ============================================================================ struct GPSData { double latitude = 0.0; double longitude = 0.0; double altitude = 0.0; double speed = 0.0; uint32_t satellites = 0; char date[11] = "--/--/----"; // formato DD/MM/AAAA char time[9] = "--:--:--"; // formato HH:MM:SS (UTC) bool valid = false; // true somente quando ha FIX de localizacao }; GPSData gpsData; // ============================================================================ // CONTROLE DE TEMPO (uso de millis() no lugar de delay() dentro do loop) // ============================================================================ unsigned long lastStatusPrint = 0; const unsigned long STATUS_PRINT_INTERVAL = 5000; // imprime status no Serial a cada 5 s unsigned long lastWiFiCheck = 0; const unsigned long WIFI_CHECK_INTERVAL = 10000; // verifica conexao WiFi a cada 10 s // ============================================================================ // DECLARACAO DAS FUNCOES (protótipos) // ============================================================================ void connectWiFi(); void checkWiFiConnection(); void readGPS(); void updateGPSData(); void handleRoot(); void sendJSON(); void printStatus(); // ============================================================================ // PAGINA WEB (HTML + CSS + JS embutidos, gravada na memoria FLASH via PROGMEM) // ============================================================================ const char PAGE_HTML[] PROGMEM = R"rawliteral( <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>GPS Tracker | Eletrogate</title> <style> :root{ --bg1:#0f2027; --bg2:#203a43; --bg3:#2c5364; --card-bg: rgba(255,255,255,0.08); --card-border: rgba(255,255,255,0.15); --accent:#00d4ff; --accent2:#00ffa3; --text:#f2f7fb; --muted:#9fb3c8; --danger:#ff5c5c; } *{ box-sizing:border-box; } body{ margin:0; min-height:100vh; font-family:'Segoe UI', Roboto, Arial, sans-serif; background: linear-gradient(135deg, var(--bg1), var(--bg2), var(--bg3)); color:var(--text); display:flex; flex-direction:column; align-items:center; padding:24px 16px 48px; } header{ text-align:center; margin-bottom:24px; } header h1{ margin:0; font-size:2rem; letter-spacing:1px; } header h1 span{ color:var(--accent); } header p{ margin:6px 0 0; color:var(--muted); font-size:0.95rem; } #gpsStatus{ display:none; background: rgba(255,92,92,0.15); border:1px solid var(--danger); color:#ffb3b3; padding:10px 18px; border-radius:10px; margin-bottom:20px; font-weight:600; text-align:center; max-width:480px; } .grid{ display:grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap:16px; width:100%; max-width:820px; } .card{ background:var(--card-bg); border:1px solid var(--card-border); border-radius:16px; padding:18px; text-align:center; backdrop-filter: blur(6px); box-shadow: 0 4px 18px rgba(0,0,0,0.25); transition: transform 0.2s ease; } .card:hover{ transform: translateY(-4px); } .card .icon{ font-size:1.8rem; margin-bottom:6px; } .card .label{ font-size:0.8rem; color:var(--muted); text-transform:uppercase; letter-spacing:0.5px; margin-bottom:4px; } .card .value{ font-size:1.25rem; font-weight:700; color:var(--accent2); word-break:break-all; } .actions{ display:flex; flex-wrap:wrap; gap:14px; justify-content:center; margin-top:32px; width:100%; max-width:820px; } button{ flex:1 1 220px; max-width:340px; padding:16px 20px; font-size:1.05rem; font-weight:700; border:none; border-radius:14px; cursor:pointer; transition: filter 0.2s ease, transform 0.15s ease; } button:active{ transform: scale(0.97); } #mapsBtn{ background: linear-gradient(135deg, var(--accent2), #00c37a); color:#04331f; } #mapsBtn:disabled{ background:#3a4a52; color:#8fa2ab; cursor:not-allowed; } #refreshBtn{ background: linear-gradient(135deg, var(--accent), #0084ff); color:#00263a; } button:not(:disabled):hover{ filter:brightness(1.1); } footer{ margin-top:36px; color:var(--muted); font-size:0.8rem; text-align:center; } </style> </head> <body> <header> <h1>GPS <span>Tracker</span></h1> <p>ESP32 + TinyGPS++ • Atualizacao em tempo real</p> </header> <div id="gpsStatus">Aguardando sinal GPS...</div> <div class="grid"> <div class="card"> <div class="icon">📍</div> <div class="label">Latitude</div> <div class="value" id="lat">--</div> </div> <div class="card"> <div class="icon">📍</div> <div class="label">Longitude</div> <div class="value" id="lng">--</div> </div> <div class="card"> <div class="icon">📏</div> <div class="label">Altitude (m)</div> <div class="value" id="alt">--</div> </div> <div class="card"> <div class="icon">🚗</div> <div class="label">Velocidade (km/h)</div> <div class="value" id="spd">--</div> </div> <div class="card"> <div class="icon">🛰</div> <div class="label">Satelites</div> <div class="value" id="sat">--</div> </div> <div class="card"> <div class="icon">📅</div> <div class="label">Data</div> <div class="value" id="dat">--</div> </div> <div class="card"> <div class="icon">🕑</div> <div class="label">Hora UTC</div> <div class="value" id="tim">--</div> </div> </div> <div class="actions"> <button id="mapsBtn" onclick="openMaps()" disabled>Abrir no Google Maps</button> <button id="refreshBtn" onclick="updateData()">Atualizar</button> </div> <footer>Blog Eletrogate • Projeto GPS Tracker com ESP32</footer> <script> let currentLat = 0; let currentLng = 0; let gpsValid = false; // Busca os dados do GPS no endpoint /gps (formato JSON) e atualiza a pagina async function updateData() { try { const response = await fetch('/gps'); const data = await response.json(); gpsValid = data.valid; currentLat = data.latitude; currentLng = data.longitude; document.getElementById('lat').textContent = data.valid ? data.latitude.toFixed(6) : '--'; document.getElementById('lng').textContent = data.valid ? data.longitude.toFixed(6) : '--'; document.getElementById('alt').textContent = data.valid ? data.altitude.toFixed(1) : '--'; document.getElementById('spd').textContent = data.valid ? data.speed.toFixed(1) : '--'; document.getElementById('sat').textContent = data.satellites; document.getElementById('dat').textContent = data.date; document.getElementById('tim').textContent = data.time; const statusEl = document.getElementById('gpsStatus'); const mapsBtn = document.getElementById('mapsBtn'); if (data.valid) { statusEl.style.display = 'none'; mapsBtn.disabled = false; } else { statusEl.style.display = 'block'; mapsBtn.disabled = true; } } catch (err) { console.error('Falha ao buscar dados do GPS:', err); } } // Abre o Google Maps na posicao atual do GPS function openMaps() { if (!gpsValid) return; const url = `https://www.google.com/maps?q=${currentLat},${currentLng}`; window.open(url, '_blank'); } // Primeira atualizacao ao carregar a pagina + atualizacao automatica a cada 1 s window.onload = updateData; setInterval(updateData, 1000); </script> </body> </html> )rawliteral"; // ============================================================================ // FUNCAO: connectWiFi() // Conecta o ESP32 na rede Wi-Fi configurada e imprime SSID, IP e RSSI. // ============================================================================ void connectWiFi() { Serial.println(); Serial.println(F("Conectando WiFi...")); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); unsigned long startAttempt = millis(); // Aguarda a conexao por ate 20 segundos (bloqueante apenas na inicializacao) while (WiFi.status() != WL_CONNECTED && (millis() - startAttempt) < 20000) { delay(300); Serial.print("."); } if (WiFi.status() == WL_CONNECTED) { Serial.println(); Serial.println(F("WiFi conectado")); Serial.print(F("SSID : ")); Serial.println(WiFi.SSID()); Serial.print(F("IP : ")); Serial.println(WiFi.localIP()); Serial.print(F("RSSI : ")); Serial.print(WiFi.RSSI()); Serial.println(F(" dBm")); } else { Serial.println(); Serial.println(F("Falha ao conectar. Nova tentativa sera feita em segundo plano.")); } } // ============================================================================ // FUNCAO: checkWiFiConnection() // Verifica periodicamente se o WiFi caiu e reconecta automaticamente. // ============================================================================ void checkWiFiConnection() { if (millis() - lastWiFiCheck >= WIFI_CHECK_INTERVAL) { lastWiFiCheck = millis(); if (WiFi.status() != WL_CONNECTED) { Serial.println(F("WiFi desconectado! Reconectando...")); connectWiFi(); } } } // ============================================================================ // FUNCAO: updateGPSData() // Copia os dados validos decodificados pela TinyGPS++ para a struct global. // Cada campo so e atualizado se a respectiva sentenca NMEA for valida. // ============================================================================ void updateGPSData() { if (gps.location.isValid()) { gpsData.latitude = gps.location.lat(); gpsData.longitude = gps.location.lng(); } if (gps.altitude.isValid()) { gpsData.altitude = gps.altitude.meters(); } if (gps.speed.isValid()) { gpsData.speed = gps.speed.kmph(); } if (gps.satellites.isValid()) { gpsData.satellites = gps.satellites.value(); } if (gps.date.isValid()) { snprintf(gpsData.date, sizeof(gpsData.date), "%02d/%02d/%04d", gps.date.day(), gps.date.month(), gps.date.year()); } if (gps.time.isValid()) { snprintf(gpsData.time, sizeof(gpsData.time), "%02d:%02d:%02d", gps.time.hour(), gps.time.minute(), gps.time.second()); } // So consideramos o FIX valido quando ha localizacao valida gpsData.valid = gps.location.isValid(); } // ============================================================================ // FUNCAO: readGPS() // Le todos os bytes disponiveis na UART2 e alimenta o parser da TinyGPS++. // Deve ser chamada continuamente dentro do loop(). // ============================================================================ void readGPS() { while (GPSSerial.available() > 0) { if (gps.encode(GPSSerial.read())) { // Uma sentenca NMEA completa foi decodificada com sucesso updateGPSData(); } } } // ============================================================================ // FUNCAO: handleRoot() // Responde a requisicao HTTP GET "/" enviando a pagina Web (PROGMEM). // ============================================================================ void handleRoot() { server.send_P(200, "text/html", PAGE_HTML); } // ============================================================================ // FUNCAO: sendJSON() // Responde a requisicao HTTP GET "/gps" com os dados atuais em formato JSON. // Usa snprintf() com buffer fixo (sem String dinamica). // ============================================================================ void sendJSON() { char json[320]; snprintf(json, sizeof(json), "{\"latitude\":%.6f,\"longitude\":%.6f,\"altitude\":%.1f," "\"speed\":%.1f,\"satellites\":%lu,\"date\":\"%s\",\"time\":\"%s\"," "\"valid\":%s}", gpsData.latitude, gpsData.longitude, gpsData.altitude, gpsData.speed, (unsigned long)gpsData.satellites, gpsData.date, gpsData.time, gpsData.valid ? "true" : "false"); server.send(200, "application/json", json); } // ============================================================================ // FUNCAO: printStatus() // Imprime periodicamente no Monitor Serial o status atual do GPS. // ============================================================================ void printStatus() { if (millis() - lastStatusPrint < STATUS_PRINT_INTERVAL) { return; } lastStatusPrint = millis(); if (gpsData.valid) { Serial.println(F("---- Status GPS ----")); Serial.print(F("Satelites : ")); Serial.println(gpsData.satellites); Serial.print(F("Latitude : ")); Serial.println(gpsData.latitude, 6); Serial.print(F("Longitude : ")); Serial.println(gpsData.longitude, 6); Serial.print(F("Data/Hora : ")); Serial.print(gpsData.date); Serial.print(F(" ")); Serial.println(gpsData.time); } else { Serial.print(F("Aguardando sinal GPS... satelites visiveis: ")); Serial.println(gps.satellites.value()); } } // ============================================================================ // SETUP // ============================================================================ void setup() { Serial.begin(115200); delay(200); Serial.println(F("\n=== GPS Tracker Web Server - Eletrogate ===")); // Inicializa a UART2 dedicada ao modulo GPS GPSSerial.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN); Serial.println(F("GPS inicializado (UART2, 9600 bps)")); // Conecta na rede WiFi configurada no topo do arquivo connectWiFi(); // Define as rotas do servidor Web server.on("/", HTTP_GET, handleRoot); server.on("/gps", HTTP_GET, sendJSON); server.onNotFound([]() { server.send(404, "text/plain", "Rota nao encontrada"); }); server.begin(); Serial.println(F("Servidor Web iniciado na porta 80")); } // ============================================================================ // LOOP // ============================================================================ void loop() { server.handleClient(); // Atende as requisicoes HTTP (pagina e /gps) readGPS(); // Le e decodifica os dados do modulo GPS checkWiFiConnection(); // Reconecta automaticamente se o WiFi cair printStatus(); // Imprime o status no Monitor Serial periodicamente }
Para simplificar o desenvolvimento do projeto, utilizaremos três bibliotecas bastante conhecidas pela comunidade Arduino.
A primeira delas é a TinyGPS++, responsável por interpretar automaticamente as mensagens NMEA enviadas pelo módulo GPS. Em vez de processar manualmente cada sentença, a biblioteca disponibiliza métodos simples para acessar latitude, longitude, velocidade, altitude, número de satélites, data e horário UTC. A segunda biblioteca é a WiFi, já incluída no pacote oficial do ESP32. Ela será utilizada para conectar o microcontrolador à rede sem fio. Por fim, utilizaremos a biblioteca WebServer, responsável por criar um servidor HTTP embarcado no ESP32. Ela permitirá disponibilizar uma página HTML contendo todas as informações obtidas pelo GPS.
Essa combinação torna o desenvolvimento bastante simples e permite concentrar os esforços na criação da interface web, sem a necessidade de implementar protocolos de comunicação complexos.
Após estabelecer a comunicação com o módulo GPS e conectar o ESP32 à rede Wi-Fi, o próximo passo consiste em criar o servidor web responsável por disponibilizar as informações ao usuário.
Uma das grandes vantagens do ESP32 é possuir um servidor HTTP embarcado, dispensando completamente a utilização de computadores ou serviços externos para hospedar a página. Todo o processamento ocorre no próprio microcontrolador, tornando o sistema mais simples, portátil e independente da Internet.
Sempre que um navegador acessar o endereço IP do ESP32, uma página HTML será gerada dinamicamente contendo as informações mais recentes recebidas pelo GPS. Como os dados são atualizados continuamente, o usuário consegue acompanhar praticamente em tempo real o posicionamento do dispositivo.
O servidor desenvolvido neste projeto será responsável por exibir as seguintes informações:
Além dessas informações, a página também disponibilizará um botão para abrir automaticamente a posição atual no Google Maps. Essa abordagem elimina completamente a necessidade do Monitor Serial durante a utilização do projeto, tornando a aplicação muito mais amigável para os usuários.
Embora o ESP32 possua recursos limitados quando comparado a um computador convencional, ele é perfeitamente capaz de hospedar páginas HTML relativamente elaboradas. Neste projeto, a página será composta por cartões contendo cada informação fornecida pelo GPS. Essa organização melhora bastante a experiência do usuário, permitindo localizar rapidamente as informações desejadas.
Disposição da página é apresentada.

Uma das funcionalidades mais interessantes deste projeto consiste na integração direta com o Google Maps. Sempre que o módulo GPS obtiver um posicionamento válido, o ESP32 criará automaticamente um link contendo a latitude e a longitude atuais. O Google Maps permite abrir qualquer localização utilizando uma URL extremamente simples.
O formato utilizado é:
https://www.google.com/maps?q=LATITUDE,LONGITUDEhttps://www.google.com/maps?q=-6.833537,-35.763358
Uma característica importante de aplicações baseadas em GPS é que os dados mudam constantemente. Durante um deslocamento, por exemplo, a latitude, longitude, velocidade e altitude são atualizadas diversas vezes por segundo. Uma maneira simples de manter a página sincronizada consiste em recarregá-la periodicamente. Entretanto, uma solução mais elegante é utilizar técnicas como AJAX ou JavaScript, permitindo atualizar apenas os valores exibidos na tela sem recarregar toda a página. Embora o exemplo apresentado neste artigo utilize uma implementação simplificada, a estrutura desenvolvida poderá ser facilmente expandida para incorporar atualizações assíncronas, proporcionando uma experiência semelhante à de aplicações profissionais.
Depois de carregar o firmware no ESP32, abra o Monitor Serial apenas para identificar o endereço IP recebido pelo dispositivo após a conexão com a rede Wi-Fi. O terminal exibirá uma mensagem semelhante à seguinte:
Conectado ao Wi-Fi
Endereço IP: 192.168.0.115 (IP de exemplo)Caso o módulo ainda não tenha obtido sinal suficiente dos satélites, alguns campos poderão aparecer vazios ou indicar que o posicionamento ainda não foi adquirido, como na imagem abaixo:

Após alguns segundos, as coordenadas serão atualizadas automaticamente e o botão do Google Maps passará a direcionar para a posição correta. Esse procedimento pode ser realizado tanto em computadores quanto em celulares, desde que estejam conectados à mesma rede sem fio.
Vídeo demonstrando a página com as informações do GPS.
Embora o projeto apresentado tenha caráter didático, sua arquitetura é bastante semelhante à utilizada em aplicações comerciais de rastreamento. Entre as principais aplicações podemos destacar:
Outra possibilidade bastante interessante consiste em utilizar o projeto como base para um rastreador portátil. Nesse caso, o ESP32 poderia armazenar as coordenadas em um cartão microSD, enviar as informações para um servidor MQTT ou disponibilizá-las simultaneamente em uma página web e em uma plataforma de monitoramento em nuvem. Além disso, a integração com sensores ambientais, acelerômetros e giroscópios amplia significativamente as possibilidades de utilização do sistema.
O projeto desenvolvido neste artigo representa apenas uma pequena amostra do que pode ser construído utilizando ESP32 e módulos GPS. Diversas melhorias podem ser incorporadas futuramente. Uma delas consiste em substituir o botão do Google Maps por um mapa incorporado diretamente na página utilizando bibliotecas como Leaflet ou APIs do Google Maps.
Outra possibilidade é registrar automaticamente o histórico das coordenadas, permitindo visualizar o trajeto percorrido pelo dispositivo. Também é possível implementar gráficos de velocidade, distância percorrida e altitude, fornecendo informações adicionais ao usuário.
Para aplicações de IoT, uma evolução natural seria integrar o projeto a plataformas como Node-RED, ThingsBoard, Home Assistant ou servidores MQTT, permitindo acompanhar a localização remotamente pela Internet. Essas melhorias demonstram como um projeto relativamente simples pode evoluir para soluções bastante completas de monitoramento e rastreamento.
Neste artigo desenvolvemos uma aplicação prática que combina um módulo GPS com o ESP32 para criar um servidor web capaz de disponibilizar informações de localização diretamente pelo navegador. Em vez de depender do Monitor Serial da Arduino IDE, qualquer dispositivo conectado à mesma rede Wi-Fi pode acessar uma interface amigável contendo dados como latitude, longitude, altitude, velocidade, número de satélites, data e horário UTC.
Outro destaque do projeto é a integração com o Google Maps, permitindo visualizar instantaneamente a posição atual do dispositivo com apenas um clique. Essa funcionalidade demonstra como informações obtidas por um receptor GNSS podem ser facilmente incorporadas a aplicações reais, oferecendo uma experiência muito mais intuitiva ao usuário.
Além do caráter didático, a arquitetura apresentada serve como base para diversas aplicações em Internet das Coisas, rastreamento, telemetria e monitoramento remoto. Com pequenas adaptações, é possível adicionar armazenamento de dados, mapas interativos, comunicação via MQTT, integração com plataformas em nuvem e diversas outras funcionalidades, transformando este projeto em um sistema completo de localização em tempo real.
Para mais materiais como esse, continue acompanhando as postagens semanais do blog e não deixe de visitar nossa loja. Lá você encontra todos os componentes necessários para desenvolver esse e muitos outros projetos!
Que a força esteja com você! Até mais!
|
Encontre tudo na Loja Eletrogate com frete grátis para compras acima de R$ 200