horloge-ntp.ino
Reloj preciso para la MKR WiFi 1010: tras conectar, el sketch envía una petición NTP UDP/123 a pool.ntp.org y ajusta la librería Time, resincronizando cada hora. Las tramas de 48 bytes y el offset 1968-1900 son las dos trampas clásicas.
Hardware
Una Arduino MKR WiFi 1010 (microcontrolador SAMD21, módulo Wi-Fi WINC1500, sin Bluetooth, alimentación USB o LiPo en J6). MKR WiFi 1010, red que permita UDP/123 saliente (rara vez bloqueado en doméstico).
Cableado
Sin cableado; el ejemplo sigue la estructura oficial de TimeNTP.ino de la librería WiFi101.
Funcionamiento
setSyncProvider llama a getNtpTime periódicamente; la respuesta NTP lleva el epoch Unix en el byte 40. Entre sincronizaciones, la librería Time incrementa localmente con millis().
Ejecución
Instala Arduino SAMD Boards y la librería WiFi101, selecciona la placa y carga. El Wi-Fi funciona solo en 2,4 GHz: comprueba que tu punto de acceso no sea solo de 5 GHz.
Variantes
Usa un servidor NTP local (router Fritz!Box, Raspberry Pi) para redes aisladas o muestra la hora en una pequeña pantalla 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;
}