heure-serveur.ino

Arduino MKR NB 1500 · Fichier : heure-serveur.ino · Langage : Arduino · Usage : Synchroniser l'horloge via un serveur de temps TCP

Les réseaux LPWA filtrent souvent le trafic NTP UDP : ce croquis récupère donc l'heure par un simple GET HTTP sur le port 80, puis la maintient avec millis(). La latence plus élevée du NB-IoT est absorbée par une attente explicite avant lecture.

Matériel requis

Une Arduino MKR NB 1500 (microcontrôleur SAMD21, modem u-blox LTE-M/NB-IoT, antenne externe, alimentation LiPo sur J6 ou USB). SIM IoT data, antenne, accès Internet sortant autorisé par l'opérateur (APN data standard).

Câblage

Aucun câblage ; testez d'abord la jointure réseau avec l'exemple d'attachement.

Fonctionnement

La ligne Date: de la réponse HTTP (RFC 1123) est affichée puis, en production, convertie en epoch. L'epoch de base est mémorisée avec millis() pour une horloge locale entre deux syncs.

Exécution

Installez le package Arduino SAMD Boards et la bibliothèque MKRNB, sélectionnez la carte, téléversez. Prévoyez une carte SIM IoT (LTE-M ou NB1) activée et une bonne réception : l'attachement au réseau peut demander plusieurs minutes.

Variantes

Si votre APN autorise UDP/123, remplacez par NBClientUDP et un paquet NTP de 48 octets, plus précis à la dizaine de millisecondes près.

heure-serveur.ino

// Horloge temps reel via serveur HTTP au-dessus de la data NB-IoT.
// Les operateurs LPWA bloquent souvent UDP/123 : on passe par le port 80.
#include <MKRNB.h>

const char PIN_SIM[] = "0000";
const char APN[] = "iot.1nce.net";

NB nb;
NBClient client;

unsigned long baseMs, heureEpoch;

void setup() {
  Serial.begin(9600);
  if (nb.begin(PIN_SIM) != NB_READY) while (true);
  while (nb.getStatus() != NETWORK_JOINED) delay(2000);
  nb.attachGPRS(APN);
  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 h = "";
    delay(2000); // reseau LPWA : latence a 1-3 s
    while (client.available() && h.length() < 400)
      h += (char)client.read();
    client.stop();
    int p = h.indexOf("Date: ");
    if (p >= 0) Serial.println(h.substring(p, p + 31));
    // convertir la date HTTP en epoch ; valeur de demo :
    heureEpoch = 1735689600UL;
    baseMs = millis();
  }
}

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

← Retour à la fiche