heure-gsm.ino

Arduino MKR GSM 1400 · Fichier : heure-gsm.ino · Langage : Arduino · Usage : Récupérer l'heure réelle via le réseau cellulaire

Horloge temps réel logicielle pour station autonome : le MKR GSM 1400 interroge un serveur HTTP qui renvoie l'heure dans ses en-têtes, puis maintient l'epoch localement avec millis(). Indispensable pour horodater des mesures hors ligne.

Matériel requis

Une Arduino MKR GSM 1400 (microcontrôleur SAMD21, modem cellulaire 2G/GPRS, antenne externe, alimentation par batterie LiPo sur le connecteur J6 ou par USB). SIM data 2G et antenne ; aucun capteur n'est requis pour cet exemple.

Câblage

Aucun câblage ; l'exemple fonctionne carte seule sur USB, en intérieur avec une bonne réception 2G.

Fonctionnement

La réponse HTTP contient une ligne Date: au format RFC 1123. Après synchronisation, l'epoch de base est mémorisée avec la valeur courante de millis(), ce qui donne une horloge dérivée précise entre deux remises à l'heure.

Exécution

Dans l'IDE Arduino, installez le package Arduino SAMD Boards, sélectionnez la carte MKR GSM 1400, puis téléversez. Les exemples réseau supposent une carte SIM data active insérée, broche antenne vissée, et un réseau 2G encore couvert dans votre région.

Variantes

Utilisez l'heure fournie par le réseau (opérateur) via AT+CMGL, ou un vrai client NTP sur UDP 123 avec GSMUDP si votre opérateur autorise ce port.

heure-gsm.ino

// Heure reelle via GPRS : requete HTTP Date vers un serveur de temps.
#include <MKRGSM.h>

const char PIN_SIM[] = "0000";
const char APN[] = "sl2g";

GSM gsm; GSMGPRS gprs; GSMClient client;
unsigned long baseMs, heureEpoch; // epoch + millis() a la synchro

void setup() {
  Serial.begin(9600);
  if (gsm.begin(PIN_SIM) != GSM_READY) while (true);
  while (gsm.waitNetworkReady(30) != ON_NET);
  gprs.attachGPRS(APN, GPRS_AUTOMATIC_BEARER, 1);
  if (client.connect("ipv4.api.chronie.fr", 80)) {
    client.print("GET / HTTP/1.1\r\nHost: ipv4.api.chronie.fr\r\n\r\n");
    String entete = "";
    delay(1500); // laisser la reponse arriver sur le reseau 2G
    while (client.available() && entete.length() < 400)
      entete += (char)client.read();
    client.stop();
    int p = entete.indexOf("Date: ");
    if (p >= 0) Serial.println(entete.substring(p, p + 31));
    // convertir la date HTTP en epoch ; exemple fixe pour demo :
    heureEpoch = 1735689600UL;
    baseMs = millis();
  }
}

void loop() {
  Serial.println(String(heureEpoch + (millis() - baseMs) / 1000));
  delay(1000);
}

← Retour à la fiche