/*
* W5100/ENC28J60 Ethernet Module NTP Client example.
*/
//#include <UIPEthernet.h> //
https://github.com/UIPEthernet/UIPEthernet
#include <SPI.h>
#include <Ethernet.h>
#include <Dns.h>
#include
<TimeLib.h>
// https://github.com/PaulStoffregen/Time
//#define
MODULE
"ENC28J60"
#define
MODULE
"W5100"
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
unsigned int localPort =
8888; // local port to
listen for UDP packets
IPAddress timeServer;
const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the
first 48 bytes of the message
byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold
incoming and outgoing packets
// A UDP instance to let us send and receive packets over
UDP
EthernetUDP Udp;
// dow_char() 曜日文字を戻す [Sun,Mon....]
char * dow_char_EN(byte days) {
char *you[] =
{"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
return you[days];
}
// dow_char() 曜日文字を戻す [日曜,火曜....]
char * dow_char_JP(byte days) {
char *you[] = {"日曜","月曜","火曜","水曜","木曜","金曜","土曜"};
return you[days];
}
// dow() 曜日を示す数値を戻す[0-Sunday, 1-Monday etc.]
uint8_t dow(unsigned long t) {
return ((t / 86400) + 4) % 7;
}
void showTime(char * title, time_t timet, char * dow) {
Serial.print(title);
Serial.print(year(timet));
Serial.print("/");
Serial.print(month(timet));
Serial.print("/");
Serial.print(day(timet));
Serial.print(" ");
Serial.print(hour(timet));
Serial.print(":");
Serial.print(minute(timet));
Serial.print(":");
Serial.print(second(timet));
Serial.print(" [");
Serial.print(dow);
Serial.println("]");
}
void setup()
{
delay(1000);
Serial.begin(9600);
// start Ethernet and UDP
if (!Ethernet.begin(mac) ) {
Serial.println("Failed to configure
Ethernet using DHCP");
// no point in carrying on, so do
nothing forevermore:
for(;;)
;
}
// Resolving host names
DNSClient dns;
dns.begin(Ethernet.dnsServerIP());
//
if(dns.getHostByName("ntp.jst.mfeed.ad.jp",timeServer) ==
1) {
if(dns.getHostByName("ntp.nict.jp",timeServer) ==
1) {
Serial.print(F("ntp = "));
Serial.println(timeServer);
} else {
Serial.print(F("dns lookup failed"));
while(1) { }
}
Udp.begin(localPort);
}
void loop()
{
sendNTPpacket(timeServer); // send an NTP packet to
a time server
// wait to see if a reply is available
if ( Udp.parsePacket() ) {
Serial.print("\n[NTP Client for ");
Serial.print(MODULE);
Serial.println("]");
// We've received a packet, read the
data from it
Udp.read(packetBuffer,NTP_PACKET_SIZE); // read the
packet into the buffer
//the timestamp starts at byte 40 of
the received packet and is four bytes,
// or two words, long. First, esxtract
the two words:
unsigned long highWord =
word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord =
word(packetBuffer[42], packetBuffer[43]);
// combine the four bytes (two words)
into a long integer
// this is NTP time (seconds since Jan
1 1900):
unsigned long secsSince1900 = highWord
<< 16 | lowWord;
Serial.print("Seconds since Jan 1 1900
= " );
Serial.println(secsSince1900);
// now convert NTP time into everyday
time:
// Unix time starts on Jan 1 1970. In
seconds, that's 2208988800:
const unsigned long seventyYears =
2208988800UL;
// subtract seventy years:
unsigned long epoch = secsSince1900 -
seventyYears;
// print Unix time:
Serial.print("Unix time = ");
Serial.println(epoch);
#if 0
// print the hour, minute and second:
Serial.print("The UTC time is
"); // UTC is the time
at Greenwich Meridian (GMT)
Serial.print((epoch % 86400L) /
3600); // print the hour (86400 equals secs per day)
Serial.print(':');
if ( ((epoch % 3600) / 60) < 10 ) {
// In the first 10 minutes
of each hour, we'll want a leading '0'
Serial.print('0');
}
Serial.print((epoch % 3600) /
60); // print the minute (3600 equals secs per minute)
Serial.print(':');
if ( (epoch % 60) < 10 ) {
// In the first 10 seconds
of each minute, we'll want a leading '0'
Serial.print('0');
}
Serial.println(epoch %60); // print the
second
#endif
// グリニッジ標準時間
uint8_t DayOfWeek = dow(epoch);
showTime("The UTC time is ", epoch,
dow_char_EN(DayOfWeek));
// 日本標準時にあわせるために+9時間しておく
DayOfWeek = dow(epoch + (9 * 60 * 60));
showTime("The JST time is ", epoch + (9
* 60 * 60), dow_char_JP(DayOfWeek));
} else {
Serial.println("We waiting a packet");
}
// wait ten seconds before asking for the time
again
delay(10000);
}
// send an NTP request to the time server at the given
address
unsigned long sendNTPpacket(IPAddress& address)
{
// set all bytes in the buffer to 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Initialize values needed to form NTP request
// (see URL above for details on the packets)
packetBuffer[0] = 0b11100011; // LI,
Version, Mode
packetBuffer[1] = 0; //
Stratum, or type of clock
packetBuffer[2] = 6; //
Polling Interval
packetBuffer[3] = 0xEC; // Peer Clock
Precision
// 8 bytes of zero for Root Delay & Root
Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(address, 123); //NTP requests are
to port 123
Udp.write(packetBuffer,NTP_PACKET_SIZE);
Udp.endPacket();
} |