diff --git a/Clock/Clock.ino b/Clock/Clock.ino index cc53465..f941d41 100644 --- a/Clock/Clock.ino +++ b/Clock/Clock.ino @@ -3,7 +3,7 @@ #include #include -TM1636 tm1636(7,8); +TM1636 tm1636(7, 8); void setup() { tm1636.init(); @@ -17,30 +17,18 @@ void loop() { int h = tm.Hour; int m = tm.Minute; int s = tm.Second; - - - if (h >= 0 && h < 10) { - t[0] = 0; - t[1] = h; - } else { - t[0] = h / 10; - t[1] = h % 10; - } - - if (m >= 0 && m < 10) { - t[2] = 0; - t[3] = m; - } else { - t[2] = m / 10; - t[3] = m % 10; - } - - if((s % 2) == 0) { + + t[0] = h / 10; + t[1] = h % 10; + t[2] = m / 10; + t[3] = m % 10; + + if ((s % 2) == 0) { tm1636.point(POINT_ON); } else { tm1636.point(POINT_OFF); } - + tm1636.display(t); delay(1000); } diff --git a/__libraries/DS1307RTC/DS1307RTC.cpp b/__libraries/DS1307RTC/DS1307RTC.cpp new file mode 100644 index 0000000..7d0f1cf --- /dev/null +++ b/__libraries/DS1307RTC/DS1307RTC.cpp @@ -0,0 +1,142 @@ +/* + * DS1307RTC.h - library for DS1307 RTC + + Copyright (c) Michael Margolis 2009 + This library is intended to be uses with Arduino Time.h library functions + + The 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 + + 30 Dec 2009 - Initial release + 5 Sep 2011 updated for Arduino 1.0 + */ + +#include +#include "DS1307RTC.h" + +#define DS1307_CTRL_ID 0x68 + +DS1307RTC::DS1307RTC() +{ + Wire.begin(); +} + +// PUBLIC FUNCTIONS +time_t DS1307RTC::get() // Aquire data from buffer and convert to time_t +{ + tmElements_t tm; + if (read(tm) == false) return 0; + return(makeTime(tm)); +} + +bool DS1307RTC::set(time_t t) +{ + tmElements_t tm; + breakTime(t, tm); + tm.Second |= 0x80; // stop the clock + write(tm); + tm.Second &= 0x7f; // start the clock + write(tm); +} + +// Aquire data from the RTC chip in BCD format +bool DS1307RTC::read(tmElements_t &tm) +{ + uint8_t sec; + Wire.beginTransmission(DS1307_CTRL_ID); +#if ARDUINO >= 100 + Wire.write((uint8_t)0x00); +#else + Wire.send(0x00); +#endif + if (Wire.endTransmission() != 0) { + exists = false; + return false; + } + exists = true; + + // request the 7 data fields (secs, min, hr, dow, date, mth, yr) + Wire.requestFrom(DS1307_CTRL_ID, tmNbrFields); + if (Wire.available() < tmNbrFields) return false; +#if ARDUINO >= 100 + sec = Wire.read(); + tm.Second = bcd2dec(sec & 0x7f); + tm.Minute = bcd2dec(Wire.read() ); + tm.Hour = bcd2dec(Wire.read() & 0x3f); // mask assumes 24hr clock + tm.Wday = bcd2dec(Wire.read() ); + tm.Day = bcd2dec(Wire.read() ); + tm.Month = bcd2dec(Wire.read() ); + tm.Year = y2kYearToTm((bcd2dec(Wire.read()))); +#else + sec = Wire.receive(); + tm.Second = bcd2dec(sec & 0x7f); + tm.Minute = bcd2dec(Wire.receive() ); + tm.Hour = bcd2dec(Wire.receive() & 0x3f); // mask assumes 24hr clock + tm.Wday = bcd2dec(Wire.receive() ); + tm.Day = bcd2dec(Wire.receive() ); + tm.Month = bcd2dec(Wire.receive() ); + tm.Year = y2kYearToTm((bcd2dec(Wire.receive()))); +#endif + if (sec & 0x80) return false; // clock is halted + return true; +} + +bool DS1307RTC::write(tmElements_t &tm) +{ + Wire.beginTransmission(DS1307_CTRL_ID); +#if ARDUINO >= 100 + Wire.write((uint8_t)0x00); // reset register pointer + Wire.write(dec2bcd(tm.Second)) ; + Wire.write(dec2bcd(tm.Minute)); + Wire.write(dec2bcd(tm.Hour)); // sets 24 hour format + Wire.write(dec2bcd(tm.Wday)); + Wire.write(dec2bcd(tm.Day)); + Wire.write(dec2bcd(tm.Month)); + Wire.write(dec2bcd(tmYearToY2k(tm.Year))); +#else + Wire.send(0x00); // reset register pointer + Wire.send(dec2bcd(tm.Second)) ; + Wire.send(dec2bcd(tm.Minute)); + Wire.send(dec2bcd(tm.Hour)); // sets 24 hour format + Wire.send(dec2bcd(tm.Wday)); + Wire.send(dec2bcd(tm.Day)); + Wire.send(dec2bcd(tm.Month)); + Wire.send(dec2bcd(tmYearToY2k(tm.Year))); +#endif + if (Wire.endTransmission() != 0) { + exists = false; + return false; + } + exists = true; + return true; +} + +// PRIVATE FUNCTIONS + +// Convert Decimal to Binary Coded Decimal (BCD) +uint8_t DS1307RTC::dec2bcd(uint8_t num) +{ + return ((num/10 * 16) + (num % 10)); +} + +// Convert Binary Coded Decimal (BCD) to Decimal +uint8_t DS1307RTC::bcd2dec(uint8_t num) +{ + return ((num/16 * 10) + (num % 16)); +} + +bool DS1307RTC::exists = false; + +DS1307RTC RTC = DS1307RTC(); // create an instance for the user + diff --git a/__libraries/DS1307RTC/DS1307RTC.h b/__libraries/DS1307RTC/DS1307RTC.h new file mode 100644 index 0000000..b71abfd --- /dev/null +++ b/__libraries/DS1307RTC/DS1307RTC.h @@ -0,0 +1,37 @@ +/* + * DS1307RTC.h - library for DS1307 RTC + * This library is intended to be uses with Arduino Time.h library functions + */ + +#ifndef DS1307RTC_h +#define DS1307RTC_h + +#include + +// library interface description +class DS1307RTC +{ + // user-accessible "public" interface + public: + DS1307RTC(); + static time_t get(); + static bool set(time_t t); + static bool read(tmElements_t &tm); + static bool write(tmElements_t &tm); + static bool chipPresent() { return exists; } + + private: + static bool exists; + static uint8_t dec2bcd(uint8_t num); + static uint8_t bcd2dec(uint8_t num); +}; + +#ifdef RTC +#undef RTC // workaround for Arduino Due, which defines "RTC"... +#endif + +extern DS1307RTC RTC; + +#endif + + diff --git a/__libraries/DS1307RTC/examples/ReadTest/ReadTest.ino b/__libraries/DS1307RTC/examples/ReadTest/ReadTest.ino new file mode 100644 index 0000000..52ac566 --- /dev/null +++ b/__libraries/DS1307RTC/examples/ReadTest/ReadTest.ino @@ -0,0 +1,49 @@ +#include +#include +#include + +void setup() { + Serial.begin(9600); + while (!Serial) ; // wait for serial + delay(200); + Serial.println("DS1307RTC Read Test"); + Serial.println("-------------------"); +} + +void loop() { + tmElements_t tm; + + if (RTC.read(tm)) { + Serial.print("Ok, Time = "); + print2digits(tm.Hour); + Serial.write(':'); + print2digits(tm.Minute); + Serial.write(':'); + print2digits(tm.Second); + Serial.print(", Date (D/M/Y) = "); + Serial.print(tm.Day); + Serial.write('/'); + Serial.print(tm.Month); + Serial.write('/'); + Serial.print(tmYearToCalendar(tm.Year)); + Serial.println(); + } else { + if (RTC.chipPresent()) { + Serial.println("The DS1307 is stopped. Please run the SetTime"); + Serial.println("example to initialize the time and begin running."); + Serial.println(); + } else { + Serial.println("DS1307 read error! Please check the circuitry."); + Serial.println(); + } + delay(9000); + } + delay(1000); +} + +void print2digits(int number) { + if (number >= 0 && number < 10) { + Serial.write('0'); + } + Serial.print(number); +} diff --git a/__libraries/DS1307RTC/examples/SetTime/SetTime.ino b/__libraries/DS1307RTC/examples/SetTime/SetTime.ino new file mode 100644 index 0000000..8d5e67d --- /dev/null +++ b/__libraries/DS1307RTC/examples/SetTime/SetTime.ino @@ -0,0 +1,75 @@ +#include +#include +#include + +const char *monthName[12] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +}; + +tmElements_t tm; + +void setup() { + bool parse=false; + bool config=false; + + // get the date and time the compiler was run + if (getDate(__DATE__) && getTime(__TIME__)) { + parse = true; + // and configure the RTC with this info + if (RTC.write(tm)) { + config = true; + } + } + + Serial.begin(9600); + while (!Serial) ; // wait for Arduino Serial Monitor + delay(200); + if (parse && config) { + Serial.print("DS1307 configured Time="); + Serial.print(__TIME__); + Serial.print(", Date="); + Serial.println(__DATE__); + } else if (parse) { + Serial.println("DS1307 Communication Error :-{"); + Serial.println("Please check your circuitry"); + } else { + Serial.print("Could not parse info from the compiler, Time=\""); + Serial.print(__TIME__); + Serial.print("\", Date=\""); + Serial.print(__DATE__); + Serial.println("\""); + } +} + +void loop() { +} + +bool getTime(const char *str) +{ + int Hour, Min, Sec; + + if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false; + tm.Hour = Hour; + tm.Minute = Min; + tm.Second = Sec; + return true; +} + +bool getDate(const char *str) +{ + char Month[12]; + int Day, Year; + uint8_t monthIndex; + + if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false; + for (monthIndex = 0; monthIndex < 12; monthIndex++) { + if (strcmp(Month, monthName[monthIndex]) == 0) break; + } + if (monthIndex >= 12) return false; + tm.Day = Day; + tm.Month = monthIndex + 1; + tm.Year = CalendarYrToTm(Year); + return true; +} + diff --git a/__libraries/DS1307RTC/keywords.txt b/__libraries/DS1307RTC/keywords.txt new file mode 100644 index 0000000..2fe86ca --- /dev/null +++ b/__libraries/DS1307RTC/keywords.txt @@ -0,0 +1,23 @@ +####################################### +# Syntax Coloring Map For DS1307RTC +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +####################################### +# Methods and Functions (KEYWORD2) +####################################### +get KEYWORD2 +set KEYWORD2 +read KEYWORD2 +write KEYWORD2 +chipPresent KEYWORD2 +####################################### +# Instances (KEYWORD2) +####################################### +RTC KEYWORD2 +####################################### +# Constants (LITERAL1) +####################################### diff --git a/__libraries/DS1307RTC/library.properties b/__libraries/DS1307RTC/library.properties new file mode 100644 index 0000000..f39b262 --- /dev/null +++ b/__libraries/DS1307RTC/library.properties @@ -0,0 +1,10 @@ +name=DS1307RTC +version=1.4 +author=Michael Margolis +maintainer=Paul Stoffregen +sentence=Use a DS1307 Real Time Clock chip with the Time library +paragraph= +category=Timing +url=http://playground.arduino.cc/code/time +architectures=* + diff --git a/__libraries/DS1307RTC/readme.txt b/__libraries/DS1307RTC/readme.txt new file mode 100644 index 0000000..5978295 --- /dev/null +++ b/__libraries/DS1307RTC/readme.txt @@ -0,0 +1,7 @@ +Readme file for DS1307RTC Library + +The DS1307RTC library is provided to demonstrate the Arduino Time library. + +See the TimeRTC example sketches privided with the Time library download for usage + +