Difference between revisions of "Arduino: LCD Clock NTP Sync"
		
		
		
		
		
		Jump to navigation
		Jump to search
		
				
		
		
	
Onnowpurbo (talk | contribs)  (Created page with " //sample code originated at http://www.openreefs.com/ntpServer  //modified by Steve Spence, http://arduinotronics.blogspot.com    #include <SPI.h>  #include <Ethernet.h>  #in...")  | 
				Onnowpurbo (talk | contribs)   | 
				||
| (One intermediate revision by the same user not shown) | |||
| Line 1: | Line 1: | ||
| + | |||
| + | |||
| + | |||
  //sample code originated at http://www.openreefs.com/ntpServer  |   //sample code originated at http://www.openreefs.com/ntpServer  | ||
  //modified by Steve Spence, http://arduinotronics.blogspot.com  |   //modified by Steve Spence, http://arduinotronics.blogspot.com  | ||
| Line 6: | 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 14: | Line 18: | ||
  /* us.pool.ntp.org NTP server  |   /* us.pool.ntp.org NTP server  | ||
     (Set to your time server of choice) */  |      (Set to your time server of choice) */  | ||
| − |   IPAddress timeServer(  | + |   IPAddress timeServer(202, 65, 114, 202);  | 
  /* Set this to the offset (in seconds) to your local time  |   /* Set this to the offset (in seconds) to your local time  | ||
| − |      This example is GMT   | + |      This example is GMT +7 */  | 
| − |   const long timeZoneOffset =   | + |   const long timeZoneOffset = 25200L;    | 
  /* Syncs to NTP server every 15 seconds for testing,  |   /* Syncs to NTP server every 15 seconds for testing,  | ||
     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 */  | ||
  // local port to listen for UDP packets  |   // local port to listen for UDP packets  | ||
| Line 37: | Line 42: | ||
  // Check last time clock displayed (Not in Production)  |   // Check last time clock displayed (Not in Production)  | ||
  time_t prevDisplay = 0;              |   time_t prevDisplay = 0;              | ||
| − | + | ||
  void setup() {  |   void setup() {  | ||
     Serial.begin(9600);  |      Serial.begin(9600);  | ||
| Line 62: | 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  | ||
| Line 99: | Line 104: | ||
    Udp.write(packetBuffer,NTP_PACKET_SIZE);  |     Udp.write(packetBuffer,NTP_PACKET_SIZE);  | ||
    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;    | ||
  }  |   }  | ||
| Line 114: | 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 142: | Line 164: | ||
      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();
    }
}