Arduino Internet tid klienten (2 / 10 steg)
Steg 2: kod
Du behöver mac-adressen från botten av din Ethernet Shield, men IP, Gateway och nätmask är alla erhållna throgh DHCP. Du behöver också tid serveradressen (se nästa steg)
Den kod som behöver laddas upp till din Arduino är följande:
exempelkod påbörjade på http://www.openreefs.com/ntpServer
ändrat av Steve Spence, http://arduinotronics.blogspot.com
#include < SPI.h >
#include < Ethernet.h >
#include < EthernetUdp.h >
#include < Time.h >
/ * *** Kort Ethernetinställningar *** * /
Ange detta till din Mac-adress Ethernet-kort
byte [mac] = {0x90, 0xA2, 0xDA, 0x00, 0x23, 0x36};
/ * *** NTP serverinställningar *** * /
/ * us.pool.ntp.org NTP-server
(Inställt på din tidsserver val) * /
IP-adress timeServer (216, 23, 247, 62);
/ * Anger detta till offset (i sekunder) till din lokala tid
Detta exempel är GMT - 4 * /
CONST long timeZoneOffset =-14400 L.
/ * Synkroniseras till NTP-server var 15 sekund för provning,
1 timme eller mer rimlig * /
unsigned int ntpSyncTime = 3600;
/ * ÄNDRA DESSA VARIABLER PÅ EGEN RISK * /
lokal port att lyssna till UDP-paket
unsigned int localPort = 8888;
NTP tidsstämpel är i de första 48 byte av meddelandet
CONST int NTP_PACKET_SIZE = 48.
Buffert för att hålla inkommande och utgående paket
byte packetBuffer [NTP_PACKET_SIZE];
En UDP-instans att låta oss skicka och ta emot paket över UDP
EthernetUDP Udp;
Håller reda på hur länge sedan vi uppdaterade NTP-server
osignerade långa ntpLastUpdate = 0;
Kolla senaste klocka (inte visas i produktion)
tid prevDisplay = 0;
void setup() {
Serial.BEGIN(9600);
Ethernet-shield och NTP setup
int jag = 0;
int DHCP = 0;
DHCP = Ethernet.begin(mac);
Försöka få DHCP-inställningar 30 gånger innan den ger upp
medan (DHCP == 0 & & jag < 30) {
Delay(1000);
DHCP = Ethernet.begin(mac);
i ++;
}
IF (!. DHCP) {
Serial.println ("DHCP misslyckades");
for(;;); //Infinite loop eftersom DHCP misslyckades
}
Serial.println ("DHCP-framgång");
Försöka få datum och tid
int trys = 0;
While(!getTimeAndDate() & & trys < 10) {
trys ++;
}
}
Ändrar inte denna funktion, det används av systemet
int getTimeAndDate() {
int flagga = 0;
UDP.BEGIN(localPort);
sendNTPpacket(timeServer);
Delay(1000);
om (Udp.parsePacket()) {
UDP.Read(packetBuffer,NTP_PACKET_SIZE); läsa in paket i bufferten
osignerade långa highWord, lowWord, epoken;
highWord = word (packetBuffer [40], packetBuffer[41]);
lowWord = word (packetBuffer [42], packetBuffer[43]);
epoken = highWord << 16 | lowWord;
epoken = epok - 2208988800 + timeZoneOffset;
Flagga = 1;
setTime(epoch);
ntpLastUpdate = now();
}
returnera flagg.
}
Ändrar inte denna funktion, det används av systemet
osignerade långa sendNTPpacket (IP-adress och adress)
{
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 (adress, 123);
UDP.write(packetBuffer,NTP_PACKET_SIZE);
Udp.endPacket();
}
Klockan visning av tid och datum (Basic)
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();
}
Utility funktion för klockdisplay: utskrifter före kolon och ledande 0
void printDigits (int siffror) {
Serial.Print(":");
IF(digits < 10)
Serial.Print('0');
Serial.Print(digits);
}
Detta är där alla magiska händer...
void loop() {
Uppdatera tiden via NTP-server så ofta som den tid som du överst
om (nu ()-ntpLastUpdate > ntpSyncTime) {
int trys = 0;
While(!getTimeAndDate() & & trys < 10) {
trys ++;
}
IF(trys<10) {
Serial.println ("ntp server update framgång");
}
annat {
Serial.println ("ntp server uppdatera misslyckades");
}
}
Visa tid om det har ändrats av mer än en sekund.
om (now()! = prevDisplay) {
prevDisplay = now();
clockDisplay();
}
}