Paso 2: código
Usted necesitará la dirección mac de la parte inferior de su escudo de Ethernet, pero la IP, puerta de enlace y máscara de subred son todos obtenidos esta DHCP. Usted también necesitará la dirección del servidor de tiempo (ver siguiente paso)
El código que debe ser subido a tu Arduino es como sigue:
ejemplo de código se originó en el http://www.openreefs.com/ntpServer
modificado por Steve Spence, http://arduinotronics.blogspot.com
#include < SPI.h >
#include < Ethernet.h >
#include < EthernetUdp.h >
#include < Time.h >
/ * *** Ethernet Tarjeta configuración *** * /
Seleccione su dirección de Mac de la tarjeta de Ethernet
mac de bytes [] = {0x90, 0xA2, 0xDA, 0 x 00, 0x23, 0x36};
/ * *** Configuración del servidor NTP *** * /
/ * servidor NTP us.pool.ntp.org
(Configurado en el servidor de tiempo de la opción) * /
Dirección IP timeServer (216, 23, 247, 62);
/ * Seleccione el desplazamiento (en segundos) a su hora local
Este ejemplo es GMT - 4 * /
const timeZoneOffset largo =-14400 L;
/ * Se sincroniza al servidor NTP cada 15 segundos para la prueba,
a 1 hora o más razonable * /
unsigned int ntpSyncTime = 3600;
/ * MODIFICAR ESTAS VARIABLES BAJO SU PROPIO RIESGO * /
local puerto para paquetes UDP
unsigned int PuertoLocal = 8888;
Marca de tiempo NTP es en los primeros 48 bytes del mensaje
const int NTP_PACKET_SIZE = 48;
Buffer para paquetes entrantes y salientes
byte packetBuffer [NTP_PACKET_SIZE];
Una instancia de la UDP nos permite enviar y recibir paquetes sobre UDP
EthernetUDP Udp;
Realiza un seguimiento de cómo hace mucho tiempo actualizamos el servidor NTP
ntpLastUpdate largo sin signo = 0;
Revise el último reloj (no en producción)
time_t prevDisplay = 0;
void setup() {}
Serial.Begin(9600);
Escudo de Ethernet y configuración NTP
int i = 0;
int DHCP = 0;
DHCP = Ethernet.begin(mac);
Intentar obtener la configuración de dhcp 30 veces antes de abandonar
mientras que (DHCP == 0 & & i < 30) {}
Delay(1000);
DHCP = Ethernet.begin(mac);
i ++;
}
if (!. DHCP) {}
Serial.println ("DHCP error");
for(;;); //Infinite lazo porque DHCP no
}
Serial.println ("DHCP el éxito");
Tratar de conseguir la fecha y hora
trys int = 0;
while(!getTimeAndDate() & & trys < 10) {}
trys ++;
}
}
No altera esta función, es utilizado por el sistema
int getTimeAndDate() {}
int bandera = 0;
UDP.Begin(localPort);
sendNTPpacket(timeServer);
Delay(1000);
Si (Udp.parsePacket()) {}
UDP.Read(packetBuffer,NTP_PACKET_SIZE); Lea el paquete en el buffer
highWord largo sin firmar, lowWord, época;
highWord = palabra (packetBuffer [40], packetBuffer[41]);
lowWord = palabra (packetBuffer [42], packetBuffer[43]);
época = highWord << 16 | lowWord;
época = época - 2208988800 + timeZoneOffset;
bandera = 1;
setTime(epoch);
ntpLastUpdate = now();
}
regresar de bandera;
}
No altera esta función, es utilizado por el sistema
sendNTPpacket largo sin signo (dirección IP y dirección)
{
memset (packetBuffer, 0, NTP_PACKET_SIZE);
packetBuffer [0] = 0b11100011;
packetBuffer [1] = 0;
packetBuffer [2] = 6;
packetBuffer [3] = 0xEC;
packetBuffer [12] = 49;
packetBuffer [13] = 0x4E;
packetBuffer [14] = 49;
packetBuffer [15] = 52;
Udp.beginPacket (dirección, 123);
UDP.Write(packetBuffer,NTP_PACKET_SIZE);
Udp.endPacket();
}
Reloj de la hora y fecha (básico)
void clockDisplay() {}
Serial.Print(hour());
printDigits(minute());
printDigits(second());
Serial.Print("");
Serial.Print(Day());
Serial.Print("");
Serial.Print(month());
Serial.Print("");
Serial.Print(Year());
Serial.println();
}
Función de utilidad para la visualización del reloj: impresiones anteriores a colon y lleva 0
void printDigits (int dígitos) {}
Serial.Print(":");
if(digits < 10)
Serial.Print('0');
Serial.Print(digits);
}
Esto es donde sucede toda la magia...
void loop() {}
Actualizar tan a menudo como la hora de que ajustar en la parte superior el tiempo via servidor NTP
Si (ahora ()-ntpLastUpdate > ntpSyncTime) {}
trys int = 0;
while(!getTimeAndDate() & & trys < 10) {}
trys ++;
}
if(trys<10) {}
Serial.println ("ntp server update success");
}
Else {}
Serial.println ("ntp server update error");
}
}
Mostrar la hora si ha cambiado por más de un segundo.
Si (now()! = prevDisplay) {}
prevDisplay = now();
clockDisplay();
}
}