Stap 2: Code
Vanaf de onderkant van uw Ethernet-Shield, maar IP moet u het mac-adres, Gateway en subnetmasker worden alle verkregen throgh DHCP. U moet ook het adres van de tijd-server (Zie de volgende stap)
De code die moet worden geüpload naar de Arduino is als volgt:
code van de steekproef is ontstaan op http://www.openreefs.com/ntpServer
bewerkt door Steve Spence, http://arduinotronics.blogspot.com
#include < SPI.h >
#include < Ethernet.h >
#include < EthernetUdp.h >
#include < Time.h >
/ * *** Ethernet-Card-instellingen *** * /
Zet dit op uw Mac-adres van Ethernet-kaart
byte mac [] = {0x90, 0xA2, 0xDA, 0x00, 0x23, 0x36};
/ * *** NTP Server-instellingen *** * /
/ * us.pool.ntp.org NTP-server
(Ingesteld op uw tijdserver van keuze) * /
IPAdres tijdserver (216 23, 247, 62);
/ * Zet dit op de offset (in seconden) op uw lokale tijd
In dit voorbeeld is GMT - 4 * /
Const lange timeZoneOffset = L-14400;
/ * Syncs met NTP server elke 15 seconden voor het testen,
ingesteld op 1 uur of meer redelijk * /
unsigned int ntpSyncTime = 3600;
/ * HET WIJZIGEN VAN DEZE VARIABELEN OP UW EIGEN RISICO * /
lokale poort te luisteren naar UDP-pakketten
unsigned int localPort = 8888;
NTP-tijdstempel is in de eerste 48 bytes van het bericht
Const int NTP_PACKET_SIZE = 48;
Buffer te houden van binnenkomende en uitgaande pakketten
byte packetBuffer [NTP_PACKET_SIZE];
Een UDP-instantie te laten verzenden en ontvangen van pakketten via UDP
EthernetUDP Udp;
Houdt spoor van hoe lang geleden we de NTP-server bijgewerkt
unsigned long ntpLastUpdate = 0;
Controleren van de laatste tijd klok weergegeven (niet in productie)
time_t prevDisplay = 0;
VOID Setup {}
Serial.begin(9600);
Ethernet-shield en NTP setup
int i = 0;
int DHCP = 0;
DHCP = Ethernet.begin(mac);
Proberen om DHCP-instellingen 30 keer voordat hij
terwijl (DHCP == 0 & & ik < 30) {}
delay(1000);
DHCP = Ethernet.begin(mac);
i ++;
}
if (!. DHCP) {}
Serial.println ("DHCP is mislukt");
for(;;); //Infinite lus omdat DHCP is mislukt
}
Serial.println ("DHCP-Success");
Proberen om de datum en tijd
int trys = 0;
while(!getTimeAndDate() & & trys < 10) {}
trys ++;
}
}
Breng geen wijzigingen aan deze functie, het wordt gebruikt door het systeem
int getTimeAndDate() {}
int vlag = 0;
UDP.begin(localPort);
sendNTPpacket(timeServer);
delay(1000);
Als (Udp.parsePacket()) {}
UDP.Read(packetBuffer,NTP_PACKET_SIZE); Lees het pakket in de buffer
unsigned long highWord, lowWord, tijdperk;
highWord = woord (packetBuffer [40], packetBuffer[41]);
lowWord = woord (packetBuffer [42], packetBuffer[43]);
tijdperk = highWord << 16 | lowWord;
tijdperk = epoch - 2208988800 + timeZoneOffset;
vlag = 1;
setTime(epoch);
ntpLastUpdate = now();
}
retourneren van de vlag;
}
Breng geen wijzigingen aan deze functie, het wordt gebruikt door het systeem
unsigned long sendNTPpacket (IP-adres & adres)
{
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 (adres, 123);
UDP.write(packetBuffer,NTP_PACKET_SIZE);
Udp.endPacket();
}
Weergave van de klok van de tijd en datum (Basic)
ongeldig 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();
}
Utility functie voor weergave van de klok: prenten voorafgaand aan de dikke darm en 0 voorsprong
VOID printDigits (int cijfers) {}
Serial.Print(":");
if(digits < 10)
Serial.Print('0');
Serial.Print(digits);
}
Dit is waar alle magie gebeurt...
void loop {}
De tijd zo vaak als de tijd die u ingesteld boven via NTP-server bijwerken
Als (nu ()-ntpLastUpdate > ntpSyncTime) {}
int trys = 0;
while(!getTimeAndDate() & & trys < 10) {}
trys ++;
}
if(trys<10) {}
Serial.println ("ntp server update success");
}
else {}
Serial.println ("ntp server update failed");
}
}
Tijd weergeven als het is gewijzigd door meer dan een seconde.
Als (nu()! = prevDisplay) {}
prevDisplay = now();
clockDisplay();
}
}