Étape 2: Code
Vous aurez besoin de l’adresse mac du fond de votre bouclier Ethernet, mais l’IP, masque de sous-réseau et de passerelle sont tous obtenus throgh DHCP. Vous aurez également besoin de l’adresse de serveur de temps (voir étape suivante)
Le code qui doit être téléchargé sur votre Arduino est comme suit :
exemple de code est née à http://www.openreefs.com/ntpServer
modifié par Steve Spence, http://arduinotronics.blogspot.com
#include < SPI.h >
#include < Ethernet.h >
#include < EthernetUdp.h >
#include < Time.h >
/ * *** Paramètres carte Ethernet *** * /
Cela défini sur votre Mac adresse de la carte Ethernet
la mac de Byte [] = {0x90, 0xA2, 0xDA, 0 x 00, 0 x 23, 0 x 36} ;
/ * *** Les paramètres du serveur NTP *** * /
/ * us.pool.ntp.org le serveur NTP
(Définie sur votre serveur de temps de choix) * /
Adresse IP serveur temporel (216, 23, 247, 62) ;
/ * Mettre sur le décalage (en secondes) à votre heure locale
Cet exemple est GMT - 4 * /
const long timeZoneOffset =-14400 L ;
/ * Synchronisation au serveur NTP toutes les 15 secondes pour le test,
1 heure ou plus pour être raisonnable la valeur * /
unsigned int ntpSyncTime = 3600 ;
/ * MODIFIER CES VARIABLES À VOS PROPRES RISQUES * /
port local pour écouter les paquets UDP
unsigned int localPort = 8888 ;
Horodatage NTP est dans les 48 premiers octets du message
const int NTP_PACKET_SIZE = 48 ;
Tampon pour maintenir les paquets entrants et sortants
packetBuffer Byte [NTP_PACKET_SIZE] ;
Une instance UDP pour nous faire envoyer et recevoir des paquets UDP
EthernetUDP Udp ;
Assure le suivi des depuis combien de temps nous avons mis à jour le serveur NTP
unsigned long ntpLastUpdate = 0 ;
Vérifier la dernière horloge affichée (pas en Production)
time_t prevDisplay = 0 ;
void setup() {}
Serial.Begin(9600) ;
Bouclier Ethernet et configuration NTP
int i = 0 ;
int DHCP = 0 ;
DHCP = Ethernet.begin(mac) ;
Essayez d’obtenir les paramètres dhcp 30 fois avant d’abandonner
tandis que (DHCP == 0 & & j’ai < 30) {}
Delay(1000) ;
DHCP = Ethernet.begin(mac) ;
i ++ ;
}
if (!. DHCP) {}
Serial.println ("DHCP a échoué") ;
for(;;) ; //Infinite boucle car DHCP a échoué
}
Serial.println ("DHCP succès") ;
Essayez d’obtenir la date et l’heure
trys int = 0 ;
while(!getTimeAndDate() & & trys < 10) {}
trys ++ ;
}
}
Ne modifiez pas cette fonction, il est utilisé par le système
int getTimeAndDate() {}
drapeau de l’int = 0 ;
UDP.Begin(localPort) ;
sendNTPpacket(timeServer) ;
Delay(1000) ;
Si (Udp.parsePacket()) {}
UDP.Read(packetBuffer,NTP_PACKET_SIZE) ; lire le paquet dans la mémoire tampon
unsigned long highWord, lowWord, époque ;
highWord = mot (packetBuffer [40], packetBuffer[41]) ;
lowWord = mot (packetBuffer [42], packetBuffer[43]) ;
EPOCH = highWord << 16 | lowWord ;
EPOCH = époque - 2208988800 + timeZoneOffset ;
drapeau = 1 ;
setTime(epoch) ;
ntpLastUpdate = now() ;
}
retour de drapeau ;
}
Ne modifiez pas cette fonction, il est utilisé par le système
sendNTPpacket long non signé (IPAddress & adresse)
{
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 (adresse, 123) ;
UDP.Write(packetBuffer,NTP_PACKET_SIZE) ;
Udp.endPacket() ;
}
Affichage de l’heure de l’heure et la date (base)
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() ;
}
Fonction utilitaire d’affichage de l’horloge : tirages précédents du côlon et menant 0
void printDigits (int chiffres) {}
Serial.Print(":") ;
if(digits < 10)
Serial.Print('0') ;
Serial.Print(digits) ;
}
C’est là toute la magie opère...
void loop() {}
Mettre à jour l’heure via un serveur NTP aussi souvent que le délai défini au sommet
Si (maintenant ()-ntpLastUpdate > ntpSyncTime) {}
trys int = 0 ;
while(!getTimeAndDate() & & trys < 10) {}
trys ++ ;
}
if(trys<10) {}
Serial.println ("ntp serveur mise à jour succès") ;
}
else {}
Serial.println ("ntp serveur mise à jour a échoué") ;
}
}
Afficher l’heure si elle a changé de plus d’une seconde.
Si (maintenant()! = prevDisplay) {}
prevDisplay = now() ;
clockDisplay() ;
}
}