horloge-ntp.ino

Arduino MKR WiFi 1010 · Archivo : horloge-ntp.ino · Lenguaje : Arduino · Uso : Régler l'heure via NTP après connexion WiFi

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;
}

← Volver a la ficha