summaryrefslogtreecommitdiff
path: root/Time
diff options
context:
space:
mode:
authorMike Beattie <mike@ethernal.org>2012-03-20 23:25:17 +1300
committerMike Beattie <mike@ethernal.org>2012-03-20 23:25:17 +1300
commitcb7bd533cb2b505441ca9a35c9897db358a30b47 (patch)
treefd20d304a519730798433e9835ce3e8e12f703fc /Time
Add Time library
Signed-off-by: Mike Beattie <mike@ethernal.org>
Diffstat (limited to 'Time')
-rw-r--r--Time/DateStrings.cpp80
-rw-r--r--Time/Examples/Processing/SyncArduinoClock/SyncArduinoClock.pde70
-rw-r--r--Time/Examples/Processing/SyncArduinoClock/readme.txt9
-rw-r--r--Time/Examples/TimeGPS/TimeGPS.pde82
-rw-r--r--Time/Examples/TimeNTP/TimeNTP.pde120
-rw-r--r--Time/Examples/TimeRTC/TimeRTC.pde47
-rw-r--r--Time/Examples/TimeRTCLog/TimeRTCLog.pde106
-rw-r--r--Time/Examples/TimeRTCSet/TimeRTCSet.pde82
-rw-r--r--Time/Examples/TimeSerial/TimeSerial.pde82
-rw-r--r--Time/Examples/TimeSerialDateStrings/TimeSerialDateStrings.pde80
-rw-r--r--Time/Readme.txt131
-rw-r--r--Time/Time.cpp307
-rw-r--r--Time/Time.h126
-rw-r--r--Time/keywords.txt33
14 files changed, 1355 insertions, 0 deletions
diff --git a/Time/DateStrings.cpp b/Time/DateStrings.cpp
new file mode 100644
index 0000000..7610c8f
--- /dev/null
+++ b/Time/DateStrings.cpp
@@ -0,0 +1,80 @@
+/* DateStrings.cpp
+ * Definitions for date strings for use with the Time library
+ *
+ * No memory is consumed in the sketch if your code does not call any of the string methods
+ * You can change the text of the strings, make sure the short strings are each exactly 3 characters
+ * the long strings can be any length up to the constant dt_MAX_STRING_LEN defined in Time.h
+ *
+ */
+
+#include <avr/pgmspace.h>
+#include "Time.h"
+
+// the short strings for each day or month must be exactly dt_SHORT_STR_LEN
+#define dt_SHORT_STR_LEN 3 // the length of short strings
+
+static char buffer[dt_MAX_STRING_LEN+1]; // must be big enough for longest string and the terminating null
+
+char monthStr1[] PROGMEM = "January";
+char monthStr2[] PROGMEM = "February";
+char monthStr3[] PROGMEM = "March";
+char monthStr4[] PROGMEM = "April";
+char monthStr5[] PROGMEM = "May";
+char monthStr6[] PROGMEM = "June";
+char monthStr7[] PROGMEM = "July";
+char monthStr8[] PROGMEM = "August";
+char monthStr9[] PROGMEM = "September";
+char monthStr10[] PROGMEM = "October";
+char monthStr11[] PROGMEM = "November";
+char monthStr12[] PROGMEM = "December";
+
+PGM_P monthNames_P[] PROGMEM =
+{
+ "",monthStr1,monthStr2,monthStr3,monthStr4,monthStr5,monthStr6,
+ monthStr7,monthStr8,monthStr9,monthStr10,monthStr11,monthStr12
+};
+
+char monthShortNames_P[] PROGMEM = "ErrJanFebMarAprMayJunJulAugSepOctNovDec";
+
+char dayStr0[] PROGMEM = "Err";
+char dayStr1[] PROGMEM = "Sunday";
+char dayStr2[] PROGMEM = "Monday";
+char dayStr3[] PROGMEM = "Tuesday";
+char dayStr4[] PROGMEM = "Wednesday";
+char dayStr5[] PROGMEM = "Thursday";
+char dayStr6[] PROGMEM = "Friday";
+char dayStr7[] PROGMEM = "Saturday";
+
+PGM_P dayNames_P[] PROGMEM = { dayStr0,dayStr1,dayStr2,dayStr3,dayStr4,dayStr5,dayStr6,dayStr7};
+char dayShortNames_P[] PROGMEM = "ErrSunMonTueWedThrFriSat";
+
+/* functions to return date strings */
+
+char* monthStr(uint8_t month)
+{
+ strcpy_P(buffer, (PGM_P)pgm_read_word(&(monthNames_P[month])));
+ return buffer;
+}
+
+char* monthShortStr(uint8_t month)
+{
+ for (int i=0; i < dt_SHORT_STR_LEN; i++)
+ buffer[i] = pgm_read_byte(&(monthShortNames_P[i+ (month*dt_SHORT_STR_LEN)]));
+ buffer[dt_SHORT_STR_LEN] = 0;
+ return buffer;
+}
+
+char* dayStr(uint8_t day)
+{
+ strcpy_P(buffer, (PGM_P)pgm_read_word(&(dayNames_P[day])));
+ return buffer;
+}
+
+char* dayShortStr(uint8_t day)
+{
+ uint8_t index = day*dt_SHORT_STR_LEN;
+ for (int i=0; i < dt_SHORT_STR_LEN; i++)
+ buffer[i] = pgm_read_byte(&(dayShortNames_P[index + i]));
+ buffer[dt_SHORT_STR_LEN] = 0;
+ return buffer;
+}
diff --git a/Time/Examples/Processing/SyncArduinoClock/SyncArduinoClock.pde b/Time/Examples/Processing/SyncArduinoClock/SyncArduinoClock.pde
new file mode 100644
index 0000000..4c74d4b
--- /dev/null
+++ b/Time/Examples/Processing/SyncArduinoClock/SyncArduinoClock.pde
@@ -0,0 +1,70 @@
+/**
+ * SyncArduinoClock.
+ *
+ * portIndex must be set to the port connected to the Arduino
+ *
+ * The current time is sent in response to request message from Arduino
+ * or by clicking the display window
+ *
+ * The time message is 11 ASCII text characters; a header (the letter 'T')
+ * followed by the ten digit system time (unix time)
+ */
+
+
+import processing.serial.*;
+
+public static final short portIndex = 1; // select the com port, 0 is the first port
+public static final char TIME_HEADER = 'T'; //header byte for arduino serial time message
+public static final char TIME_REQUEST = 7; // ASCII bell character
+public static final char LF = 10; // ASCII linefeed
+public static final char CR = 13; // ASCII linefeed
+Serial myPort; // Create object from Serial class
+
+void setup() {
+ size(200, 200);
+ println(Serial.list());
+ println(" Connecting to -> " + Serial.list()[portIndex]);
+ myPort = new Serial(this,Serial.list()[portIndex], 9600);
+}
+
+void draw()
+{
+ if ( myPort.available() > 0) { // If data is available,
+ char val = char(myPort.read()); // read it and store it in val
+ if(val == TIME_REQUEST){
+ long t = getTimeNow();
+ sendTimeMessage(TIME_HEADER, t);
+ }
+ else
+ {
+ if(val == LF)
+ ; //igonore
+ else if(val == CR)
+ println();
+ else
+ print(val); // echo everying but time request
+ }
+ }
+}
+
+void mousePressed() {
+ sendTimeMessage( TIME_HEADER, getTimeNow());
+}
+
+
+void sendTimeMessage(char header, long time) {
+ String timeStr = String.valueOf(time);
+ myPort.write(header); // send header and time to arduino
+ myPort.write(timeStr);
+}
+
+long getTimeNow(){
+ // java time is in ms, we want secs
+ GregorianCalendar cal = new GregorianCalendar();
+ cal.setTime(new Date());
+ int tzo = cal.get(Calendar.ZONE_OFFSET);
+ int dst = cal.get(Calendar.DST_OFFSET);
+ long now = (cal.getTimeInMillis() / 1000) ;
+ now = now + (tzo/1000) + (dst/1000);
+ return now;
+}
diff --git a/Time/Examples/Processing/SyncArduinoClock/readme.txt b/Time/Examples/Processing/SyncArduinoClock/readme.txt
new file mode 100644
index 0000000..985bd80
--- /dev/null
+++ b/Time/Examples/Processing/SyncArduinoClock/readme.txt
@@ -0,0 +1,9 @@
+SyncArduinoClock is a Processing sketch that responds to Arduino requests for
+time synchronization messages.
+
+The portIndex must be set the Serial port connected to Arduino.
+
+Download TimeSerial.pde onto Arduino and you should see the time
+message displayed when you run SyncArduinoClock in Processing.
+The Arduino time is set from the time on your computer through the
+Processing sketch. \ No newline at end of file
diff --git a/Time/Examples/TimeGPS/TimeGPS.pde b/Time/Examples/TimeGPS/TimeGPS.pde
new file mode 100644
index 0000000..1c7b25e
--- /dev/null
+++ b/Time/Examples/TimeGPS/TimeGPS.pde
@@ -0,0 +1,82 @@
+/*
+ * TimeGPS.pde
+ * example code illustrating time synced from a GPS
+ *
+ */
+
+#include <Time.h>
+#include <TinyGPS.h> //http://arduiniana.org/libraries/TinyGPS/
+#include <NewSoftSerial.h> //http://arduiniana.org/libraries/newsoftserial/
+// GPS and NewSoftSerial libraries are the work of Mikal Hart
+
+TinyGPS gps;
+NewSoftSerial serial_gps = NewSoftSerial(3, 2); // receive on pin 3
+
+const int offset = 1; // offset hours from gps time (UTC)
+time_t prevDisplay = 0; // when the digital clock was displayed
+
+void setup()
+{
+ Serial.begin(9600);
+ serial_gps.begin(4800);
+ Serial.println("Waiting for GPS time ... ");
+ setSyncProvider(gpsTimeSync);
+}
+
+void loop()
+{
+ while (serial_gps.available())
+ {
+ gps.encode(serial_gps.read()); // process gps messages
+ }
+ if(timeStatus()!= timeNotSet)
+ {
+ if( now() != prevDisplay) //update the display only if the time has changed
+ {
+ prevDisplay = now();
+ digitalClockDisplay();
+ }
+ }
+}
+
+void digitalClockDisplay(){
+ // digital clock display of the time
+ Serial.print(hour());
+ printDigits(minute());
+ printDigits(second());
+ Serial.print(" ");
+ Serial.print(day());
+ Serial.print(" ");
+ Serial.print(month());
+ Serial.print(" ");
+ Serial.print(year());
+ Serial.println();
+}
+
+void printDigits(int digits){
+ // utility function for digital clock display: prints preceding colon and leading 0
+ Serial.print(":");
+ if(digits < 10)
+ Serial.print('0');
+ Serial.print(digits);
+}
+
+time_t gpsTimeSync(){
+ // returns time if avail from gps, else returns 0
+ unsigned long fix_age = 0 ;
+ gps.get_datetime(NULL,NULL, &fix_age);
+ unsigned long time_since_last_fix;
+ if(fix_age < 1000)
+ return gpsTimeToArduinoTime(); // return time only if updated recently by gps
+ return 0;
+}
+
+time_t gpsTimeToArduinoTime(){
+ // returns time_t from gps date and time with the given offset hours
+ tmElements_t tm;
+ int year;
+ gps.crack_datetime(&year, &tm.Month, &tm.Day, &tm.Hour, &tm.Minute, &tm.Second, NULL, NULL);
+ tm.Year = year - 1970;
+ time_t time = makeTime(tm);
+ return time + (offset * SECS_PER_HOUR);
+}
diff --git a/Time/Examples/TimeNTP/TimeNTP.pde b/Time/Examples/TimeNTP/TimeNTP.pde
new file mode 100644
index 0000000..11927c6
--- /dev/null
+++ b/Time/Examples/TimeNTP/TimeNTP.pde
@@ -0,0 +1,120 @@
+/*
+ * Time_NTP.pde
+ * Example showing time sync to NTP time source
+ *
+ * This sketch uses the Ethenet library with the user contributed UdpBytewise extension
+ */
+
+#include <Time.h>
+#include <Ethernet.h>
+#include <UdpBytewise.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008
+#if UDP_TX_PACKET_MAX_SIZE <64 || UDP_RX_PACKET_MAX_SIZE < 64
+#error : UDP packet size to small - modify UdpBytewise.h to set buffers to 64 bytes
+#endif
+/*
+ *
+ * You may need to modify the UdpBytewise.h library to allow enough space in the buffers for the NTP packets.
+ * Open up UdpBytewse.h and set the following buffers to 64 bytes:
+ * #define UDP_TX_PACKET_MAX_SIZE 64
+ * #define UDP_RX_PACKET_MAX_SIZE 64
+ */
+
+
+byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
+byte ip[] = { 192, 168, 1, 44 }; // set the IP address to an unused address on your network
+
+byte SNTP_server_IP[] = { 192, 43, 244, 18}; // time.nist.gov
+//byte SNTP_server_IP[] = { 130,149,17,21}; // ntps1-0.cs.tu-berlin.de
+//byte SNTP_server_IP[] = { 192,53,103,108}; // ptbtime1.ptb.de
+
+
+time_t prevDisplay = 0; // when the digital clock was displayed
+const long timeZoneOffset = 0L; // set this to the offset in seconds to your local time;
+
+void setup()
+{
+ Serial.begin(9600);
+ Ethernet.begin(mac,ip);
+ Serial.println("waiting for sync");
+ setSyncProvider(getNtpTime);
+ while(timeStatus()== timeNotSet)
+ ; // wait until the time is set by the sync provider
+}
+
+void loop()
+{
+ if( now() != prevDisplay) //update the display only if the time has changed
+ {
+ prevDisplay = now();
+ digitalClockDisplay();
+ }
+}
+
+void digitalClockDisplay(){
+ // digital clock display of the time
+ Serial.print(hour());
+ printDigits(minute());
+ printDigits(second());
+ Serial.print(" ");
+ Serial.print(day());
+ Serial.print(" ");
+ Serial.print(month());
+ Serial.print(" ");
+ Serial.print(year());
+ Serial.println();
+}
+
+void printDigits(int digits){
+ // utility function for digital clock display: prints preceding colon and leading 0
+ Serial.print(":");
+ if(digits < 10)
+ Serial.print('0');
+ Serial.print(digits);
+}
+
+/*-------- NTP code ----------*/
+
+unsigned long getNtpTime()
+{
+ sendNTPpacket(SNTP_server_IP);
+ delay(1000);
+ if ( UdpBytewise.available() ) {
+ for(int i=0; i < 40; i++)
+ UdpBytewise.read(); // ignore every field except the time
+ const unsigned long seventy_years = 2208988800UL + timeZoneOffset;
+ return getUlong() - seventy_years;
+ }
+ return 0; // return 0 if unable to get the time
+}
+
+unsigned long sendNTPpacket(byte *address)
+{
+ UdpBytewise.begin(123);
+ UdpBytewise.beginPacket(address, 123);
+ UdpBytewise.write(B11100011); // LI, Version, Mode
+ UdpBytewise.write(0); // Stratum
+ UdpBytewise.write(6); // Polling Interval
+ UdpBytewise.write(0xEC); // Peer Clock Precision
+ write_n(0, 8); // Root Delay & Root Dispersion
+ UdpBytewise.write(49);
+ UdpBytewise.write(0x4E);
+ UdpBytewise.write(49);
+ UdpBytewise.write(52);
+ write_n(0, 32); //Reference and time stamps
+ UdpBytewise.endPacket();
+}
+
+unsigned long getUlong()
+{
+ unsigned long ulong = (unsigned long)UdpBytewise.read() << 24;
+ ulong |= (unsigned long)UdpBytewise.read() << 16;
+ ulong |= (unsigned long)UdpBytewise.read() << 8;
+ ulong |= (unsigned long)UdpBytewise.read();
+ return ulong;
+}
+
+void write_n(int what, int how_many)
+{
+ for( int i = 0; i < how_many; i++ )
+ UdpBytewise.write(what);
+}
diff --git a/Time/Examples/TimeRTC/TimeRTC.pde b/Time/Examples/TimeRTC/TimeRTC.pde
new file mode 100644
index 0000000..1a1ed80
--- /dev/null
+++ b/Time/Examples/TimeRTC/TimeRTC.pde
@@ -0,0 +1,47 @@
+/*
+ * TimeRTC.pde
+ * example code illustrating Time library with Real Time Clock.
+ *
+ */
+
+#include <Time.h>
+#include <Wire.h>
+#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
+
+void setup() {
+ Serial.begin(9600);
+ setSyncProvider(RTC.get); // the function to get the time from the RTC
+ if(timeStatus()!= timeSet)
+ Serial.println("Unable to sync with the RTC");
+ else
+ Serial.println("RTC has set the system time");
+}
+
+void loop()
+{
+ digitalClockDisplay();
+ delay(1000);
+}
+
+void digitalClockDisplay(){
+ // digital clock display of the time
+ Serial.print(hour());
+ printDigits(minute());
+ printDigits(second());
+ Serial.print(" ");
+ Serial.print(day());
+ Serial.print(" ");
+ Serial.print(month());
+ Serial.print(" ");
+ Serial.print(year());
+ Serial.println();
+}
+
+void printDigits(int digits){
+ // utility function for digital clock display: prints preceding colon and leading 0
+ Serial.print(":");
+ if(digits < 10)
+ Serial.print('0');
+ Serial.print(digits);
+}
+
diff --git a/Time/Examples/TimeRTCLog/TimeRTCLog.pde b/Time/Examples/TimeRTCLog/TimeRTCLog.pde
new file mode 100644
index 0000000..76ed17d
--- /dev/null
+++ b/Time/Examples/TimeRTCLog/TimeRTCLog.pde
@@ -0,0 +1,106 @@
+/*
+ * TimeRTCLogger.pde
+ * example code illustrating adding and subtracting Time.
+ *
+ * this sketch logs pin state change events
+ * the time of the event and time since the previous event is calculated and sent to the serial port.
+ */
+
+#include <Time.h>
+#include <Wire.h>
+#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
+
+const int nbrInputPins = 6; // monitor 6 digital pins
+const int inputPins[nbrInputPins] = {2,3,4,5,6,7}; // pins to monitor
+boolean state[nbrInputPins] ; // the state of the monitored pins
+time_t prevEventTime[nbrInputPins] ; // the time of the previous event
+
+void setup() {
+ Serial.begin(9600);
+ setSyncProvider(RTC.get); // the function to sync the time from the RTC
+ for(int i=0; i < nbrInputPins; i++){
+ pinMode( inputPins[i], INPUT);
+ // digitalWrite( inputPins[i], HIGH); // uncomment these lines if
+ // state[i] = HIGH; // pull-up resistors are wanted
+ }
+}
+
+void loop()
+{
+ for(int i=0; i < nbrInputPins; i++)
+ {
+ boolean val = digitalRead(inputPins[i]);
+ if(val != state[i])
+ {
+ time_t duration = 0; // the time since the previous event
+ state[i] = val;
+ time_t timeNow = now();
+ if(prevEventTime[i] > 0)
+ // if this was not the first state change, calculate the time from the previous change
+ duration = duration = timeNow - prevEventTime[i];
+ logEvent(inputPins[i], val, timeNow, duration ); // log the event
+ prevEventTime[i] = timeNow; // store the time for this event
+ }
+ }
+}
+
+void logEvent( int pin, boolean state, time_t timeNow, time_t duration)
+{
+ Serial.print("Pin ");
+ Serial.print(pin);
+ if( state == HIGH)
+ Serial.print(" went High at ");
+ else
+ Serial.print(" went Low at ");
+ showTime(timeNow);
+ if(duration > 0){
+ // only display duration if greater than 0
+ Serial.print(", Duration was ");
+ showDuration(duration);
+ }
+ Serial.println();
+}
+
+
+void showTime(time_t t){
+ // display the given time
+ Serial.print(hour(t));
+ printDigits(minute(t));
+ printDigits(second(t));
+ Serial.print(" ");
+ Serial.print(day(t));
+ Serial.print(" ");
+ Serial.print(month(t));
+ Serial.print(" ");
+ Serial.print(year(t));
+}
+
+void printDigits(int digits){
+ // utility function for digital clock display: prints preceding colon and leading 0
+ Serial.print(":");
+ if(digits < 10)
+ Serial.print('0');
+ Serial.print(digits);
+}
+
+void showDuration(time_t duration){
+// prints the duration in days, hours, minutes and seconds
+ if(duration >= SECS_PER_DAY){
+ Serial.print(duration / SECS_PER_DAY);
+ Serial.print(" day(s) ");
+ duration = duration % SECS_PER_DAY;
+ }
+ if(duration >= SECS_PER_HOUR){
+ Serial.print(duration / SECS_PER_HOUR);
+ Serial.print(" hour(s) ");
+ duration = duration % SECS_PER_HOUR;
+ }
+ if(duration >= SECS_PER_MIN){
+ Serial.print(duration / SECS_PER_MIN);
+ Serial.print(" minute(s) ");
+ duration = duration % SECS_PER_MIN;
+ }
+ Serial.print(duration);
+ Serial.print(" second(s) ");
+}
+
diff --git a/Time/Examples/TimeRTCSet/TimeRTCSet.pde b/Time/Examples/TimeRTCSet/TimeRTCSet.pde
new file mode 100644
index 0000000..48b696c
--- /dev/null
+++ b/Time/Examples/TimeRTCSet/TimeRTCSet.pde
@@ -0,0 +1,82 @@
+/*
+ * TimeRTCSet.pde
+ * example code illustrating Time library with Real Time Clock.
+ *
+ * RTC clock is set in response to serial port time message
+ * A Processing example sketch to set the time is inclided in the download
+ */
+
+#include <Time.h>
+#include <Wire.h>
+#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
+
+
+void setup() {
+ Serial.begin(9600);
+ setSyncProvider(RTC.get); // the function to get the time from the RTC
+ if(timeStatus()!= timeSet)
+ Serial.println("Unable to sync with the RTC");
+ else
+ Serial.println("RTC has set the system time");
+}
+
+void loop()
+{
+ if(Serial.available())
+ {
+ time_t t = processSyncMessage();
+ if(t >0)
+ {
+ RTC.set(t); // set the RTC and the system time to the received value
+ setTime(t);
+ }
+ }
+ digitalClockDisplay();
+ delay(1000);
+}
+
+void digitalClockDisplay(){
+ // digital clock display of the time
+ Serial.print(hour());
+ printDigits(minute());
+ printDigits(second());
+ Serial.print(" ");
+ Serial.print(day());
+ Serial.print(" ");
+ Serial.print(month());
+ Serial.print(" ");
+ Serial.print(year());
+ Serial.println();
+}
+
+void printDigits(int digits){
+ // utility function for digital clock display: prints preceding colon and leading 0
+ Serial.print(":");
+ if(digits < 10)
+ Serial.print('0');
+ Serial.print(digits);
+}
+
+/* code to process time sync messages from the serial port */
+#define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by unix time_t as ten ascii digits
+#define TIME_HEADER 'T' // Header tag for serial time sync message
+
+time_t processSyncMessage() {
+ // return the time if a valid sync message is received on the serial port.
+ while(Serial.available() >= TIME_MSG_LEN ){ // time message consists of a header and ten ascii digits
+ char c = Serial.read() ;
+ Serial.print(c);
+ if( c == TIME_HEADER ) {
+ time_t pctime = 0;
+ for(int i=0; i < TIME_MSG_LEN -1; i++){
+ c = Serial.read();
+ if( c >= '0' && c <= '9'){
+ pctime = (10 * pctime) + (c - '0') ; // convert digits to a number
+ }
+ }
+ return pctime;
+ }
+ }
+ return 0;
+}
+
diff --git a/Time/Examples/TimeSerial/TimeSerial.pde b/Time/Examples/TimeSerial/TimeSerial.pde
new file mode 100644
index 0000000..55c67a6
--- /dev/null
+++ b/Time/Examples/TimeSerial/TimeSerial.pde
@@ -0,0 +1,82 @@
+/*
+ * TimeSerial.pde
+ * example code illustrating Time library set through serial port messages.
+ *
+ * Messages consist of the letter T followed by ten digit time (as seconds since Jan 1 1970)
+ * you can send the text on the next line using Serial Monitor to set the clock to noon Jan 1 2010
+ T1262347200
+ *
+ * A Processing example sketch to automatically send the messages is inclided in the download
+ */
+
+#include <Time.h>
+
+#define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by unix time_t as ten ascii digits
+#define TIME_HEADER 'T' // Header tag for serial time sync message
+#define TIME_REQUEST 7 // ASCII bell character requests a time sync message
+
+void setup() {
+ Serial.begin(9600);
+ setSyncProvider( requestSync); //set function to call when sync required
+ Serial.println("Waiting for sync message");
+}
+
+void loop(){
+ if(Serial.available() )
+ {
+ processSyncMessage();
+ }
+ if(timeStatus()!= timeNotSet)
+ {
+ digitalWrite(13,timeStatus() == timeSet); // on if synced, off if needs refresh
+ digitalClockDisplay();
+ }
+ delay(1000);
+}
+
+void digitalClockDisplay(){
+ // digital clock display of the time
+ Serial.print(hour());
+ printDigits(minute());
+ printDigits(second());
+ Serial.print(" ");
+ Serial.print(day());
+ Serial.print(" ");
+ Serial.print(month());
+ Serial.print(" ");
+ Serial.print(year());
+ Serial.println();
+}
+
+void printDigits(int digits){
+ // utility function for digital clock display: prints preceding colon and leading 0
+ Serial.print(":");
+ if(digits < 10)
+ Serial.print('0');
+ Serial.print(digits);
+}
+
+void processSyncMessage() {
+ // if time sync available from serial port, update time and return true
+ while(Serial.available() >= TIME_MSG_LEN ){ // time message consists of a header and ten ascii digits
+ char c = Serial.read() ;
+ Serial.print(c);
+ if( c == TIME_HEADER ) {
+ time_t pctime = 0;
+ for(int i=0; i < TIME_MSG_LEN -1; i++){
+ c = Serial.read();
+ if( c >= '0' && c <= '9'){
+ pctime = (10 * pctime) + (c - '0') ; // convert digits to a number
+ }
+ }
+ setTime(pctime); // Sync Arduino clock to the time received on the serial port
+ }
+ }
+}
+
+time_t requestSync()
+{
+ Serial.print(TIME_REQUEST,BYTE);
+ return 0; // the time will be sent later in response to serial mesg
+}
+
diff --git a/Time/Examples/TimeSerialDateStrings/TimeSerialDateStrings.pde b/Time/Examples/TimeSerialDateStrings/TimeSerialDateStrings.pde
new file mode 100644
index 0000000..dcff97e
--- /dev/null
+++ b/Time/Examples/TimeSerialDateStrings/TimeSerialDateStrings.pde
@@ -0,0 +1,80 @@
+/*
+ * TimeSerialDateStrings.pde
+ * example code illustrating Time library date strings
+ *
+ * This sketch adds date string functionality to TimeSerial.pde
+ *
+ */
+
+#include <Time.h>
+
+#define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by unix time_t as ten ascii digits
+#define TIME_HEADER 'T' // Header tag for serial time sync message
+#define TIME_REQUEST 7 // ASCII bell character requests a time sync message
+
+void setup() {
+ Serial.begin(9600);
+ setSyncProvider( requestSync); //set function to call when sync required
+ Serial.println("Waiting for sync message");
+}
+
+void loop(){
+ if(Serial.available() )
+ {
+ processSyncMessage();
+ }
+ if(timeStatus()!= timeNotSet)
+ {
+ digitalClockDisplay();
+ }
+ delay(1000);
+}
+
+void digitalClockDisplay(){
+ // digital clock display of the time
+ Serial.print(hour());
+ printDigits(minute());
+ printDigits(second());
+ Serial.print(" ");
+ Serial.print(dayStr(weekday()));
+ Serial.print(" ");
+ Serial.print(day());
+ Serial.print(" ");
+ Serial.print(monthShortStr(month()));
+ Serial.print(" ");
+ Serial.print(year());
+ Serial.println();
+}
+
+void printDigits(int digits){
+ // utility function for digital clock display: prints preceding colon and leading 0
+ Serial.print(":");
+ if(digits < 10)
+ Serial.print('0');
+ Serial.print(digits);
+}
+
+void processSyncMessage() {
+ // if time sync available from serial port, update time and return true
+ while(Serial.available() >= TIME_MSG_LEN ){ // time message consists of a header and ten ascii digits
+ char c = Serial.read() ;
+ Serial.print(c);
+ if( c == TIME_HEADER ) {
+ time_t pctime = 0;
+ for(int i=0; i < TIME_MSG_LEN -1; i++){
+ c = Serial.read();
+ if( c >= '0' && c <= '9'){
+ pctime = (10 * pctime) + (c - '0') ; // convert digits to a number
+ }
+ }
+ setTime(pctime); // Sync Arduino clock to the time received on the serial port
+ }
+ }
+}
+
+time_t requestSync()
+{
+ Serial.print(TIME_REQUEST,BYTE);
+ return 0; // the time will be sent later in response to serial mesg
+}
+
diff --git a/Time/Readme.txt b/Time/Readme.txt
new file mode 100644
index 0000000..22bc4aa
--- /dev/null
+++ b/Time/Readme.txt
@@ -0,0 +1,131 @@
+Readme file for Arduino Time Library
+
+Time is a library that provides timekeeping functionality for Arduino.
+
+The code is derived from the Playground DateTime library but is updated
+to provide an API that is more flexable and easier to use.
+
+A primary goal was to enable date and time functionality that can be used with
+a variety of external time sources with minimum differences required in sketch logic.
+
+Example sketches illustrate how similar sketch code can be used with: a Real Time Clock,
+internet NTP time service, GPS time data, and Serial time messages from a computer
+for time synchronization.
+
+The functions available in the library include:
+
+hour(); // the hour now (0-23)
+minute(); // the minute now (0-59)
+second(); // the second now (0-59)
+day(); // the day now (1-31)
+weekday(); // day of the week, Sunday is day 0
+month(); // the month now (1-12)
+year(); // the full four digit year: (2009, 2010 etc)
+
+there are also functions to return the hour in 12 hour format
+hourFormat12(); // the hour now in 12 hour format
+isAM(); // returns true if time now is AM
+isPM(); // returns true if time now is PM
+
+now(); // returns the current time as seconds since Jan 1 1970
+
+The time and date functions can take an optional parameter for the time. This prevents
+errors if the time rolls over between elements. For example, if a new minute begins
+between getting the minute and second, the values will be inconsistent. Using the
+following functions eliminates this probglem
+ time_t t = now(); // store the current time in time variable t
+ hour(t); // returns the hour for the given time t
+ minute(t); // returns the minute for the given time t
+ second(t); // returns the second for the given time t
+ day(t); // the day for the given time t
+ weekday(t); // day of the week for the given time t
+ month(t); // the month for the given time t
+ year(t); // the year for the given time t
+
+
+Functions for managing the timer services are:
+setTime(t); // set the system time to the give time t
+setTime(hr,min,sec,day,mnth,yr); // alternative to above, yr is 2 or 4 digit yr (2010 or 10 sets year to 2010)
+adjustTime(adjustment); // adjust system time by adding the adjustment value
+
+timeStatus(); // indicates if time has been set and recently synchronized
+ // returns one of the following enumerations:
+ timeNotSet // the time has never been set, the clock started at Jan 1 1970
+ timeNeedsSync // the time had been set but a sync attempt did not succeed
+ timeSet // the time is set and is synced
+Time and Date values are not valid if the status is timeNotSet. Otherwise values can be used but
+the returned time may have drifted if the status is timeNeedsSync.
+
+setSyncProvider(getTimeFunction); // set the external time provider
+setSyncInterval(interval); // set the number of seconds between re-sync
+
+
+There are many convenience macros in the time.h file for time constants and conversion of time units.
+
+To use the library, copy the download to the Library directory.
+
+The Time directory contains the Time library and some example sketches
+illustrating how the library can be used with various time sources:
+
+- TimeSerial.pde shows Arduino as a clock without external hardware.
+ It is synchronized by time messages sent over the serial port.
+ A companion Processing sketch will automatically provide these messages
+ if it is running and connected to the Arduino serial port.
+
+- TimeSerialDateStrings.pde adds day and month name strings to the sketch above
+ Short (3 character) and long strings are available to print the days of
+ the week and names of the months.
+
+- TimeRTC uses a DS1307 real time clock to provide time synchronization.
+ A basic RTC library named DS1307RTC is included in the download.
+ To run this sketch the DS1307RTC library must be installed.
+
+- TimeRTCSet is similar to the above and adds the ability to set the Real Time Clock
+
+- TimeRTCLog demonstrates how to calculate the difference between times.
+ It is a vary simple logger application that monitors events on digtial pins
+ and prints (to the serial port) the time of an event and the time period since the previous event.
+
+- TimeNTP uses the Arduino Ethernet shield to access time using the internet NTP time service.
+ The NTP protocol uses UDP and the UdpBytewise library is required, see:
+ http://bitbucket.org/bjoern/arduino_osc/src/14667490521f/libraries/Ethernet/
+
+-TimeGPS gets time from a GPS
+ This requires the TinyGPS and NewSoftSerial libraries from Mikal Hart:
+ http://arduiniana.org/libraries/TinyGPS and http://arduiniana.org/libraries/newsoftserial/
+
+Differences between this code and the playground DateTime library
+although the Time library is based on the DateTime codebase, the API has changed.
+Changes in the Time library API:
+- time elements are functions returning int (they are variables in DateTime)
+- Years start from 1970
+- days of the week and months start from 1 (they start from 0 in DateTime)
+- DateStrings do not require a seperate library
+- time elements can be accessed non-atomically (in DateTime they are always atomic)
+- function added to automatically sync time with extrnal source
+- localTime and maketime parameters changed, localTime renamed to breakTime
+
+Technical notes:
+
+Internal system time is based on the standard Unix time_t.
+The value is the number of seconds since Jan 1 1970.
+System time begins at zero when the sketch starts.
+
+The internal time can be automatically synchronized at regular intervals to an external time source.
+This is enabled by calling the setSyncProvider(provider) function - the provider argument is
+the address of a function that returns the current time as a time_t.
+See the sketches in the examples directory for usage.
+
+The default interval for re-syncing the time is 5 minutes but can be changed by calling the
+setSyncInterval( interval) method to set the number of seconds between re-sync attempts.
+
+The Time library defines a structure for holding time elements that is a compact version of the C tm structure.
+All the members of the Arduino tm structure are bytes and the year is offset from 1970.
+Convenience macros provide conversion to and from the Arduino format.
+
+Low level functions to convert between system time and individual time elements are provided:
+ breakTime( time, &tm); // break time_t into elements stored in tm struct
+ makeTime( &tm); // return time_t from elements stored in tm struct
+
+The DS1307RTC library included in the download provides an example of how a time provider
+can use the low level functions to interface with the Time library. \ No newline at end of file
diff --git a/Time/Time.cpp b/Time/Time.cpp
new file mode 100644
index 0000000..86bdcd5
--- /dev/null
+++ b/Time/Time.cpp
@@ -0,0 +1,307 @@
+/*
+ time.c - low level time and date functions
+ Copyright (c) Michael Margolis 2009
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ 6 Jan 2010 - initial release
+ 12 Feb 2010 - fixed leap year calculation error
+ 1 Nov 2010 - fixed setTime bug (thanks to Korman for this)
+*/
+
+#if ARDUINO >= 100
+#include <Arduino.h>
+#else
+#include <WProgram.h>
+#endif
+
+#include "Time.h"
+
+static tmElements_t tm; // a cache of time elements
+static time_t cacheTime; // the time the cache was updated
+static time_t syncInterval = 300; // time sync will be attempted after this many seconds
+
+void refreshCache( time_t t){
+ if( t != cacheTime)
+ {
+ breakTime(t, tm);
+ cacheTime = t;
+ }
+}
+
+int hour() { // the hour now
+ return hour(now());
+}
+
+int hour(time_t t) { // the hour for the given time
+ refreshCache(t);
+ return tm.Hour;
+}
+
+int hourFormat12() { // the hour now in 12 hour format
+ return hourFormat12(now());
+}
+
+int hourFormat12(time_t t) { // the hour for the given time in 12 hour format
+ refreshCache(t);
+ if( tm.Hour == 0 )
+ return 12; // 12 midnight
+ else if( tm.Hour > 12)
+ return tm.Hour - 12 ;
+ else
+ return tm.Hour ;
+}
+
+uint8_t isAM() { // returns true if time now is AM
+ return !isPM(now());
+}
+
+uint8_t isAM(time_t t) { // returns true if given time is AM
+ return !isPM(t);
+}
+
+uint8_t isPM() { // returns true if PM
+ return isPM(now());
+}
+
+uint8_t isPM(time_t t) { // returns true if PM
+ return (hour(t) >= 12);
+}
+
+int minute() {
+ return minute(now());
+}
+
+int minute(time_t t) { // the minute for the given time
+ refreshCache(t);
+ return tm.Minute;
+}
+
+int second() {
+ return second(now());
+}
+
+int second(time_t t) { // the second for the given time
+ refreshCache(t);
+ return tm.Second;
+}
+
+int day(){
+ return(day(now()));
+}
+
+int day(time_t t) { // the day for the given time (0-6)
+ refreshCache(t);
+ return tm.Day;
+}
+
+int weekday() { // Sunday is day 1
+ return weekday(now());
+}
+
+int weekday(time_t t) {
+ refreshCache(t);
+ return tm.Wday;
+}
+
+int month(){
+ return month(now());
+}
+
+int month(time_t t) { // the month for the given time
+ refreshCache(t);
+ return tm.Month;
+}
+
+int year() { // as in Processing, the full four digit year: (2009, 2010 etc)
+ return year(now());
+}
+
+int year(time_t t) { // the year for the given time
+ refreshCache(t);
+ return tmYearToCalendar(tm.Year);
+}
+
+/*============================================================================*/
+/* functions to convert to and from system time */
+/* These are for interfacing with time serivces and are not normally needed in a sketch */
+
+// leap year calulator expects year argument as years offset from 1970
+#define LEAP_YEAR(Y) ( ((1970+Y)>0) && !((1970+Y)%4) && ( ((1970+Y)%100) || !((1970+Y)%400) ) )
+
+static const uint8_t monthDays[]={31,28,31,30,31,30,31,31,30,31,30,31}; // API starts months from 1, this array starts from 0
+
+void breakTime(time_t time, tmElements_t &tm){
+// break the given time_t into time components
+// this is a more compact version of the C library localtime function
+// note that year is offset from 1970 !!!
+
+ uint8_t year;
+ uint8_t month, monthLength;
+ unsigned long days;
+
+ tm.Second = time % 60;
+ time /= 60; // now it is minutes
+ tm.Minute = time % 60;
+ time /= 60; // now it is hours
+ tm.Hour = time % 24;
+ time /= 24; // now it is days
+ tm.Wday = ((time + 4) % 7) + 1; // Sunday is day 1
+
+ year = 0;
+ days = 0;
+ while((unsigned)(days += (LEAP_YEAR(year) ? 366 : 365)) <= time) {
+ year++;
+ }
+ tm.Year = year; // year is offset from 1970
+
+ days -= LEAP_YEAR(year) ? 366 : 365;
+ time -= days; // now it is days in this year, starting at 0
+
+ days=0;
+ month=0;
+ monthLength=0;
+ for (month=0; month<12; month++) {
+ if (month==1) { // february
+ if (LEAP_YEAR(year)) {
+ monthLength=29;
+ } else {
+ monthLength=28;
+ }
+ } else {
+ monthLength = monthDays[month];
+ }
+
+ if (time >= monthLength) {
+ time -= monthLength;
+ } else {
+ break;
+ }
+ }
+ tm.Month = month + 1; // jan is month 1
+ tm.Day = time + 1; // day of month
+}
+
+time_t makeTime(tmElements_t &tm){
+// assemble time elements into time_t
+// note year argument is offset from 1970 (see macros in time.h to convert to other formats)
+// previous version used full four digit year (or digits since 2000),i.e. 2009 was 2009 or 9
+
+ int i;
+ time_t seconds;
+
+ // seconds from 1970 till 1 jan 00:00:00 of the given year
+ seconds= tm.Year*(SECS_PER_DAY * 365);
+ for (i = 0; i < tm.Year; i++) {
+ if (LEAP_YEAR(i)) {
+ seconds += SECS_PER_DAY; // add extra days for leap years
+ }
+ }
+
+ // add days for this year, months start from 1
+ for (i = 1; i < tm.Month; i++) {
+ if ( (i == 2) && LEAP_YEAR(tm.Year)) {
+ seconds += SECS_PER_DAY * 29;
+ } else {
+ seconds += SECS_PER_DAY * monthDays[i-1]; //monthDay array starts from 0
+ }
+ }
+ seconds+= (tm.Day-1) * SECS_PER_DAY;
+ seconds+= tm.Hour * SECS_PER_HOUR;
+ seconds+= tm.Minute * SECS_PER_MIN;
+ seconds+= tm.Second;
+ return seconds;
+}
+/*=====================================================*/
+/* Low level system time functions */
+
+static time_t sysTime = 0;
+static time_t prevMillis = 0;
+static time_t nextSyncTime = 0;
+static timeStatus_t Status = timeNotSet;
+
+getExternalTime getTimePtr; // pointer to external sync function
+//setExternalTime setTimePtr; // not used in this version
+
+#ifdef TIME_DRIFT_INFO // define this to get drift data
+time_t sysUnsyncedTime = 0; // the time sysTime unadjusted by sync
+#endif
+
+
+time_t now(){
+ while( millis() - prevMillis >= 1000){
+ sysTime++;
+ prevMillis += 1000;
+#ifdef TIME_DRIFT_INFO
+ sysUnsyncedTime++; // this can be compared to the synced time to measure long term drift
+#endif
+ }
+ if(nextSyncTime <= sysTime){
+ if(getTimePtr != 0){
+ time_t t = getTimePtr();
+ if( t != 0)
+ setTime(t);
+ else
+ Status = (Status == timeNotSet) ? timeNotSet : timeNeedsSync;
+ }
+ }
+ return sysTime;
+}
+
+void setTime(time_t t){
+#ifdef TIME_DRIFT_INFO
+ if(sysUnsyncedTime == 0)
+ sysUnsyncedTime = t; // store the time of the first call to set a valid Time
+#endif
+
+ sysTime = t;
+ nextSyncTime = t + syncInterval;
+ Status = timeSet;
+ prevMillis = millis(); // restart counting from now (thanks to Korman for this fix)
+}
+
+void setTime(int hr,int min,int sec,int dy, int mnth, int yr){
+ // year can be given as full four digit year or two digts (2010 or 10 for 2010);
+ //it is converted to years since 1970
+ if( yr > 99)
+ yr = yr - 1970;
+ else
+ yr += 30;
+ tm.Year = yr;
+ tm.Month = mnth;
+ tm.Day = dy;
+ tm.Hour = hr;
+ tm.Minute = min;
+ tm.Second = sec;
+ setTime(makeTime(tm));
+}
+
+void adjustTime(long adjustment){
+ sysTime += adjustment;
+}
+
+timeStatus_t timeStatus(){ // indicates if time has been set and recently synchronized
+ return Status;
+}
+
+void setSyncProvider( getExternalTime getTimeFunction){
+ getTimePtr = getTimeFunction;
+ nextSyncTime = sysTime;
+ now(); // this will sync the clock
+}
+
+void setSyncInterval(time_t interval){ // set the number of seconds between re-sync
+ syncInterval = interval;
+} \ No newline at end of file
diff --git a/Time/Time.h b/Time/Time.h
new file mode 100644
index 0000000..e54f3b0
--- /dev/null
+++ b/Time/Time.h
@@ -0,0 +1,126 @@
+/*
+ time.h - low level time and date functions
+*/
+
+/*
+ July 3 2011 - fixed elapsedSecsThisWeek macro (thanks Vincent Valdy for this)
+ - fixed daysToTime_t macro (thanks maniacbug)
+*/
+
+#ifndef _Time_h
+#define _Time_h
+
+#include <inttypes.h>
+
+typedef unsigned long time_t;
+
+typedef enum {timeNotSet, timeNeedsSync, timeSet
+} timeStatus_t ;
+
+typedef enum {
+ dowInvalid, dowSunday, dowMonday, dowTuesday, dowWednesday, dowThursday, dowFriday, dowSaturday
+} timeDayOfWeek_t;
+
+typedef enum {
+ tmSecond, tmMinute, tmHour, tmWday, tmDay,tmMonth, tmYear, tmNbrFields
+} tmByteFields;
+
+typedef struct {
+ uint8_t Second;
+ uint8_t Minute;
+ uint8_t Hour;
+ uint8_t Wday; // day of week, sunday is day 1
+ uint8_t Day;
+ uint8_t Month;
+ uint8_t Year; // offset from 1970;
+} tmElements_t, TimeElements, *tmElementsPtr_t;
+
+//convenience macros to convert to and from tm years
+#define tmYearToCalendar(Y) ((Y) + 1970) // full four digit year
+#define CalendarYrToTm(Y) ((Y) - 1970)
+#define tmYearToY2k(Y) ((Y) - 30) // offset is from 2000
+#define y2kYearToTm(Y) ((Y) + 30)
+
+typedef time_t(*getExternalTime)();
+//typedef void (*setExternalTime)(const time_t); // not used in this version
+
+
+/*==============================================================================*/
+/* Useful Constants */
+#define SECS_PER_MIN (60UL)
+#define SECS_PER_HOUR (3600UL)
+#define SECS_PER_DAY (SECS_PER_HOUR * 24UL)
+#define DAYS_PER_WEEK (7UL)
+#define SECS_PER_WEEK (SECS_PER_DAY * DAYS_PER_WEEK)
+#define SECS_PER_YEAR (SECS_PER_WEEK * 52UL)
+#define SECS_YR_2000 (946684800UL) // the time at the start of y2k
+
+/* Useful Macros for getting elapsed time */
+#define numberOfSeconds(_time_) (_time_ % SECS_PER_MIN)
+#define numberOfMinutes(_time_) ((_time_ / SECS_PER_MIN) % SECS_PER_MIN)
+#define numberOfHours(_time_) (( _time_% SECS_PER_DAY) / SECS_PER_HOUR)
+#define dayOfWeek(_time_) ((( _time_ / SECS_PER_DAY + 4) % DAYS_PER_WEEK)+1) // 1 = Sunday
+#define elapsedDays(_time_) ( _time_ / SECS_PER_DAY) // this is number of days since Jan 1 1970
+#define elapsedSecsToday(_time_) (_time_ % SECS_PER_DAY) // the number of seconds since last midnight
+// The following macros are used in calculating alarms and assume the clock is set to a date later than Jan 1 1971
+// Always set the correct time before settting alarms
+#define previousMidnight(_time_) (( _time_ / SECS_PER_DAY) * SECS_PER_DAY) // time at the start of the given day
+#define nextMidnight(_time_) ( previousMidnight(_time_) + SECS_PER_DAY ) // time at the end of the given day
+#define elapsedSecsThisWeek(_time_) (elapsedSecsToday(_time_) + ((dayOfWeek(_time_)-1) * SECS_PER_DAY) ) // note that week starts on day 1
+#define previousSunday(_time_) (_time_ - elapsedSecsThisWeek(_time_)) // time at the start of the week for the given time
+#define nextSunday(_time_) ( previousSunday(_time_)+SECS_PER_WEEK) // time at the end of the week for the given time
+
+
+/* Useful Macros for converting elapsed time to a time_t */
+#define minutesToTime_t ((M)) ( (M) * SECS_PER_MIN)
+#define hoursToTime_t ((H)) ( (H) * SECS_PER_HOUR)
+#define daysToTime_t ((D)) ( (D) * SECS_PER_DAY) // fixed on Jul 22 2011
+#define weeksToTime_t ((W)) ( (W) * SECS_PER_WEEK)
+
+/*============================================================================*/
+/* time and date functions */
+int hour(); // the hour now
+int hour(time_t t); // the hour for the given time
+int hourFormat12(); // the hour now in 12 hour format
+int hourFormat12(time_t t); // the hour for the given time in 12 hour format
+uint8_t isAM(); // returns true if time now is AM
+uint8_t isAM(time_t t); // returns true the given time is AM
+uint8_t isPM(); // returns true if time now is PM
+uint8_t isPM(time_t t); // returns true the given time is PM
+int minute(); // the minute now
+int minute(time_t t); // the minute for the given time
+int second(); // the second now
+int second(time_t t); // the second for the given time
+int day(); // the day now
+int day(time_t t); // the day for the given time
+int weekday(); // the weekday now (Sunday is day 1)
+int weekday(time_t t); // the weekday for the given time
+int month(); // the month now (Jan is month 1)
+int month(time_t t); // the month for the given time
+int year(); // the full four digit year: (2009, 2010 etc)
+int year(time_t t); // the year for the given time
+
+time_t now(); // return the current time as seconds since Jan 1 1970
+void setTime(time_t t);
+void setTime(int hr,int min,int sec,int day, int month, int yr);
+void adjustTime(long adjustment);
+
+/* date strings */
+#define dt_MAX_STRING_LEN 9 // length of longest date string (excluding terminating null)
+char* monthStr(uint8_t month);
+char* dayStr(uint8_t day);
+char* monthShortStr(uint8_t month);
+char* dayShortStr(uint8_t day);
+
+/* time sync functions */
+timeStatus_t timeStatus(); // indicates if time has been set and recently synchronized
+void setSyncProvider( getExternalTime getTimeFunction); // identify the external time provider
+void setSyncInterval(time_t interval); // set the number of seconds between re-sync
+
+/* low level functions to convert to and from system time */
+void breakTime(time_t time, tmElements_t &tm); // break time_t into elements
+time_t makeTime(tmElements_t &tm); // convert time elements into time_t
+
+
+#endif /* _Time_h */
+
diff --git a/Time/keywords.txt b/Time/keywords.txt
new file mode 100644
index 0000000..f921672
--- /dev/null
+++ b/Time/keywords.txt
@@ -0,0 +1,33 @@
+#######################################
+# Syntax Coloring Map For Time
+#######################################
+
+#######################################
+# Datatypes (KEYWORD1)
+#######################################
+time_t KEYWORD1
+#######################################
+# Methods and Functions (KEYWORD2)
+#######################################
+now KEYWORD2
+second KEYWORD2
+minute KEYWORD2
+hour KEYWORD2
+day KEYWORD2
+month KEYWORD2
+year KEYWORD2
+isAM KEYWORD2
+isPM KEYWORD2
+weekday KEYWORD2
+setTime KEYWORD2
+adjustTime KEYWORD2
+setSyncProvider KEYWORD2
+setSyncInteval KEYWORD2
+timeStatus KEYWORD2
+#######################################
+# Instances (KEYWORD2)
+#######################################
+
+#######################################
+# Constants (LITERAL1)
+#######################################