Sincronizar nuestro reloj DS1307 a un servidor ntp

Para sincronizar el reloj DS1307 con un servidor de hora de Internet nos basamos en NTP2RTC de Rob Tillaart, que se basa en el cliente UDP NTP y usa las librerías RTClib.
Hay que tener cuidado con el ejemplo de arduino para no saturar el servidor.
unsigned long sendNTPpacket(byte *address) //envia peticion NTP al servidor
{
memset(pb, 0, NTP_PACKET_SIZE); // Pone el buffer a 0
// Inicializa los valores para la peticion NTP
pb[0] = 0b11100011; // LI, Version, Mode
pb[1] = 0; // Stratum, or type of clock
pb[2] = 6; // Polling Interval
pb[3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
pb[12] = 49;
pb[13] = 0x4E;
pb[14] = 49;
pb[15] = 52;
Udp.sendPacket( pb,NTP_PACKET_SIZE, address, 123); //Peticiones NTP al puerto 123
}


void buscatiempoNTP () {
sendNTPpacket(timeServer); // send an NTP packet to a time server
delay(1000);// wait to see if a reply is available
if ( Udp.available() ) {
Udp.readPacket(pb, NTP_PACKET_SIZE);
unsigned long t1, t2, t3, t4;
t1 = t2 = t3 = t4 = 0;
for (int i=0; i< 4; i++)
{
t1 = t1 << 8 | pb[16+i];
t2 = t2 << 8 | pb[24+i];
t3 = t3 << 8 | pb[32+i];
t4 = t4 << 8 | pb[40+i];
}
float f1,f2,f3,f4;
f1 = ((long)pb[20] * 256 + pb[21]) / 65536.0;
f2 = ((long)pb[28] * 256 + pb[29]) / 65536.0;
f3 = ((long)pb[36] * 256 + pb[37]) / 65536.0;
f4 = ((long)pb[44] * 256 + pb[45]) / 65536.0;
const unsigned long seventyYears = 2208988800UL;
t1 -= seventyYears;
t2 -= seventyYears;
t3 -= seventyYears;
t4 -= seventyYears;
t4 += 1;
if (f4 > 0.4) t4++;
RTC.adjust(DateTime(t4));
}
else
{
Serial.print("$GO 1 15\r\n"); // Si falla la conexion a internet,
Serial.print("$PRINT ** \r\n"); // muestra un asterisco al final de la linea
}
ajusta=false;
}

Anuncios
Esta entrada fue publicada en codigo, hora. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s