heure-gsm.ino
Reloj de software en tiempo real para una estación autónoma: el MKR GSM 1400 consulta un servidor HTTP que devuelve la hora en sus cabeceras y luego mantiene el epoch localmente con millis(). Imprescindible para fechar medidas sin conexión.
Hardware
Una Arduino MKR GSM 1400 (microcontrolador SAMD21, módem celular 2G/GPRS, antena externa, alimentada por batería LiPo en el conector J6 o por USB). SIM de datos 2G y antena; ningún sensor es necesario en este ejemplo.
Cableado
Sin cableado; el ejemplo funciona con la placa sola por USB, en interior con buena recepción 2G.
Funcionamiento
La respuesta HTTP incluye una línea Date: en formato RFC 1123. Tras sincronizar, el epoch base se guarda junto al valor actual de millis(), lo que da un reloj derivado preciso entre resincronizaciones.
Ejecución
En el IDE de Arduino, instala el paquete Arduino SAMD Boards, selecciona la placa MKR GSM 1400 y carga. Los ejemplos de red suponen una SIM de datos activa insertada, la antena enroscada y cobertura 2G todavía disponible en tu zona.
Variantes
Usa la hora de la red mediante AT+CMGL, o un cliente NTP real por UDP 123 con GSMUDP si tu operador permite ese puerto.
heure-gsm.ino
// Heure reelle via GPRS : requete HTTP Date vers un serveur de temps.
#include <MKRGSM.h>
const char PIN_SIM[] = "0000";
const char APN[] = "sl2g";
GSM gsm; GSMGPRS gprs; GSMClient client;
unsigned long baseMs, heureEpoch; // epoch + millis() a la synchro
void setup() {
Serial.begin(9600);
if (gsm.begin(PIN_SIM) != GSM_READY) while (true);
while (gsm.waitNetworkReady(30) != ON_NET);
gprs.attachGPRS(APN, GPRS_AUTOMATIC_BEARER, 1);
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 entete = "";
delay(1500); // laisser la reponse arriver sur le reseau 2G
while (client.available() && entete.length() < 400)
entete += (char)client.read();
client.stop();
int p = entete.indexOf("Date: ");
if (p >= 0) Serial.println(entete.substring(p, p + 31));
// convertir la date HTTP en epoch ; exemple fixe pour demo :
heureEpoch = 1735689600UL;
baseMs = millis();
}
}
void loop() {
Serial.println(String(heureEpoch + (millis() - baseMs) / 1000));
delay(1000);
}