<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://lms.onnocenter.or.id/wiki/index.php?action=history&amp;feed=atom&amp;title=Arduino%3A_RTC_DS3231_NTP_Sync</id>
	<title>Arduino: RTC DS3231 NTP Sync - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://lms.onnocenter.or.id/wiki/index.php?action=history&amp;feed=atom&amp;title=Arduino%3A_RTC_DS3231_NTP_Sync"/>
	<link rel="alternate" type="text/html" href="https://lms.onnocenter.or.id/wiki/index.php?title=Arduino:_RTC_DS3231_NTP_Sync&amp;action=history"/>
	<updated>2026-04-20T19:51:15Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://lms.onnocenter.or.id/wiki/index.php?title=Arduino:_RTC_DS3231_NTP_Sync&amp;diff=51311&amp;oldid=prev</id>
		<title>Onnowpurbo at 00:56, 7 June 2018</title>
		<link rel="alternate" type="text/html" href="https://lms.onnocenter.or.id/wiki/index.php?title=Arduino:_RTC_DS3231_NTP_Sync&amp;diff=51311&amp;oldid=prev"/>
		<updated>2018-06-07T00:56:39Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://lms.onnocenter.or.id/wiki/index.php?title=Arduino:_RTC_DS3231_NTP_Sync&amp;amp;diff=51311&amp;amp;oldid=51310&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Onnowpurbo</name></author>
	</entry>
	<entry>
		<id>https://lms.onnocenter.or.id/wiki/index.php?title=Arduino:_RTC_DS3231_NTP_Sync&amp;diff=51310&amp;oldid=prev</id>
		<title>Onnowpurbo: Created page with &quot;==Source==   #include &quot;Wire.h&quot; #include &lt;Time.h&gt; #include &lt;SPI.h&gt; #include &lt;Ethernet.h&gt; #include &lt;EthernetUdp.h&gt;  #define DS3231_I2C_ADDRESS 0x68  // Ethernet library configur...&quot;</title>
		<link rel="alternate" type="text/html" href="https://lms.onnocenter.or.id/wiki/index.php?title=Arduino:_RTC_DS3231_NTP_Sync&amp;diff=51310&amp;oldid=prev"/>
		<updated>2018-06-07T00:51:43Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==Source==   #include &amp;quot;Wire.h&amp;quot; #include &amp;lt;Time.h&amp;gt; #include &amp;lt;SPI.h&amp;gt; #include &amp;lt;Ethernet.h&amp;gt; #include &amp;lt;EthernetUdp.h&amp;gt;  #define DS3231_I2C_ADDRESS 0x68  // Ethernet library configur...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Source==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;Wire.h&amp;quot;&lt;br /&gt;
#include &amp;lt;Time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Ethernet.h&amp;gt;&lt;br /&gt;
#include &amp;lt;EthernetUdp.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define DS3231_I2C_ADDRESS 0x68&lt;br /&gt;
&lt;br /&gt;
// Ethernet library configuration&lt;br /&gt;
byte mac[] = { 0x24, 0x7B, 0xA2, 0x4A, 0x52, 0x10 };&lt;br /&gt;
IPAddress timeServer(128, 138, 140, 44 ); // time.nist.gov&lt;br /&gt;
&lt;br /&gt;
unsigned int localPort = 8888;&lt;br /&gt;
const int NTP_PACKET_SIZE= 48;     &lt;br /&gt;
byte packetBuffer[NTP_PACKET_SIZE]; &lt;br /&gt;
EthernetUDP Udp;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // Setup Communication&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.print(&amp;quot;OK Serial\n&amp;quot;);&lt;br /&gt;
  Ethernet.begin(mac);&lt;br /&gt;
  Serial.print(&amp;quot;OK LAN\n&amp;quot;);&lt;br /&gt;
  Udp.begin(localPort);&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;OK Comm\n&amp;quot;);&lt;br /&gt;
  setSyncInterval(10); // Set seconds between re-sync&lt;br /&gt;
  setSyncProvider(getNtpTime);&lt;br /&gt;
  getNtpTime;&lt;br /&gt;
    Serial.print(&amp;quot;OK NTP\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  // set the initial time here:&lt;br /&gt;
  // DS3231 seconds, minutes, hours, day, date, month, year&lt;br /&gt;
  // setDS3231time(30,33,9, 2 ,28,11,16);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  setSyncProvider(getNtpTime);&lt;br /&gt;
  // set the initial time here:&lt;br /&gt;
  // DS3231 seconds, minutes, hours, day, date, month, year&lt;br /&gt;
  setDS3231time(second(), minute(), hour()+7, 5 , 7, 6, 18);&lt;br /&gt;
  &lt;br /&gt;
  displayTime(); // display the real-time clock data on the Serial Monitor,&lt;br /&gt;
  getNtpTime;&lt;br /&gt;
  // delay(1000);  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*----------------- DS3231 ----------------------*/&lt;br /&gt;
&lt;br /&gt;
// Convert normal decimal numbers to binary coded decimal&lt;br /&gt;
byte decToBcd(byte val)&lt;br /&gt;
{&lt;br /&gt;
  return ( (val / 10 * 16) + (val % 10) );&lt;br /&gt;
}&lt;br /&gt;
// Convert binary coded decimal to normal decimal numbers&lt;br /&gt;
byte bcdToDec(byte val)&lt;br /&gt;
{&lt;br /&gt;
  return ( (val / 16 * 10) + (val % 16) );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte&lt;br /&gt;
                   dayOfMonth, byte month, byte year)&lt;br /&gt;
{&lt;br /&gt;
  // sets time and date data to DS3231&lt;br /&gt;
  Wire.beginTransmission(DS3231_I2C_ADDRESS);&lt;br /&gt;
  Wire.write(0); // set next input to start at the seconds register&lt;br /&gt;
  Wire.write(decToBcd(second)); // set seconds&lt;br /&gt;
  Wire.write(decToBcd(minute)); // set minutes&lt;br /&gt;
  Wire.write(decToBcd(hour)); // set hours&lt;br /&gt;
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)&lt;br /&gt;
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)&lt;br /&gt;
  Wire.write(decToBcd(month)); // set month&lt;br /&gt;
  Wire.write(decToBcd(year)); // set year (0 to 99)&lt;br /&gt;
  Wire.endTransmission();&lt;br /&gt;
}&lt;br /&gt;
void readDS3231time(byte *second,&lt;br /&gt;
                    byte *minute,&lt;br /&gt;
                    byte *hour,&lt;br /&gt;
                    byte *dayOfWeek,&lt;br /&gt;
                    byte *dayOfMonth,&lt;br /&gt;
                    byte *month,&lt;br /&gt;
                    byte *year)&lt;br /&gt;
{&lt;br /&gt;
  Wire.beginTransmission(DS3231_I2C_ADDRESS);&lt;br /&gt;
  Wire.write(0); // set DS3231 register pointer to 00h&lt;br /&gt;
  Wire.endTransmission();&lt;br /&gt;
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);&lt;br /&gt;
  // request seven bytes of data from DS3231 starting from register 00h&lt;br /&gt;
  *second = bcdToDec(Wire.read() &amp;amp; 0x7f);&lt;br /&gt;
  *minute = bcdToDec(Wire.read());&lt;br /&gt;
  *hour = bcdToDec(Wire.read() &amp;amp; 0x3f);&lt;br /&gt;
  *dayOfWeek = bcdToDec(Wire.read());&lt;br /&gt;
  *dayOfMonth = bcdToDec(Wire.read());&lt;br /&gt;
  *month = bcdToDec(Wire.read());&lt;br /&gt;
  *year = bcdToDec(Wire.read());&lt;br /&gt;
}&lt;br /&gt;
void displayTime()&lt;br /&gt;
{&lt;br /&gt;
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;&lt;br /&gt;
  // retrieve data from DS3231&lt;br /&gt;
  readDS3231time(&amp;amp;second, &amp;amp;minute, &amp;amp;hour, &amp;amp;dayOfWeek, &amp;amp;dayOfMonth, &amp;amp;month,&lt;br /&gt;
                 &amp;amp;year);&lt;br /&gt;
  // send it to the serial monitor&lt;br /&gt;
  Serial.print(hour, DEC);&lt;br /&gt;
  // convert the byte variable to a decimal number when displayed&lt;br /&gt;
  Serial.print(&amp;quot;:&amp;quot;);&lt;br /&gt;
  if (minute &amp;lt; 10)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.print(&amp;quot;0&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.print(minute, DEC);&lt;br /&gt;
  Serial.print(&amp;quot;:&amp;quot;);&lt;br /&gt;
  if (second &amp;lt; 10)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.print(&amp;quot;0&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.print(second, DEC);&lt;br /&gt;
  Serial.print(&amp;quot; &amp;quot;);&lt;br /&gt;
  Serial.print(dayOfMonth, DEC);&lt;br /&gt;
  Serial.print(&amp;quot;/&amp;quot;);&lt;br /&gt;
  Serial.print(month, DEC);&lt;br /&gt;
  Serial.print(&amp;quot;/&amp;quot;);&lt;br /&gt;
  Serial.print(year, DEC);&lt;br /&gt;
  Serial.print(&amp;quot; Day of week: &amp;quot;);&lt;br /&gt;
  switch (dayOfWeek) {&lt;br /&gt;
    case 1:&lt;br /&gt;
      Serial.println(&amp;quot;Sunday&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
    case 2:&lt;br /&gt;
      Serial.println(&amp;quot;Monday&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
    case 3:&lt;br /&gt;
      Serial.println(&amp;quot;Tuesday&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
    case 4:&lt;br /&gt;
      Serial.println(&amp;quot;Wednesday&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
    case 5:&lt;br /&gt;
      Serial.println(&amp;quot;Thursday&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
    case 6:&lt;br /&gt;
      Serial.println(&amp;quot;Friday&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
    case 7:&lt;br /&gt;
      Serial.println(&amp;quot;Saturday&amp;quot;);&lt;br /&gt;
      break;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*-------- NTP code ----------*/&lt;br /&gt;
&lt;br /&gt;
unsigned long getNtpTime()&lt;br /&gt;
{&lt;br /&gt;
  sendNTPpacket(timeServer); // send an NTP packet to a time server&lt;br /&gt;
    delay(500);&lt;br /&gt;
  &lt;br /&gt;
    if ( Udp.parsePacket() ) {&lt;br /&gt;
     Udp.read(packetBuffer,NTP_PACKET_SIZE);&lt;br /&gt;
     unsigned long hi = word(packetBuffer[40], packetBuffer[41]);&lt;br /&gt;
     unsigned long low = word(packetBuffer[42], packetBuffer[43]);&lt;br /&gt;
     unsigned long secsSince1900 = hi &amp;lt;&amp;lt; 16 | low; &lt;br /&gt;
     const unsigned long seventyYears = 2208988800UL;     &lt;br /&gt;
     unsigned long epoch = secsSince1900 - seventyYears;&lt;br /&gt;
     return epoch;&lt;br /&gt;
  }&lt;br /&gt;
  return 0; // return 0 if unable to get the time&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
unsigned long sendNTPpacket(IPAddress&amp;amp; address)&lt;br /&gt;
{&lt;br /&gt;
  memset(packetBuffer, 0, NTP_PACKET_SIZE);  // set all bytes in the buffer to 0&lt;br /&gt;
&lt;br /&gt;
  // Initialize values needed to form NTP request&lt;br /&gt;
  packetBuffer[0] = B11100011;   // LI, Version, Mode&lt;br /&gt;
  packetBuffer[1] = 0;     // Stratum&lt;br /&gt;
  packetBuffer[2] = 6;     // Max Interval between messages in seconds&lt;br /&gt;
  packetBuffer[3] = 0xEC;  // Clock Precision&lt;br /&gt;
  // bytes 4 - 11 are for Root Delay and Dispersion and were set to 0 by memset&lt;br /&gt;
  packetBuffer[12]  = 49;  // four-byte reference ID identifying&lt;br /&gt;
  packetBuffer[13]  = 0x4E;&lt;br /&gt;
  packetBuffer[14]  = 49;&lt;br /&gt;
  packetBuffer[15]  = 52;&lt;br /&gt;
&lt;br /&gt;
  // send the packet requesting a timestamp:&lt;br /&gt;
  Udp.beginPacket(address, 123); //NTP requests are to port 123&lt;br /&gt;
  Udp.write(packetBuffer,NTP_PACKET_SIZE);&lt;br /&gt;
  Udp.endPacket();&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Onnowpurbo</name></author>
	</entry>
</feed>