🛰️ Localiseur Portable GPS/GSM DIY : Le Logiciel Complet (NMEA, SMS & MQTT) — Partie 2
Salut les makers ! Ici Electro. Dans la première partie, nous avions conçu le matériel d'un localiseur portable basé sur le légendaire module Wavecom Q250. Aujourd'hui, on passe au cerveau du système : le logiciel. Au programme : décodage des trames NMEA du GPS, envoi de la position par SMS, et — bonus 2026 — remontée en temps réel vers une carte web via MQTT. Et comme le Q250 est aujourd'hui introuvable, je vous donne en prime la version moderne ESP32 + SIM800L + NEO-6M !
🔄 Guide mis à jour en 2026 : parsing NMEA complet, code TinyGPS++/TinyGSM, visualisation Leaflet/OpenStreetMap, et intégration Home Assistant via MQTT.
De la gauche historique à la droite moderne : le localiseur GPS/GSM dans ses deux générations.
📡 Rappel : Le Langage du GPS — Les Trames NMEA
Tout module GPS, qu'il soit un Wavecom Q250 d'il y a 20 ans ou un NEO-6M moderne, parle le même langage : le protocole NMEA 0183. Il envoie en permanence des phrases ASCII qui commencent par $ et finissent par un checksum. Les deux plus importantes :
$GPRMC — Recommended Minimum (la plus utilisée)
$GPRMC,083559.00,A,4717.11437,N,00833.91522,E,0.004,77.52,091202,,,A*57
| | | | | | | | | |
| | | | | | | | | └─ Mode (A=autonome)
| | | | | | | | └─────── Date (09/12/02)
| | | | | | | └───────────── Cap (77.52°)
| | | | | | └──────────────── Vitesse (nœuds)
| | | | | └─────────────────────────── Longitude Est
| | | | └─────────────────────────────── N/S
| | | └──────────────────────────────────────── Latitude
| | └──────────────────────────────────────────── A=Valide, V=Invalide
| └────────────────────────────────────────────────── Heure UTC
└───────────────────────────────────────────────────────── Identifiant
$GPGGA — Global Positioning System Fix Data
Donne en plus la précision (HDOP), le nombre de satellites et l'altitude. Utile pour évaluer la qualité du fix.
💻 Parser le NMEA à la Main (Éducatif)
Comprendre avant de déléguer. Voici comment extraire les coordonnées d'une trame $GPRMC :
// Parsing manuel d'une trame $GPRMC - Electro (TechFix Hub)
String trame = "$GPRMC,083559.00,A,4717.11437,N,00833.91522,E,0.004,77.52,091202,,,A*57";
void parseRMC(String s) {
// Découpe par virgules
String champs[13];
int idx = 0, start = 0;
for (int i = 0; i < s.length() && idx < 13; i++) {
if (s[i] == ',' || s[i] == '*') {
champs[idx++] = s.substring(start, i);
start = i + 1;
}
}
// Validité du fix
if (champs[2] != "A") {
Serial.println("Fix invalide (pas de satellites)");
return;
}
// Latitude : 4717.11437 N → 47° + 17.11437'/60 = 47.28524°
float latBrut = champs[3].toFloat();
float lat = floor(latBrut / 100) + fmod(latBrut, 100) / 60.0;
if (champs[4] == "S") lat = -lat;
// Longitude : même logique
float lonBrut = champs[5].toFloat();
float lon = floor(lonBrut / 100) + fmod(lonBrut, 100) / 60.0;
if (champs[6] == "W") lon = -lon;
Serial.print("Position : "); Serial.print(lat, 6);
Serial.print(", "); Serial.println(lon, 6);
}
🚀 La Méthode Moderne : TinyGPS++ (recommandé)
En 2026, on ne parse plus à la main. La librairie TinyGPS++ fait tout le travail, checksum inclus, et gère aussi bien $GPRMC que $GPGGA :
#include <TinyGPS++.h>
TinyGPSPlus gps;
HardwareSerial ssGPS(1); // UART 1 sur ESP32
void setup() {
Serial.begin(115200);
ssGPS.begin(9600, SERIAL_8N1, 16, 17); // RX=16, TX=17
}
void loop() {
while (ssGPS.available() > 0) {
if (gps.encode(ssGPS.read())) {
if (gps.location.isValid()) {
Serial.print(gps.location.lat(), 6);
Serial.print(", ");
Serial.println(gps.location.lng(), 6);
}
}
}
}
📲 Envoi de la Position par SMS
L'intérêt d'un localiseur GSM est de pouvoir être interrogé à distance. Vous envoyez LOC? par SMS, il répond avec un lien Google Maps :
// Envoi SMS avec coordonnées - Electro (TechFix Hub)
void envoyerPositionSMS(String numero) {
if (!gps.location.isValid()) {
envoieSMS(numero, "Pas de fix GPS");
return;
}
float lat = gps.location.lat();
float lon = gps.location.lng();
float vitesse = gps.speed.kmph();
String msg = "Position: ";
msg += "https://maps.google.com/?q=";
msg += String(lat, 6) + "," + String(lon, 6);
msg += " V=" + String(vitesse, 1) + "km/h";
envoieSMS(numero, msg);
}
void envoieSMS(String num, String texte) {
gsm.sendAT("+CMGF=1"); // Mode texte
gsm.sendAT("+CMGS=\"" + num + "\"");
gsm.print(texte);
gsm.write(26); // Ctrl+Z pour envoyer
}
🛒 Liste des Composants Modernes (BOM 2026)
| Composant | Modèle | Rôle |
|---|---|---|
| Microcontrôleur | ESP32 DevKit V1 | Cerveau principal + WiFi |
| Module GSM | SIM800L (ou A7670G 4G) | SMS + GPRS/LTE |
| Module GPS | NEO-6M / NEO-M8N | Réception GPS NMEA |
| Antenne GPS | Céramique active + LNA | Captation satellites |
| Antenne GSM | SMA 900/1800 MHz | Communication cellulaire |
| Régulateur | LM2596 (step-down 5V→4V) | Alimentation SIM800L (pic 2A !) |
| Batterie | Li-Po 3,7V 2000mAh + TP4056 | Autonomie portable |
| Accéléromètre (option) | MPU6050 | Détection mouvement / réveil |
💻 Code Complet : Localiseur ESP32 + SIM800L + NEO-6M
// Localiseur GPS/GSM portable - Electro (TechFix Hub 2026)
// Dépendances : TinyGPS++, TinyGSM
#include <TinyGPS++.h>
#include <TinyGsmClient.h>
#define TINY_GSM_MODEM_SIM800
// UART GPS
HardwareSerial ssGPS(1);
TinyGPSPlus gps;
// UART GSM
#define MODEM_TX 27
#define MODEM_RX 26
HardwareSerial ssGSM(2);
TinyGsm modem(ssGSM);
const char NUMERO_ADMIN[] = "+33612345678"; // Votre numéro
const char BROKER[] = "mqtt.example.com";
const int BROKER_PORT = 1883;
void setup() {
Serial.begin(115200);
ssGPS.begin(9600, SERIAL_8N1, 16, 17);
ssGSM.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
Serial.println("Initialisation modem...");
modem.restart();
modem.gprsConnect("internet", "", "");
Serial.println("Localiseur pret. Envoyez LOC? par SMS.");
}
void loop() {
// Lecture GPS en continu
while (ssGPS.available()) gps.encode(ssGPS.read());
// Toutes les 30 s, publier sur MQTT si fix valide
static unsigned long lastPub = 0;
if (millis() - lastPub > 30000 && gps.location.isValid()) {
publierPosition();
lastPub = millis();
}
}
void publierPosition() {
TinyGsmClient client(modem);
if (client.connect(BROKER, BROKER_PORT)) {
String payload = "{\"lat\":";
payload += String(gps.location.lat(), 6);
payload += ",\"lon\":";
payload += String(gps.location.lng(), 6);
payload += ",\"spd\":";
payload += String(gps.speed.kmph(), 1);
payload += ",\"sats\":";
payload += String(gps.satellites.value());
payload += ",\"t\":";
payload += String(millis() / 1000);
payload += "}";
String topic = "localiseur/portable1";
client.print("PUB " + topic + " 0 " + payload.length() + "\r\n");
client.print(payload);
client.stop();
Serial.println("Position publiee : " + payload);
}
}
🗺️ Visualisation sur Carte Web (Leaflet + MQTT.js)
Un simple fichier HTML avec Leaflet (OpenStreetMap) et MQTT.js suffit pour voir la position en temps réel :
<!-- carte.html - Visualisation localiseur - Electro -->
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>
</head>
<body>
<div id="map" style="height:500px"></div>
<script>
var map = L.map('map').setView([47.28, 8.56], 13);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);
var marker = L.marker([47.28, 8.56]).addTo(map);
var client = mqtt.connect('ws://mqtt.example.com:8083');
client.on('connect', () => client.subscribe('localiseur/portable1'));
client.on('message', (topic, msg) => {
var data = JSON.parse(msg.toString());
marker.setLatLng([data.lat, data.lon]);
marker.bindPopup('Vitesse: ' + data.spd + ' km/h | Sat: ' + data.sats).openPopup();
map.setView([data.lat, data.lon], 15);
});
</script>
</body>
</html>
🤖 Le Twist Moderne 2026 : Intégration Home Assistant
Avec MQTT, Home Assistant voit votre localiseur comme n'importe quel capteur. Ajoutez à configuration.yaml :
mqtt:
device_tracker:
- name: "Localiseur Portable"
state_topic: "localiseur/portable1"
json_attributes_topic: "localiseur/portable1"
payload_home: "home"
payload_not_home: "away"
Vous pouvez alors créer des automatisations : "Envoie-moi une notification si le localiseur sort d'un périmètre de 500 m autour de la maison."
💡 Astuces de Pro (Par Electro)
- Fix GPS à froid : un module GPS met 30 s à 5 min pour obtenir son premier fix (surtout en intérieur). Testez toujours dehors, antenne vers le ciel.
- Pic de courant SIM800L : il tire 2 A en transmission GPRS ! Un régulateur LM2596 + condensateur 1000 µF près du module sont obligatoires — sinon l'ESP32 redémarre en boucle.
- Économie d'énergie : mettez le GPS en mode Power Save (commande UBX pour u-blox) et le modem en sleep PSM entre deux publications. Autonomie ×10.
- Antenne active : utilisez toujours une antenne GPS active (avec LNA intégré) alimentée en 3,3 V. Les antennes passives ne captent rien en milieu urbain.
- Loi et éthique : ne tracez que vos propres biens ou avec consentement explicite. Le tracking à l'insu d'une personne est un délit dans la plupart des pays.
❓ Questions Fréquentes (FAQ)
Le Q250 original fonctionne-t-il encore en 2026 ?
Non. Le Q250 utilisait le réseau 2G (GSM/GPRS), qui est en cours d'extinction dans de nombreux pays (déjà éteint en France depuis 2025 chez certains opérateurs). La version SIM800L (2G résiduel) fonctionne encore quelques années, mais visez un module 4G LTE-M comme le A7670G ou SIM7600 pour l'avenir.
Quelle précision peut-on espérer ?
NEO-6M : 2,5 m en conditions idéales (ciel dégagé). NEO-M8N : 1,5 m. En milieu urbain avec immeubles : 5-15 m. Pour du sub-métrique, il faut un module RTK (ex: ZED-F9P, ~200 €).
Peut-on utiliser le WiFi à la place du GSM ?
Oui, pour un usage en zone couverte. Un ESP32 seul avec WiFi + MQTT donne un localiseur indoor parfait (voir mon guide ESP32 GPS Tracker). Le GSM reste indispensable pour le tracking mobile outdoor.
Pourquoi MQTT plutôt que HTTP ?
MQTT est léger (quelques octets par message), fonctionne sur GPRS lent, supporte la connexion persistante et le Quality of Service. HTTP nécessite de rouvrir une connexion TCP à chaque publication — consommation ×10.
Peut-on suivre plusieurs localiseurs ?
Oui : un topic MQTT par appareil (localiseur/voiture, localiseur/velo, localiseur/sac). Chaque traceur publie sur son topic, la carte web affiche tous les marqueurs.
🎯 Conclusion
Le logiciel d'un localiseur GPS/GSM n'a rien de magique : il s'agit de comprendre les trames NMEA, d'extraire les coordonnées, puis de les transmettre — par SMS pour l'usage simple, par MQTT pour l'usage connecté. Avec un ESP32, un SIM800L et un NEO-6M, vous obtenez en 2026 un traceur portable plus performant que bien des solutions du commerce, pour moins de 30 € de composants, et entièrement sous votre contrôle.
Vous avez construit votre localiseur ? Partagez vos captures d'écran de la carte et vos mesures d'autonomie en commentaire, je lis chacun d'entre eux !


