horloge-ntp.ino

Arduino MKR WiFi 1010 · Fichier : horloge-ntp.ino · Langage : Arduino · Usage : Régler l'heure via NTP après connexion WiFi

Horloge précise pour la MKR WiFi 1010 : après la connexion, le croquis envoie une requête NTP UDP/123 vers pool.ntp.org et règle la bibliothèque Time, avec resynchronisation horaire. Les trames de 48 octets et l'offset 1968-1900 sont les deux pièges classiques.

Matériel requis

Une Arduino MKR WiFi 1010 (microcontrôleur SAMD21, module Wi-Fi WINC1500, pas de Bluetooth, alimentation USB ou LiPo sur J6). MKR WiFi 1010, réseau autorisant UDP/123 sortant (rarement bloqué en domestique).

Câblage

Aucun câblage ; l'exemple suit la structure officielle TimeNTP.ino de la bibliothèque WiFi101.

Fonctionnement

setSyncProvider appelle getNtpTime périodiquement ; la réponse NTP contient l'epoch Unix à l'octet 40. Entre deux syncs, la bibliothèque Time incrémente localement avec millis().

Exécution

Installez Arduino SAMD Boards et la bibliothèque WiFi101, sélectionnez la carte, téléversez. Le Wi-Fi fonctionne en 2,4 GHz uniquement : vérifiez que votre point d'accès n'est pas en 5 GHz seul.

Variantes

Utilisez un serveur NTP local (routeur Fritz!Box, Raspberry pi) pour les réseaux isolés, ou affichez l'heure sur un petit écran I2C.

horloge-ntp.ino

// Heure NTP MKR WiFi 1010 : reglage reseau puis horloge locale.
#include <SPI.h>
#include <WiFi101.h>
#include <TimeLib.h>
#include <WiFiUdp.h>

const char SSID[] = "MonReseau";
const char PASS[] = "motdepassewifi";
const char NTP[] = "pool.ntp.org";
const int PORT_NTP = 123;

WiFiUDP udp;

void setup() {
  Serial.begin(9600);
  WiFi.begin(WPA_PASS_PHRASE, SSID, PASS);
  while (WiFi.status() != WL_CONNECTED) delay(100);
  Serial.println(WiFi.localIP());
  udp.begin(PORT_NTP);
  setSyncProvider(getNtpTime);
  setSyncInterval(3600);
}

void loop() {
  if (timeStatus() != timeNotSet)
    Serial.println(formatTime(now())); // hh:mm:ss via lib Time
  delay(1000);
}

// Appelle par la lib Time : renvoie l'epoch NTP courant.
time_t getNtpTime() {
  while (udp.parsePacket() > 0); // vide l'ancien trafic
  sendNtpPacket(); // paquet NTP standard de 48 octets
  unsigned long debut = millis();
  while (udp.parsePacket() < 48 && millis() - debut < 1000) delay(1);
  // convertir les octets 40-43 de la reponse en epoch
  // (exemple complet : TimeNTP.ino de WiFi101)
  return 0;
}

← Retour à la fiche