mirror of
https://github.com/KevinMidboe/Arduino.git
synced 2025-12-08 20:28:48 +00:00
Init commit with many years of arduino sketches and projects. I dont know if the esp8266 includes much, but there are also libraries. I hope they dont have crazy automatic versioning through the Arduino IDE.
This commit is contained in:
80
Projects/libraries/Installed_libs/Time/DateStrings.cpp
Executable file
80
Projects/libraries/Installed_libs/Time/DateStrings.cpp
Executable file
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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.
|
||||
82
Projects/libraries/Installed_libs/Time/Examples/TimeGPS/TimeGPS.pde
Executable file
82
Projects/libraries/Installed_libs/Time/Examples/TimeGPS/TimeGPS.pde
Executable file
@@ -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);
|
||||
}
|
||||
120
Projects/libraries/Installed_libs/Time/Examples/TimeNTP/TimeNTP.pde
Executable file
120
Projects/libraries/Installed_libs/Time/Examples/TimeNTP/TimeNTP.pde
Executable file
@@ -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);
|
||||
}
|
||||
47
Projects/libraries/Installed_libs/Time/Examples/TimeRTC/TimeRTC.pde
Executable file
47
Projects/libraries/Installed_libs/Time/Examples/TimeRTC/TimeRTC.pde
Executable file
@@ -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);
|
||||
}
|
||||
|
||||
106
Projects/libraries/Installed_libs/Time/Examples/TimeRTCLog/TimeRTCLog.pde
Executable file
106
Projects/libraries/Installed_libs/Time/Examples/TimeRTCLog/TimeRTCLog.pde
Executable file
@@ -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) ");
|
||||
}
|
||||
|
||||
82
Projects/libraries/Installed_libs/Time/Examples/TimeRTCSet/TimeRTCSet.pde
Executable file
82
Projects/libraries/Installed_libs/Time/Examples/TimeRTCSet/TimeRTCSet.pde
Executable file
@@ -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;
|
||||
}
|
||||
|
||||
82
Projects/libraries/Installed_libs/Time/Examples/TimeSerial/TimeSerial.pde
Executable file
82
Projects/libraries/Installed_libs/Time/Examples/TimeSerial/TimeSerial.pde
Executable file
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
131
Projects/libraries/Installed_libs/Time/Readme.txt
Executable file
131
Projects/libraries/Installed_libs/Time/Readme.txt
Executable file
@@ -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.
|
||||
307
Projects/libraries/Installed_libs/Time/Time.cpp
Executable file
307
Projects/libraries/Installed_libs/Time/Time.cpp
Executable file
@@ -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;
|
||||
}
|
||||
126
Projects/libraries/Installed_libs/Time/Time.h
Executable file
126
Projects/libraries/Installed_libs/Time/Time.h
Executable file
@@ -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 */
|
||||
|
||||
33
Projects/libraries/Installed_libs/Time/keywords.txt
Executable file
33
Projects/libraries/Installed_libs/Time/keywords.txt
Executable file
@@ -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)
|
||||
#######################################
|
||||
Reference in New Issue
Block a user