Difference between revisions of "Arduino: LCD Clock NTP Sync"
Jump to navigation
Jump to search
Onnowpurbo (talk | contribs) |
Onnowpurbo (talk | contribs) |
||
Line 9: | Line 9: | ||
#include <EthernetUdp.h> | #include <EthernetUdp.h> | ||
#include <Time.h> | #include <Time.h> | ||
− | + | #include <LiquidCrystal.h> | |
+ | |||
/* ******** Ethernet Card Settings ******** */ | /* ******** Ethernet Card Settings ******** */ | ||
// Set this to your Ethernet Card Mac Address | // Set this to your Ethernet Card Mac Address | ||
Line 15: | Line 16: | ||
/* ******** NTP Server Settings ******** */ | /* ******** NTP Server Settings ******** */ | ||
− | /* | + | /* us.pool.ntp.org NTP server |
(Set to your time server of choice) */ | (Set to your time server of choice) */ | ||
IPAddress timeServer(202, 65, 114, 202); | IPAddress timeServer(202, 65, 114, 202); | ||
Line 26: | Line 27: | ||
set to 1 hour or more to be reasonable */ | set to 1 hour or more to be reasonable */ | ||
unsigned int ntpSyncTime = 3600; | unsigned int ntpSyncTime = 3600; | ||
+ | |||
/* ALTER THESE VARIABLES AT YOUR OWN RISK */ | /* ALTER THESE VARIABLES AT YOUR OWN RISK */ | ||
Line 65: | Line 67: | ||
trys++; | trys++; | ||
} | } | ||
− | } | + | } |
− | + | ||
// Do not alter this function, it is used by the system | // Do not alter this function, it is used by the system | ||
int getTimeAndDate() { | int getTimeAndDate() { | ||
Line 103: | Line 105: | ||
Udp.endPacket(); | Udp.endPacket(); | ||
} | } | ||
− | + | ||
+ | void displaytime() | ||
+ | { | ||
+ | LiquidCrystal lcd(12,11,5,4,3,2); | ||
+ | lcd.setCursor(0,0); | ||
+ | if (hour() < 10) lcd.print ("0"); | ||
+ | lcd.print (hour()); | ||
+ | lcd.print (":"); | ||
+ | if (minute() < 10) lcd.print ("0"); | ||
+ | lcd.print (minute()); | ||
+ | lcd.print (":"); | ||
+ | if (second() < 10) lcd.print ("0"); | ||
+ | lcd.print (second()); | ||
+ | lcd.print (" "); | ||
+ | |||
+ | return; | ||
+ | } | ||
+ | |||
// Clock display of the time and date (Basic) | // Clock display of the time and date (Basic) | ||
void clockDisplay(){ | void clockDisplay(){ | ||
Line 117: | Line 136: | ||
Serial.println(); | Serial.println(); | ||
} | } | ||
− | + | ||
// Utility function for clock display: prints preceding colon and leading 0 | // Utility function for clock display: prints preceding colon and leading 0 | ||
void printDigits(int digits){ | void printDigits(int digits){ | ||
Line 141: | Line 160: | ||
} | } | ||
} | } | ||
− | + | ||
// Display the time if it has changed by more than a second. | // Display the time if it has changed by more than a second. | ||
if( now() != prevDisplay){ | if( now() != prevDisplay){ | ||
prevDisplay = now(); | prevDisplay = now(); | ||
− | clockDisplay(); | + | clockDisplay(); |
− | + | displaytime(); | |
+ | } | ||
} | } |
Latest revision as of 06:59, 1 January 2018
//sample code originated at http://www.openreefs.com/ntpServer //modified by Steve Spence, http://arduinotronics.blogspot.com #include <SPI.h> #include <Ethernet.h> #include <EthernetUdp.h> #include <Time.h> #include <LiquidCrystal.h>
/* ******** Ethernet Card Settings ******** */ // Set this to your Ethernet Card Mac Address byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x23, 0x36 }; /* ******** NTP Server Settings ******** */ /* us.pool.ntp.org NTP server (Set to your time server of choice) */ IPAddress timeServer(202, 65, 114, 202); /* Set this to the offset (in seconds) to your local time This example is GMT +7 */ const long timeZoneOffset = 25200L; /* Syncs to NTP server every 15 seconds for testing, set to 1 hour or more to be reasonable */ unsigned int ntpSyncTime = 3600; /* ALTER THESE VARIABLES AT YOUR OWN RISK */ // local port to listen for UDP packets unsigned int localPort = 8888; // NTP time stamp is in the first 48 bytes of the message const int NTP_PACKET_SIZE= 48; // Buffer to hold incoming and outgoing packets byte packetBuffer[NTP_PACKET_SIZE]; // A UDP instance to let us send and receive packets over UDP EthernetUDP Udp; // Keeps track of how long ago we updated the NTP server unsigned long ntpLastUpdate = 0; // Check last time clock displayed (Not in Production) time_t prevDisplay = 0; void setup() { Serial.begin(9600); // Ethernet shield and NTP setup int i = 0; int DHCP = 0; DHCP = Ethernet.begin(mac); //Try to get dhcp settings 30 times before giving up while( DHCP == 0 && i < 30){ delay(1000); DHCP = Ethernet.begin(mac); i++; } if(!DHCP){ Serial.println("DHCP FAILED"); for(;;); //Infinite loop because DHCP Failed } Serial.println("DHCP Success"); //Try to get the date and time int trys=0; while(!getTimeAndDate() && trys<10) { trys++; } } // Do not alter this function, it is used by the system int getTimeAndDate() { int flag=0; Udp.begin(localPort); sendNTPpacket(timeServer); delay(1000); if (Udp.parsePacket()){ Udp.read(packetBuffer,NTP_PACKET_SIZE); // read the packet into the buffer unsigned long highWord, lowWord, epoch; highWord = word(packetBuffer[40], packetBuffer[41]); lowWord = word(packetBuffer[42], packetBuffer[43]); epoch = highWord << 16 | lowWord; epoch = epoch - 2208988800 + timeZoneOffset; flag=1; setTime(epoch); ntpLastUpdate = now(); } return flag; }
// Do not alter this function, it is used by the system unsigned long sendNTPpacket(IPAddress& address) { 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(address, 123); Udp.write(packetBuffer,NTP_PACKET_SIZE); Udp.endPacket(); } void displaytime() { LiquidCrystal lcd(12,11,5,4,3,2); lcd.setCursor(0,0); if (hour() < 10) lcd.print ("0"); lcd.print (hour()); lcd.print (":"); if (minute() < 10) lcd.print ("0"); lcd.print (minute()); lcd.print (":"); if (second() < 10) lcd.print ("0"); lcd.print (second()); lcd.print (" "); return; } // Clock display of the time and date (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 function for clock display: prints preceding colon and leading 0 void printDigits(int digits){ Serial.print(":"); if(digits < 10) Serial.print('0'); Serial.print(digits); } // This is where all the magic happens... void loop() { // Update the time via NTP server as often as the time you set at the top if(now()-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"); } } // Display the time if it has changed by more than a second. if( now() != prevDisplay){ prevDisplay = now(); clockDisplay(); displaytime(); } }