🛰️ 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.

Localiseur portable GPS GSM avec module Wavecom Q250 et ESP32 moderne

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.

Prototype de localiseur portable DIY avec ESP32, SIM800L et NEO-6M

💻 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)

ComposantModèleRôle
MicrocontrôleurESP32 DevKit V1Cerveau principal + WiFi
Module GSMSIM800L (ou A7670G 4G)SMS + GPRS/LTE
Module GPSNEO-6M / NEO-M8NRéception GPS NMEA
Antenne GPSCéramique active + LNACaptation satellites
Antenne GSMSMA 900/1800 MHzCommunication cellulaire
RégulateurLM2596 (step-down 5V→4V)Alimentation SIM800L (pic 2A !)
BatterieLi-Po 3,7V 2000mAh + TP4056Autonomie portable
Accéléromètre (option)MPU6050Dé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."

Visualisation temps réel d'un localiseur GPS sur OpenStreetMap avec Leaflet

💡 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.
    Décodage d'une trame NMEA $GPRMC : latitude, longitude, vitesse et validité

❓ 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 !

📚 À lire aussi sur TechFix Hub

Bottom Ad [Post Page]