horloge-ntp.ino
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;
}