From 9313e03cff10489c0202bd0075e7dedae337bd45 Mon Sep 17 00:00:00 2001 From: Patrice Godard Date: Fri, 1 May 2015 16:13:10 +0200 Subject: [PATCH] added schematics (work-in-progress) --- DS3231/.gitignore | 3 - DS3231/DS3231.cpp | 689 ---------------- DS3231/DS3231.h | 183 ----- DS3231/LICENSE | 24 - DS3231/README.md | 14 - .../DS3231_oscillator_test.pde | 38 - DS3231/examples/DS3231_set/DS3231_set.pde | 113 --- DS3231/examples/DS3231_test/DS3231_test.pde | 142 ---- DS3231/examples/echo_time/echo_time.pde | 45 -- DS3231/examples/now/now.pde | 41 - DS3231/examples/set_echo/set_echo.pde | 127 --- DS3231/keywords.txt | 33 - HorlogeBodet.atsuo | Bin 12800 -> 13824 bytes HorlogeBodet.cppproj | 235 +++++- HorlogeBodet.ino | 91 ++- Visual Micro/.HorlogeBodet.vsarduino.h | 1 + Visual Micro/Compile.vmps.xml | 6 +- Visual Micro/Configuration.Debug.vmps.xml | 6 +- Visual Micro/Upload.vmps.xml | 2 +- doc/Horloge Bodet.fzz | Bin 0 -> 49933 bytes doc/Kicad/ArduiBodet.bak | 549 +++++++++++++ doc/Kicad/ArduiBodet.cmp | 108 +++ doc/Kicad/ArduiBodet.dsn | 509 ++++++++++++ doc/Kicad/ArduiBodet.kicad_pcb | 734 ++++++++++++++++++ doc/Kicad/ArduiBodet.kicad_pcb-bak | 734 ++++++++++++++++++ doc/Kicad/ArduiBodet.net | 444 +++++++++++ doc/Kicad/ArduiBodet.pro | 62 ++ doc/Kicad/ArduiBodet.rules | 71 ++ doc/Kicad/ArduiBodet.sch | 509 ++++++++++++ doc/Kicad/ArduiBodet.ses | 579 ++++++++++++++ 30 files changed, 4615 insertions(+), 1477 deletions(-) delete mode 100644 DS3231/.gitignore delete mode 100644 DS3231/DS3231.cpp delete mode 100644 DS3231/DS3231.h delete mode 100644 DS3231/LICENSE delete mode 100644 DS3231/README.md delete mode 100644 DS3231/examples/DS3231_oscillator_test/DS3231_oscillator_test.pde delete mode 100644 DS3231/examples/DS3231_set/DS3231_set.pde delete mode 100644 DS3231/examples/DS3231_test/DS3231_test.pde delete mode 100644 DS3231/examples/echo_time/echo_time.pde delete mode 100644 DS3231/examples/now/now.pde delete mode 100644 DS3231/examples/set_echo/set_echo.pde delete mode 100644 DS3231/keywords.txt create mode 100644 doc/Horloge Bodet.fzz create mode 100644 doc/Kicad/ArduiBodet.bak create mode 100644 doc/Kicad/ArduiBodet.cmp create mode 100644 doc/Kicad/ArduiBodet.dsn create mode 100644 doc/Kicad/ArduiBodet.kicad_pcb create mode 100644 doc/Kicad/ArduiBodet.kicad_pcb-bak create mode 100644 doc/Kicad/ArduiBodet.net create mode 100644 doc/Kicad/ArduiBodet.pro create mode 100644 doc/Kicad/ArduiBodet.rules create mode 100644 doc/Kicad/ArduiBodet.sch create mode 100644 doc/Kicad/ArduiBodet.ses diff --git a/DS3231/.gitignore b/DS3231/.gitignore deleted file mode 100644 index 27ce29b..0000000 --- a/DS3231/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Linux temp files # -################### -*~ diff --git a/DS3231/DS3231.cpp b/DS3231/DS3231.cpp deleted file mode 100644 index 9437230..0000000 --- a/DS3231/DS3231.cpp +++ /dev/null @@ -1,689 +0,0 @@ -/* -DS3231.cpp: DS3231 Real-Time Clock library -Eric Ayars -4/1/11 - -Spliced in DateTime all-at-once reading (to avoid rollover) and unix time -from Jean-Claude Wippler and Limor Fried -Andy Wickert -5/15/11 - -Released into the public domain. -*/ - -#include - -// These included for the DateTime class inclusion; will try to find a way to -// not need them in the future... -#include -// Changed the following to work on 1.0 -//#include "WProgram.h" -#include - - -#define CLOCK_ADDRESS 0x68 - -#define SECONDS_FROM_1970_TO_2000 946684800 - - -// Constructor -DS3231::DS3231() { - // nothing to do for this constructor. -} - -// Utilities from JeeLabs/Ladyada - -//////////////////////////////////////////////////////////////////////////////// -// utility code, some of this could be exposed in the DateTime API if needed - -// DS3231 is smart enough to know this, but keeping it for now so I don't have -// to rewrite their code. -ADW -static const uint8_t daysInMonth [] PROGMEM = { 31,28,31,30,31,30,31,31,30,31,30,31 }; - -// number of days since 2000/01/01, valid for 2001..2099 -static uint16_t date2days(uint16_t y, uint8_t m, uint8_t d) { - if (y >= 2000) - y -= 2000; - uint16_t days = d; - for (uint8_t i = 1; i < m; ++i) - days += pgm_read_byte(daysInMonth + i - 1); - if (m > 2 && y % 4 == 0) - ++days; - return days + 365 * y + (y + 3) / 4 - 1; -} - -static long time2long(uint16_t days, uint8_t h, uint8_t m, uint8_t s) { - return ((days * 24L + h) * 60 + m) * 60 + s; -} - -/***************************************** - Public Functions - *****************************************/ - -/******************************************************************************* - * TO GET ALL DATE/TIME INFORMATION AT ONCE AND AVOID THE CHANCE OF ROLLOVER - * DateTime implementation spliced in here from Jean-Claude Wippler's (JeeLabs) - * RTClib, as modified by Limor Fried (Ladyada); source code at: - * https://github.com/adafruit/RTClib - ******************************************************************************/ - -//////////////////////////////////////////////////////////////////////////////// -// DateTime implementation - ignores time zones and DST changes -// NOTE: also ignores leap seconds, see http://en.wikipedia.org/wiki/Leap_second - -DateTime::DateTime (uint32_t t) { - t -= SECONDS_FROM_1970_TO_2000; // bring to 2000 timestamp from 1970 - - ss = t % 60; - t /= 60; - mm = t % 60; - t /= 60; - hh = t % 24; - uint16_t days = t / 24; - uint8_t leap; - for (yOff = 0; ; ++yOff) { - leap = yOff % 4 == 0; - if (days < 365 + leap) - break; - days -= 365 + leap; - } - for (m = 1; ; ++m) { - uint8_t daysPerMonth = pgm_read_byte(daysInMonth + m - 1); - if (leap && m == 2) - ++daysPerMonth; - if (days < daysPerMonth) - break; - days -= daysPerMonth; - } - d = days + 1; -} - -DateTime::DateTime (uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) { - if (year >= 2000) - year -= 2000; - yOff = year; - m = month; - d = day; - hh = hour; - mm = min; - ss = sec; -} - -static uint8_t conv2d(const char* p) { - uint8_t v = 0; - if ('0' <= *p && *p <= '9') - v = *p - '0'; - return 10 * v + *++p - '0'; -} - -// UNIX time: IS CORRECT ONLY WHEN SET TO UTC!!! -uint32_t DateTime::unixtime(void) const { - uint32_t t; - uint16_t days = date2days(yOff, m, d); - t = time2long(days, hh, mm, ss); - t += SECONDS_FROM_1970_TO_2000; // seconds from 1970 to 2000 - - return t; -} - -// Slightly modified from JeeLabs / Ladyada -// Get all date/time at once to avoid rollover (e.g., minute/second don't match) -static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); } -static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); } - -DateTime RTClib::now() { - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0); // I'm guessing the "0" is the I2C start signal - // i.e. go over everything, not just 1 register -ADW - Wire.endTransmission(); - - Wire.requestFrom(CLOCK_ADDRESS, 7); - uint8_t ss = bcd2bin(Wire.read() & 0x7F); - uint8_t mm = bcd2bin(Wire.read()); - uint8_t hh = bcd2bin(Wire.read()); - Wire.read(); - uint8_t d = bcd2bin(Wire.read()); - uint8_t m = bcd2bin(Wire.read()); - uint16_t y = bcd2bin(Wire.read()) + 2000; - - return DateTime (y, m, d, hh, mm, ss); -} - -///// ERIC'S ORIGINAL CODE FOLLOWS ///// - -byte DS3231::getSecond() { - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x00); - Wire.endTransmission(); - - Wire.requestFrom(CLOCK_ADDRESS, 1); - return bcdToDec(Wire.read()); -} - -byte DS3231::getMinute() { - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x01); - Wire.endTransmission(); - - Wire.requestFrom(CLOCK_ADDRESS, 1); - return bcdToDec(Wire.read()); -} - -byte DS3231::getHour(bool& h12, bool& PM) { - byte temp_buffer; - byte hour; - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x02); - Wire.endTransmission(); - - Wire.requestFrom(CLOCK_ADDRESS, 1); - temp_buffer = Wire.read(); - h12 = temp_buffer & 0b01000000; - if (h12) { - PM = temp_buffer & 0b00100000; - hour = bcdToDec(temp_buffer & 0b00011111); - } else { - hour = bcdToDec(temp_buffer & 0b00111111); - } - return hour; -} - -byte DS3231::getDoW() { - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x03); - Wire.endTransmission(); - - Wire.requestFrom(CLOCK_ADDRESS, 1); - return bcdToDec(Wire.read()); -} - -byte DS3231::getDate() { - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x04); - Wire.endTransmission(); - - Wire.requestFrom(CLOCK_ADDRESS, 1); - return bcdToDec(Wire.read()); -} - -byte DS3231::getMonth(bool& Century) { - byte temp_buffer; - byte hour; - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x05); - Wire.endTransmission(); - - Wire.requestFrom(CLOCK_ADDRESS, 1); - temp_buffer = Wire.read(); - Century = temp_buffer & 0b10000000; - return (bcdToDec(temp_buffer & 0b01111111)) ; -} - -byte DS3231::getYear() { - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x06); - Wire.endTransmission(); - - Wire.requestFrom(CLOCK_ADDRESS, 1); - return bcdToDec(Wire.read()); -} - -void DS3231::setSecond(byte Second) { - // Sets the seconds - // This function also resets the Oscillator Stop Flag, which is set - // whenever power is interrupted. - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x00); - Wire.write(decToBcd(Second)); - Wire.endTransmission(); - // Clear OSF flag - byte temp_buffer = readControlByte(1); - writeControlByte((temp_buffer & 0b01111111), 1); -} - -void DS3231::setMinute(byte Minute) { - // Sets the minutes - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x01); - Wire.write(decToBcd(Minute)); - Wire.endTransmission(); -} - -void DS3231::setHour(byte Hour) { - // Sets the hour, without changing 12/24h mode. - // The hour must be in 24h format. - - bool h12; - - // Start by figuring out what the 12/24 mode is - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x02); - Wire.endTransmission(); - Wire.requestFrom(CLOCK_ADDRESS, 1); - h12 = (Wire.read() & 0b01000000); - // if h12 is true, it's 12h mode; false is 24h. - - if (h12) { - // 12 hour - if (Hour > 12) { - Hour = decToBcd(Hour-12) | 0b01100000; - } else { - Hour = decToBcd(Hour) & 0b11011111; - } - } else { - // 24 hour - Hour = decToBcd(Hour) & 0b10111111; - } - - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x02); - Wire.write(Hour); - Wire.endTransmission(); -} - -void DS3231::setDoW(byte DoW) { - // Sets the Day of Week - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x03); - Wire.write(decToBcd(DoW)); - Wire.endTransmission(); -} - -void DS3231::setDate(byte Date) { - // Sets the Date - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x04); - Wire.write(decToBcd(Date)); - Wire.endTransmission(); -} - -void DS3231::setMonth(byte Month) { - // Sets the month - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x05); - Wire.write(decToBcd(Month)); - Wire.endTransmission(); -} - -void DS3231::setYear(byte Year) { - // Sets the year - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x06); - Wire.write(decToBcd(Year)); - Wire.endTransmission(); -} - -void DS3231::setClockMode(bool h12) { - // sets the mode to 12-hour (true) or 24-hour (false). - // One thing that bothers me about how I've written this is that - // if the read and right happen at the right hourly millisecnd, - // the clock will be set back an hour. Not sure how to do it better, - // though, and as long as one doesn't set the mode frequently it's - // a very minimal risk. - // It's zero risk if you call this BEFORE setting the hour, since - // the setHour() function doesn't change this mode. - - byte temp_buffer; - - // Start by reading byte 0x02. - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x02); - Wire.endTransmission(); - Wire.requestFrom(CLOCK_ADDRESS, 1); - temp_buffer = Wire.read(); - - // Set the flag to the requested value: - if (h12) { - temp_buffer = temp_buffer | 0x01000000; - } else { - temp_buffer = temp_buffer & 0x10111111; - } - - // Write the byte - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x02); - Wire.write(temp_buffer); - Wire.endTransmission(); -} - -float DS3231::getTemperature() { - // Checks the internal thermometer on the DS3231 and returns the - // temperature as a floating-point value. - byte temp; - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x11); - Wire.endTransmission(); - - Wire.requestFrom(CLOCK_ADDRESS, 2); - temp = Wire.read(); // Here's the MSB - return float(temp) + 0.25*(Wire.read()>>6); -} - -void DS3231::getA1Time(byte& A1Day, byte& A1Hour, byte& A1Minute, byte& A1Second, byte& AlarmBits, bool& A1Dy, bool& A1h12, bool& A1PM) { - byte temp_buffer; - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x07); - Wire.endTransmission(); - - Wire.requestFrom(CLOCK_ADDRESS, 4); - - temp_buffer = Wire.read(); // Get A1M1 and A1 Seconds - A1Second = bcdToDec(temp_buffer & 0b01111111); - // put A1M1 bit in position 0 of DS3231_AlarmBits. - AlarmBits = AlarmBits | (temp_buffer & 0b10000000)>>7; - - temp_buffer = Wire.read(); // Get A1M2 and A1 minutes - A1Minute = bcdToDec(temp_buffer & 0b01111111); - // put A1M2 bit in position 1 of DS3231_AlarmBits. - AlarmBits = AlarmBits | (temp_buffer & 0b10000000)>>6; - - temp_buffer = Wire.read(); // Get A1M3 and A1 Hour - // put A1M3 bit in position 2 of DS3231_AlarmBits. - AlarmBits = AlarmBits | (temp_buffer & 0b10000000)>>5; - // determine A1 12/24 mode - A1h12 = temp_buffer & 0b01000000; - if (A1h12) { - A1PM = temp_buffer & 0b00100000; // determine am/pm - A1Hour = bcdToDec(temp_buffer & 0b00011111); // 12-hour - } else { - A1Hour = bcdToDec(temp_buffer & 0b00111111); // 24-hour - } - - temp_buffer = Wire.read(); // Get A1M4 and A1 Day/Date - // put A1M3 bit in position 3 of DS3231_AlarmBits. - AlarmBits = AlarmBits | (temp_buffer & 0b10000000)>>4; - // determine A1 day or date flag - A1Dy = (temp_buffer & 0b01000000)>>6; - if (A1Dy) { - // alarm is by day of week, not date. - A1Day = bcdToDec(temp_buffer & 0b00001111); - } else { - // alarm is by date, not day of week. - A1Day = bcdToDec(temp_buffer & 0b00111111); - } -} - -void DS3231::getA2Time(byte& A2Day, byte& A2Hour, byte& A2Minute, byte& AlarmBits, bool& A2Dy, bool& A2h12, bool& A2PM) { - byte temp_buffer; - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x0b); - Wire.endTransmission(); - - Wire.requestFrom(CLOCK_ADDRESS, 3); - temp_buffer = Wire.read(); // Get A2M2 and A2 Minutes - A2Minute = bcdToDec(temp_buffer & 0b01111111); - // put A2M2 bit in position 4 of DS3231_AlarmBits. - AlarmBits = AlarmBits | (temp_buffer & 0b10000000)>>3; - - temp_buffer = Wire.read(); // Get A2M3 and A2 Hour - // put A2M3 bit in position 5 of DS3231_AlarmBits. - AlarmBits = AlarmBits | (temp_buffer & 0b10000000)>>2; - // determine A2 12/24 mode - A2h12 = temp_buffer & 0b01000000; - if (A2h12) { - A2PM = temp_buffer & 0b00100000; // determine am/pm - A2Hour = bcdToDec(temp_buffer & 0b00011111); // 12-hour - } else { - A2Hour = bcdToDec(temp_buffer & 0b00111111); // 24-hour - } - - temp_buffer = Wire.read(); // Get A2M4 and A1 Day/Date - // put A2M4 bit in position 6 of DS3231_AlarmBits. - AlarmBits = AlarmBits | (temp_buffer & 0b10000000)>>1; - // determine A2 day or date flag - A2Dy = (temp_buffer & 0b01000000)>>6; - if (A2Dy) { - // alarm is by day of week, not date. - A2Day = bcdToDec(temp_buffer & 0b00001111); - } else { - // alarm is by date, not day of week. - A2Day = bcdToDec(temp_buffer & 0b00111111); - } -} - -void DS3231::setA1Time(byte A1Day, byte A1Hour, byte A1Minute, byte A1Second, byte AlarmBits, bool A1Dy, bool A1h12, bool A1PM) { - // Sets the alarm-1 date and time on the DS3231, using A1* information - byte temp_buffer; - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x07); // A1 starts at 07h - // Send A1 second and A1M1 - Wire.write(decToBcd(A1Second) | ((AlarmBits & 0b00000001) << 7)); - // Send A1 Minute and A1M2 - Wire.write(decToBcd(A1Minute) | ((AlarmBits & 0b00000010) << 6)); - // Figure out A1 hour - if (A1h12) { - // Start by converting existing time to h12 if it was given in 24h. - if (A1Hour > 12) { - // well, then, this obviously isn't a h12 time, is it? - A1Hour = A1Hour - 12; - A1PM = true; - } - if (A1PM) { - // Afternoon - // Convert the hour to BCD and add appropriate flags. - temp_buffer = decToBcd(A1Hour) | 0b01100000; - } else { - // Morning - // Convert the hour to BCD and add appropriate flags. - temp_buffer = decToBcd(A1Hour) | 0b01000000; - } - } else { - // Now for 24h - temp_buffer = decToBcd(A1Hour); - } - temp_buffer = temp_buffer | ((AlarmBits & 0b00000100)<<5); - // A1 hour is figured out, send it - Wire.write(temp_buffer); - // Figure out A1 day/date and A1M4 - temp_buffer = ((AlarmBits & 0b00001000)<<4) | decToBcd(A1Day); - if (A1Dy) { - // Set A1 Day/Date flag (Otherwise it's zero) - temp_buffer = temp_buffer | 0b01000000; - } - Wire.write(temp_buffer); - // All done! - Wire.endTransmission(); -} - -void DS3231::setA2Time(byte A2Day, byte A2Hour, byte A2Minute, byte AlarmBits, bool A2Dy, bool A2h12, bool A2PM) { - // Sets the alarm-2 date and time on the DS3231, using A2* information - byte temp_buffer; - Wire.beginTransmission(CLOCK_ADDRESS); - Wire.write(0x0b); // A1 starts at 0bh - // Send A2 Minute and A2M2 - Wire.write(decToBcd(A2Minute) | ((AlarmBits & 0b00010000) << 3)); - // Figure out A2 hour - if (A2h12) { - // Start by converting existing time to h12 if it was given in 24h. - if (A2Hour > 12) { - // well, then, this obviously isn't a h12 time, is it? - A2Hour = A2Hour - 12; - A2PM = true; - } - if (A2PM) { - // Afternoon - // Convert the hour to BCD and add appropriate flags. - temp_buffer = decToBcd(A2Hour) | 0b01100000; - } else { - // Morning - // Convert the hour to BCD and add appropriate flags. - temp_buffer = decToBcd(A2Hour) | 0b01000000; - } - } else { - // Now for 24h - temp_buffer = decToBcd(A2Hour); - } - // add in A2M3 bit - temp_buffer = temp_buffer | ((AlarmBits & 0b00100000)<<2); - // A2 hour is figured out, send it - Wire.write(temp_buffer); - // Figure out A2 day/date and A2M4 - temp_buffer = ((AlarmBits & 0b01000000)<<1) | decToBcd(A2Day); - if (A2Dy) { - // Set A2 Day/Date flag (Otherwise it's zero) - temp_buffer = temp_buffer | 0b01000000; - } - Wire.write(temp_buffer); - // All done! - Wire.endTransmission(); -} - -void DS3231::turnOnAlarm(byte Alarm) { - // turns on alarm number "Alarm". Defaults to 2 if Alarm is not 1. - byte temp_buffer = readControlByte(0); - // modify control byte - if (Alarm == 1) { - temp_buffer = temp_buffer | 0b00000101; - } else { - temp_buffer = temp_buffer | 0b00000110; - } - writeControlByte(temp_buffer, 0); -} - -void DS3231::turnOffAlarm(byte Alarm) { - // turns off alarm number "Alarm". Defaults to 2 if Alarm is not 1. - // Leaves interrupt pin alone. - byte temp_buffer = readControlByte(0); - // modify control byte - if (Alarm == 1) { - temp_buffer = temp_buffer & 0b11111110; - } else { - temp_buffer = temp_buffer & 0b11111101; - } - writeControlByte(temp_buffer, 0); -} - -bool DS3231::checkAlarmEnabled(byte Alarm) { - // Checks whether the given alarm is enabled. - byte result = 0x0; - byte temp_buffer = readControlByte(0); - if (Alarm == 1) { - result = temp_buffer & 0b00000001; - } else { - result = temp_buffer & 0b00000010; - } - return result; -} - -bool DS3231::checkIfAlarm(byte Alarm) { - // Checks whether alarm 1 or alarm 2 flag is on, returns T/F accordingly. - // Turns flag off, also. - // defaults to checking alarm 2, unless Alarm == 1. - byte result; - byte temp_buffer = readControlByte(1); - if (Alarm == 1) { - // Did alarm 1 go off? - result = temp_buffer & 0b00000001; - // clear flag - temp_buffer = temp_buffer & 0b11111110; - } else { - // Did alarm 2 go off? - result = temp_buffer & 0b00000010; - // clear flag - temp_buffer = temp_buffer & 0b11111101; - } - writeControlByte(temp_buffer, 1); - return result; -} - -void DS3231::enableOscillator(bool TF, bool battery, byte frequency) { - // turns oscillator on or off. True is on, false is off. - // if battery is true, turns on even for battery-only operation, - // otherwise turns off if Vcc is off. - // frequency must be 0, 1, 2, or 3. - // 0 = 1 Hz - // 1 = 1.024 kHz - // 2 = 4.096 kHz - // 3 = 8.192 kHz (Default if frequency byte is out of range) - if (frequency > 3) frequency = 3; - // read control byte in, but zero out current state of RS2 and RS1. - byte temp_buffer = readControlByte(0) & 0b11100111; - if (battery) { - // turn on BBSQW flag - temp_buffer = temp_buffer | 0b01000000; - } else { - // turn off BBSQW flag - temp_buffer = temp_buffer & 0b10111111; - } - if (TF) { - // set ~EOSC to 0 and INTCN to zero. - temp_buffer = temp_buffer & 0b01111011; - } else { - // set ~EOSC to 1, leave INTCN as is. - temp_buffer = temp_buffer | 0b10000000; - } - // shift frequency into bits 3 and 4 and set. - frequency = frequency << 3; - temp_buffer = temp_buffer | frequency; - // And write the control bits - writeControlByte(temp_buffer, 0); -} - -void DS3231::enable32kHz(bool TF) { - // turn 32kHz pin on or off - byte temp_buffer = readControlByte(1); - if (TF) { - // turn on 32kHz pin - temp_buffer = temp_buffer | 0b00001000; - } else { - // turn off 32kHz pin - temp_buffer = temp_buffer & 0b11110111; - } - writeControlByte(temp_buffer, 1); -} - -bool DS3231::oscillatorCheck() { - // Returns false if the oscillator has been off for some reason. - // If this is the case, the time is probably not correct. - byte temp_buffer = readControlByte(1); - bool result = true; - if (temp_buffer & 0b10000000) { - // Oscillator Stop Flag (OSF) is set, so return false. - result = false; - } - return result; -} - -/***************************************** - Private Functions - *****************************************/ - -byte DS3231::decToBcd(byte val) { -// Convert normal decimal numbers to binary coded decimal - return ( (val/10*16) + (val%10) ); -} - -byte DS3231::bcdToDec(byte val) { -// Convert binary coded decimal to normal decimal numbers - return ( (val/16*10) + (val%16) ); -} - -byte DS3231::readControlByte(bool which) { - // Read selected control byte - // first byte (0) is 0x0e, second (1) is 0x0f - Wire.beginTransmission(CLOCK_ADDRESS); - if (which) { - // second control byte - Wire.write(0x0f); - } else { - // first control byte - Wire.write(0x0e); - } - Wire.endTransmission(); - Wire.requestFrom(CLOCK_ADDRESS, 1); - return Wire.read(); -} - -void DS3231::writeControlByte(byte control, bool which) { - // Write the selected control byte. - // which=false -> 0x0e, true->0x0f. - Wire.beginTransmission(CLOCK_ADDRESS); - if (which) { - Wire.write(0x0f); - } else { - Wire.write(0x0e); - } - Wire.write(control); - Wire.endTransmission(); -} - diff --git a/DS3231/DS3231.h b/DS3231/DS3231.h deleted file mode 100644 index a0d6008..0000000 --- a/DS3231/DS3231.h +++ /dev/null @@ -1,183 +0,0 @@ -/* - * DS3231.h - * - * Arduino Library for the DS3231 Real-Time Clock chip - * - * (c) Eric Ayars - * 4/1/11 - * released into the public domain. If you use this, please let me know - * (just out of pure curiosity!) by sending me an email: - * eric@ayars.org - * - */ - -// Modified by Andy Wickert 5/15/11: Spliced in stuff from RTClib - -#ifndef DS3231_h -#define DS3231_h - -// Changed the following to work on 1.0 -//#include "WProgram.h" -#include - -#include - -// DateTime (get everything at once) from JeeLabs / Adafruit -// Simple general-purpose date/time class (no TZ / DST / leap second handling!) -class DateTime { -public: - DateTime (uint32_t t =0); - DateTime (uint16_t year, uint8_t month, uint8_t day, - uint8_t hour =0, uint8_t min =0, uint8_t sec =0); - DateTime (const char* date, const char* time); - uint16_t year() const { return 2000 + yOff; } - uint8_t month() const { return m; } - uint8_t day() const { return d; } - uint8_t hour() const { return hh; } - uint8_t minute() const { return mm; } - uint8_t second() const { return ss; } - uint8_t dayOfWeek() const; - - // 32-bit times as seconds since 1/1/2000 - long secondstime() const; - // 32-bit times as seconds since 1/1/1970 - // THE ABOVE COMMENT IS CORRECT FOR LOCAL TIME; TO USE THIS COMMAND TO - // OBTAIN TRUE UNIX TIME SINCE EPOCH, YOU MUST CALL THIS COMMAND AFTER - // SETTING YOUR CLOCK TO UTC - uint32_t unixtime(void) const; - -protected: - uint8_t yOff, m, d, hh, mm, ss; -}; - -class RTClib { - public: - // Get date and time snapshot - static DateTime now(); -}; - -// Eric's original code is everything below this line -class DS3231 { - public: - - //Constructor - DS3231(); - - // Time-retrieval functions - - // the get*() functions retrieve current values of the registers. - byte getSecond(); - byte getMinute(); - byte getHour(bool& h12, bool& PM); - // In addition to returning the hour register, this function - // returns the values of the 12/24-hour flag and the AM/PM flag. - byte getDoW(); - byte getDate(); - byte getMonth(bool& Century); - // Also sets the flag indicating century roll-over. - byte getYear(); - // Last 2 digits only - - // Time-setting functions - // Note that none of these check for sensibility: You can set the - // date to July 42nd and strange things will probably result. - - void setSecond(byte Second); - // In addition to setting the seconds, this clears the - // "Oscillator Stop Flag". - void setMinute(byte Minute); - // Sets the minute - void setHour(byte Hour); - // Sets the hour - void setDoW(byte DoW); - // Sets the Day of the Week (1-7); - void setDate(byte Date); - // Sets the Date of the Month - void setMonth(byte Month); - // Sets the Month of the year - void setYear(byte Year); - // Last two digits of the year - void setClockMode(bool h12); - // Set 12/24h mode. True is 12-h, false is 24-hour. - - // Temperature function - - float getTemperature(); - - // Alarm functions - - void getA1Time(byte& A1Day, byte& A1Hour, byte& A1Minute, byte& A1Second, byte& AlarmBits, bool& A1Dy, bool& A1h12, bool& A1PM); -/* Retrieves everything you could want to know about alarm - * one. - * A1Dy true makes the alarm go on A1Day = Day of Week, - * A1Dy false makes the alarm go on A1Day = Date of month. - * - * byte AlarmBits sets the behavior of the alarms: - * Dy A1M4 A1M3 A1M2 A1M1 Rate - * X 1 1 1 1 Once per second - * X 1 1 1 0 Alarm when seconds match - * X 1 1 0 0 Alarm when min, sec match - * X 1 0 0 0 Alarm when hour, min, sec match - * 0 0 0 0 0 Alarm when date, h, m, s match - * 1 0 0 0 0 Alarm when DoW, h, m, s match - * - * Dy A2M4 A2M3 A2M2 Rate - * X 1 1 1 Once per minute (at seconds = 00) - * X 1 1 0 Alarm when minutes match - * X 1 0 0 Alarm when hours and minutes match - * 0 0 0 0 Alarm when date, hour, min match - * 1 0 0 0 Alarm when DoW, hour, min match - */ - void getA2Time(byte& A2Day, byte& A2Hour, byte& A2Minute, byte& AlarmBits, bool& A2Dy, bool& A2h12, bool& A2PM); - // Same as getA1Time();, but A2 only goes on seconds == 00. - void setA1Time(byte A1Day, byte A1Hour, byte A1Minute, byte A1Second, byte AlarmBits, bool A1Dy, bool A1h12, bool A1PM); - // Set the details for Alarm 1 - void setA2Time(byte A2Day, byte A2Hour, byte A2Minute, byte AlarmBits, bool A2Dy, bool A2h12, bool A2PM); - // Set the details for Alarm 2 - void turnOnAlarm(byte Alarm); - // Enables alarm 1 or 2 and the external interrupt pin. - // If Alarm != 1, it assumes Alarm == 2. - void turnOffAlarm(byte Alarm); - // Disables alarm 1 or 2 (default is 2 if Alarm != 1); - // and leaves the interrupt pin alone. - bool checkAlarmEnabled(byte Alarm); - // Returns T/F to indicate whether the requested alarm is - // enabled. Defaults to 2 if Alarm != 1. - bool checkIfAlarm(byte Alarm); - // Checks whether the indicated alarm (1 or 2, 2 default); - // has been activated. - - // Oscillator functions - - void enableOscillator(bool TF, bool battery, byte frequency); - // turns oscillator on or off. True is on, false is off. - // if battery is true, turns on even for battery-only operation, - // otherwise turns off if Vcc is off. - // frequency must be 0, 1, 2, or 3. - // 0 = 1 Hz - // 1 = 1.024 kHz - // 2 = 4.096 kHz - // 3 = 8.192 kHz (Default if frequency byte is out of range); - void enable32kHz(bool TF); - // Turns the 32kHz output pin on (true); or off (false). - bool oscillatorCheck();; - // Checks the status of the OSF (Oscillator Stop Flag);. - // If this returns false, then the clock is probably not - // giving you the correct time. - // The OSF is cleared by function setSecond();. - - private: - - byte decToBcd(byte val); - // Convert normal decimal numbers to binary coded decimal - byte bcdToDec(byte val); - // Convert binary coded decimal to normal decimal numbers - byte readControlByte(bool which); - // Read selected control byte: (0); reads 0x0e, (1) reads 0x0f - void writeControlByte(byte control, bool which); - // Write the selected control byte. - // which == false -> 0x0e, true->0x0f. - -}; - -#endif diff --git a/DS3231/LICENSE b/DS3231/LICENSE deleted file mode 100644 index 68a49da..0000000 --- a/DS3231/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to diff --git a/DS3231/README.md b/DS3231/README.md deleted file mode 100644 index 0ce41f5..0000000 --- a/DS3231/README.md +++ /dev/null @@ -1,14 +0,0 @@ -DS3231 -====== - -Library to communicate with Maxim's DS3231 high-precision real-time clock (RTC) - -Eric Ayars DS3231 library with JeeLabs/Ladyada's RTC libraries spliced in by -Andy Wickert - -Released into the public domain by Jeelabs, Ladyada, and Eric Ayars; public -domain release maintained by Andy Wickert, as his changes were mostly minor: -splicing the libraries, Arduino 1.0 compatibility for Eric's DS3231 library, -and adding an example or two. - -15 May 2011 (text but not code updated on 11 September 2013) diff --git a/DS3231/examples/DS3231_oscillator_test/DS3231_oscillator_test.pde b/DS3231/examples/DS3231_oscillator_test/DS3231_oscillator_test.pde deleted file mode 100644 index 9d30710..0000000 --- a/DS3231/examples/DS3231_oscillator_test/DS3231_oscillator_test.pde +++ /dev/null @@ -1,38 +0,0 @@ -/* -oscillator_test.pde -Eric Ayars -4/11 - -Test/demo of oscillator routines for a DS3231 RTC. - -Use a scope after loading this to check if things are -working as they should. - -*/ - -#include -#include - -DS3231 Clock; -byte j; -bool on = false; - -void setup() { - // Start the I2C interface - Wire.begin(); - // Start the serial interface - Serial.begin(9600); -} - -void loop() { - for (j=0;j<4;j++) { - // invert state of 32kHz oscillator. - on = !on; - Clock.enable32kHz(on); - // Turn on oscillator pin, frequency j - Clock.enableOscillator(true, false, j); - delay(4000); - } - // So... The 32kHz oscillator (pin 1) will turn on or off once each 2s, - // and the oscillator out pin (pin 3) will cycle through frequencies. -} diff --git a/DS3231/examples/DS3231_set/DS3231_set.pde b/DS3231/examples/DS3231_set/DS3231_set.pde deleted file mode 100644 index 3a758c2..0000000 --- a/DS3231/examples/DS3231_set/DS3231_set.pde +++ /dev/null @@ -1,113 +0,0 @@ -/* -DS3231_set.pde -Eric Ayars -4/11 - -Test of set-time routines for a DS3231 RTC - -*/ - -#include -#include - -DS3231 Clock; - -byte Year; -byte Month; -byte Date; -byte DoW; -byte Hour; -byte Minute; -byte Second; - -void GetDateStuff(byte& Year, byte& Month, byte& Day, byte& DoW, - byte& Hour, byte& Minute, byte& Second) { - // Call this if you notice something coming in on - // the serial port. The stuff coming in should be in - // the order YYMMDDwHHMMSS, with an 'x' at the end. - boolean GotString = false; - char InChar; - byte Temp1, Temp2; - char InString[20]; - - byte j=0; - while (!GotString) { - if (Serial.available()) { - InChar = Serial.read(); - InString[j] = InChar; - j += 1; - if (InChar == 'x') { - GotString = true; - } - } - } - Serial.println(InString); - // Read Year first - Temp1 = (byte)InString[0] -48; - Temp2 = (byte)InString[1] -48; - Year = Temp1*10 + Temp2; - // now month - Temp1 = (byte)InString[2] -48; - Temp2 = (byte)InString[3] -48; - Month = Temp1*10 + Temp2; - // now date - Temp1 = (byte)InString[4] -48; - Temp2 = (byte)InString[5] -48; - Day = Temp1*10 + Temp2; - // now Day of Week - DoW = (byte)InString[6] - 48; - // now Hour - Temp1 = (byte)InString[7] -48; - Temp2 = (byte)InString[8] -48; - Hour = Temp1*10 + Temp2; - // now Minute - Temp1 = (byte)InString[9] -48; - Temp2 = (byte)InString[10] -48; - Minute = Temp1*10 + Temp2; - // now Second - Temp1 = (byte)InString[11] -48; - Temp2 = (byte)InString[12] -48; - Second = Temp1*10 + Temp2; -} - -void setup() { - // Start the serial port - Serial.begin(9600); - - // Start the I2C interface - Wire.begin(); -} - -void loop() { - - // If something is coming in on the serial line, it's - // a time correction so set the clock accordingly. - if (Serial.available()) { - GetDateStuff(Year, Month, Date, DoW, Hour, Minute, Second); - - Clock.setClockMode(false); // set to 24h - //setClockMode(true); // set to 12h - - Clock.setYear(Year); - Clock.setMonth(Month); - Clock.setDate(Date); - Clock.setDoW(DoW); - Clock.setHour(Hour); - Clock.setMinute(Minute); - Clock.setSecond(Second); - - // Test of alarm functions - // set A1 to one minute past the time we just set the clock - // on current day of week. - Clock.setA1Time(DoW, Hour, Minute+1, Second, 0x0, true, - false, false); - // set A2 to two minutes past, on current day of month. - Clock.setA2Time(Date, Hour, Minute+2, 0x0, false, false, - false); - // Turn on both alarms, with external interrupt - Clock.turnOnAlarm(1); - Clock.turnOnAlarm(2); - - } - delay(1000); -} diff --git a/DS3231/examples/DS3231_test/DS3231_test.pde b/DS3231/examples/DS3231_test/DS3231_test.pde deleted file mode 100644 index 8d97185..0000000 --- a/DS3231/examples/DS3231_test/DS3231_test.pde +++ /dev/null @@ -1,142 +0,0 @@ -/* -DS3231_test.pde -Eric Ayars -4/11 - -Test/demo of read routines for a DS3231 RTC. - -Turn on the serial monitor after loading this to check if things are -working as they should. - -*/ - -#include -#include - -DS3231 Clock; -bool Century=false; -bool h12; -bool PM; -byte ADay, AHour, AMinute, ASecond, ABits; -bool ADy, A12h, Apm; - -void setup() { - // Start the I2C interface - Wire.begin(); - // Start the serial interface - Serial.begin(9600); -} - -void loop() { - // send what's going on to the serial monitor. - // Start with the year - Serial.print("2"); - if (Century) { // Won't need this for 89 years. - Serial.print("1"); - } else { - Serial.print("0"); - } - Serial.print(Clock.getYear(), DEC); - Serial.print(' '); - // then the month - Serial.print(Clock.getMonth(Century), DEC); - Serial.print(' '); - // then the date - Serial.print(Clock.getDate(), DEC); - Serial.print(' '); - // and the day of the week - Serial.print(Clock.getDoW(), DEC); - Serial.print(' '); - // Finally the hour, minute, and second - Serial.print(Clock.getHour(h12, PM), DEC); - Serial.print(' '); - Serial.print(Clock.getMinute(), DEC); - Serial.print(' '); - Serial.print(Clock.getSecond(), DEC); - // Add AM/PM indicator - if (h12) { - if (PM) { - Serial.print(" PM "); - } else { - Serial.print(" AM "); - } - } else { - Serial.print(" 24h "); - } - // Display the temperature - Serial.print("T="); - Serial.print(Clock.getTemperature(), 2); - // Tell whether the time is (likely to be) valid - if (Clock.oscillatorCheck()) { - Serial.print(" O+"); - } else { - Serial.print(" O-"); - } - // Indicate whether an alarm went off - if (Clock.checkIfAlarm(1)) { - Serial.print(" A1!"); - } - if (Clock.checkIfAlarm(2)) { - Serial.print(" A2!"); - } - // New line on display - Serial.print('\n'); - // Display Alarm 1 information - Serial.print("Alarm 1: "); - Clock.getA1Time(ADay, AHour, AMinute, ASecond, ABits, ADy, A12h, Apm); - Serial.print(ADay, DEC); - if (ADy) { - Serial.print(" DoW"); - } else { - Serial.print(" Date"); - } - Serial.print(' '); - Serial.print(AHour, DEC); - Serial.print(' '); - Serial.print(AMinute, DEC); - Serial.print(' '); - Serial.print(ASecond, DEC); - Serial.print(' '); - if (A12h) { - if (Apm) { - Serial.print('pm '); - } else { - Serial.print('am '); - } - } - if (Clock.checkAlarmEnabled(1)) { - Serial.print("enabled"); - } - Serial.print('\n'); - // Display Alarm 2 information - Serial.print("Alarm 2: "); - Clock.getA2Time(ADay, AHour, AMinute, ABits, ADy, A12h, Apm); - Serial.print(ADay, DEC); - if (ADy) { - Serial.print(" DoW"); - } else { - Serial.print(" Date"); - } - Serial.print(' '); - Serial.print(AHour, DEC); - Serial.print(' '); - Serial.print(AMinute, DEC); - Serial.print(' '); - if (A12h) { - if (Apm) { - Serial.print('pm'); - } else { - Serial.print('am'); - } - } - if (Clock.checkAlarmEnabled(2)) { - Serial.print("enabled"); - } - // display alarm bits - Serial.print('\nAlarm bits: '); - Serial.print(ABits, BIN); - - Serial.print('\n'); - Serial.print('\n'); - delay(1000); -} diff --git a/DS3231/examples/echo_time/echo_time.pde b/DS3231/examples/echo_time/echo_time.pde deleted file mode 100644 index 9cfecb1..0000000 --- a/DS3231/examples/echo_time/echo_time.pde +++ /dev/null @@ -1,45 +0,0 @@ -/* - -Sets the time and prints back time stamps for 5 seconds - -Based on DS3231_set.pde -by Eric Ayars -4/11 - -Added printing back of time stamps and increased baud rate -(to better synchronize computer and RTC) -Andy Wickert -5/15/2011 - -*/ - -#include -#include - -DS3231 Clock; - -void setup() { - // Start the serial port - Serial.begin(57600); - - // Start the I2C interface - Wire.begin(); - - - for (int i=0; i<5; i++){ - delay(1000); - Serial.print(Clock.getYear(), DEC); - Serial.print("-"); - Serial.print(Clock.getMonth(Century), DEC); - Serial.print("-"); - Serial.print(Clock.getDate(), DEC); - Serial.print(" "); - Serial.print(Clock.getHour(h12, PM), DEC); //24-hr - Serial.print(":"); - Serial.print(Clock.getMinute(), DEC); - Serial.print(":"); - Serial.println(Clock.getSecond(), DEC); -} - -void loop() {} - diff --git a/DS3231/examples/now/now.pde b/DS3231/examples/now/now.pde deleted file mode 100644 index 62e3bb4..0000000 --- a/DS3231/examples/now/now.pde +++ /dev/null @@ -1,41 +0,0 @@ -// now.pde -// Prints a snapshot of the current date and time along with the UNIX time -// Modified by Andy Wickert from the JeeLabs / Ladyada RTC library examples -// 5/15/11 - -#include -#include "DS3231.h" - -RTClib RTC; - -void setup () { - Serial.begin(57600); - Wire.begin(); -} - -void loop () { - - delay(1000); - - DateTime now = RTC.now(); - - Serial.print(now.year(), DEC); - Serial.print('/'); - Serial.print(now.month(), DEC); - Serial.print('/'); - Serial.print(now.day(), DEC); - Serial.print(' '); - Serial.print(now.hour(), DEC); - Serial.print(':'); - Serial.print(now.minute(), DEC); - Serial.print(':'); - Serial.print(now.second(), DEC); - Serial.println(); - - Serial.print(" since midnight 1/1/1970 = "); - Serial.print(now.unixtime()); - Serial.print("s = "); - Serial.print(now.unixtime() / 86400L); - Serial.println("d"); -} - diff --git a/DS3231/examples/set_echo/set_echo.pde b/DS3231/examples/set_echo/set_echo.pde deleted file mode 100644 index e0031e7..0000000 --- a/DS3231/examples/set_echo/set_echo.pde +++ /dev/null @@ -1,127 +0,0 @@ -/* - -Sets the time and prints back time stamps for 5 seconds - -Based on DS3231_set.pde -by Eric Ayars -4/11 - -Added printing back of time stamps and increased baud rate -(to better synchronize computer and RTC) -Andy Wickert -5/15/2011 - -*/ - -#include -#include - -DS3231 Clock; - -byte Year; -byte Month; -byte Date; -byte DoW; -byte Hour; -byte Minute; -byte Second; - -bool Century=false; -bool h12; -bool PM; - -void GetDateStuff(byte& Year, byte& Month, byte& Day, byte& DoW, - byte& Hour, byte& Minute, byte& Second) { - // Call this if you notice something coming in on - // the serial port. The stuff coming in should be in - // the order YYMMDDwHHMMSS, with an 'x' at the end. - boolean GotString = false; - char InChar; - byte Temp1, Temp2; - char InString[20]; - - byte j=0; - while (!GotString) { - if (Serial.available()) { - InChar = Serial.read(); - InString[j] = InChar; - j += 1; - if (InChar == 'x') { - GotString = true; - } - } - } - Serial.println(InString); - // Read Year first - Temp1 = (byte)InString[0] -48; - Temp2 = (byte)InString[1] -48; - Year = Temp1*10 + Temp2; - // now month - Temp1 = (byte)InString[2] -48; - Temp2 = (byte)InString[3] -48; - Month = Temp1*10 + Temp2; - // now date - Temp1 = (byte)InString[4] -48; - Temp2 = (byte)InString[5] -48; - Day = Temp1*10 + Temp2; - // now Day of Week - DoW = (byte)InString[6] - 48; - // now Hour - Temp1 = (byte)InString[7] -48; - Temp2 = (byte)InString[8] -48; - Hour = Temp1*10 + Temp2; - // now Minute - Temp1 = (byte)InString[9] -48; - Temp2 = (byte)InString[10] -48; - Minute = Temp1*10 + Temp2; - // now Second - Temp1 = (byte)InString[11] -48; - Temp2 = (byte)InString[12] -48; - Second = Temp1*10 + Temp2; -} - -void setup() { - // Start the serial port - Serial.begin(57600); - - // Start the I2C interface - Wire.begin(); -} - -void loop() { - - // If something is coming in on the serial line, it's - // a time correction so set the clock accordingly. - if (Serial.available()) { - GetDateStuff(Year, Month, Date, DoW, Hour, Minute, Second); - - Clock.setClockMode(false); // set to 24h - //setClockMode(true); // set to 12h - - Clock.setYear(Year); - Clock.setMonth(Month); - Clock.setDate(Date); - Clock.setDoW(DoW); - Clock.setHour(Hour); - Clock.setMinute(Minute); - Clock.setSecond(Second); - - // Give time at next five seconds - for (int i=0; i<5; i++){ - delay(1000); - Serial.print(Clock.getYear(), DEC); - Serial.print("-"); - Serial.print(Clock.getMonth(Century), DEC); - Serial.print("-"); - Serial.print(Clock.getDate(), DEC); - Serial.print(" "); - Serial.print(Clock.getHour(h12, PM), DEC); //24-hr - Serial.print(":"); - Serial.print(Clock.getMinute(), DEC); - Serial.print(":"); - Serial.println(Clock.getSecond(), DEC); - } - - } - delay(1000); -} diff --git a/DS3231/keywords.txt b/DS3231/keywords.txt deleted file mode 100644 index a82da80..0000000 --- a/DS3231/keywords.txt +++ /dev/null @@ -1,33 +0,0 @@ -DS3231 KEYWORD1 -RTClib KEYWORD1 -DateTime KEYWORD1 -now KEYWORD2 -secondstime KEYWORD2 -unixtime KEYWORD2 -getSecond KEYWORD2 -getMinute KEYWORD2 -getHour KEYWORD2 -getDoW KEYWORD2 -getDate KEYWORD2 -getMonth KEYWORD2 -getYear KEYWORD2 -setSecond KEYWORD2 -setMinute KEYWORD2 -setHour KEYWORD2 -setDoW KEYWORD2 -setDate KEYWORD2 -setMonth KEYWORD2 -setYear KEYWORD2 -setClockMode KEYWORD2 -getTemperature KEYWORD2 -getA1Time KEYWORD2 -getA2Time KEYWORD2 -setA1Time KEYWORD2 -setA2Time KEYWORD2 -turnOnAlarm KEYWORD2 -turnOffAlarm KEYWORD2 -checkAlarmEnabled KEYWORD2 -checkIfAlarm KEYWORD2 -enableOscillator KEYWORD2 -enable32kHz KEYWORD2 -oscillatorCheck KEYWORD2 diff --git a/HorlogeBodet.atsuo b/HorlogeBodet.atsuo index 526144636d7fe77b1aa4f00230e87faef7fdc0b4..ad2bb8b1e39207a43c66b94ea4fec994c65e2f76 100644 GIT binary patch delta 1385 zcmbVMO>7%Q6rQm+Tf3x*EjLc%Y-1;Nn&5cd@ekT23XwOqSE<@UBM@ACz_H!bWwDdk z(8O)PfK>@81(GLm014U>0TKeW-2)d?Spp>fgnEE00yQTDQV+TK67$AcDpk#)Vn%P@ zw=>_o-<_@HYWj_|#eRqo(ucBhbM^zeA?RK2J}tk~TfalCxY&@OD*PgJAp}QY6l!(> zmOHKr&+-LHtP45^o8l><$icQ)pFN9Ur`2j@P|uk-hdOWKdDQ1n3Ml7MUPR&imrPwU z^&;vej@M_ETedn~X99f^e)jrZdSPxUvsB2J)5&L|k!To|(Xb2D#v|tG@K8HM1kW4I z{f`M&bPwvl2{x?nUNZ&~&QkY^#EgX&j|hO16(4m{Uw8i7hrts{#s zZ$q=^q|Jwjmx|jL2M{n3s_v)Y4;F-Ncb)!ftn@Bgo{QnmMWT`j(MXCYB!@ z^~6_qoL_p#)gQWB-@u@7klKyc`#-hPOL(Fe;@%sMnbMM8n$J&{a`{RcUp9Q-+KynT zl9^FQ0Kxl4)At&sIanELS%Lyok6gCsr44^{;zOF8U^p+T5iO;}Qek;oiACjbILTx+ z6;@@&RF)WLnx-Y9tCuEE7s^?!py$g|@RN7AZ;z(&-i6M=tHYyRlu(M^`6$GBGv@c1 z;ldaGDJsI>er7a=-=ubW7&%@P-UOpEvSxMe+Tmx#$>PhpJ_SzOF_4BgAwDK;1ZM=N zNry_X2HQiUAjxU^5j2GnIu6%-BfNo~3rPBm8^HlrTmiT|Rt2Bm1+LI<$Nx|AZ9~a^ zA2cKh;@Z9Z%=bj zjSP0~avrtZ0LR>J-tFBn)bJw+p(GzFJ*OU>Fo|4k-Ny>UmNTXuSDsMDlaW=>4*B4( zz8L)87li9lWbbsaeYUoVBBqrl57y)jP#@32md69PndscKem@pEdExwb_e!G^nac73 zpaB=0kq*Mw%;xO*XYt2-SJnb|-@9v62~|3AcPy1AW&ES$NrhzbFC$~E7qHecRy>b5 qhdztwbLAn=*bQ9U9iRMn$<#8Q%i{W@+I+?AZ3ewmxJA5)z5fFB&|>ER delta 679 zcmZuu&ubGw6rS14F0(B*8=Ja9gKp+@WXd^Z& z22oHj`@l;TL<6Fy>Vic)*h9UFAbN?2e}D%M^$-x(*(3##4t($p-}~{s_w=H!ZDcr8 z;~wHhmKvluApbu6`d95Eb|8edyig?{h>KB>!V{p21XlRRnDyZYmyo{Bc@OpX=oW0;IcCa z3L&QMT*0_#wxv5<{~Ll3M$hrwam9#+&CS7km>y(BoD3b0l_8zC4IpR_%~M9Kfu1Cc zF!GK-)pM3eyWu;YI=*7A9=OVZJgvfsXaJJFIehy+D=ps)sIf34hyCz1Mwu-N+c7t$ z=8fTJ4j3a|NRDnusj{|Qm@R2bl}x%+E|v^=n+8}bf3F=MX5@j{mTMRC:/Program Files (x86)/Visual Micro/Visual Micro for Arduino/Micro Platforms/default/debuggers D:/arduino/arduino-1.0.5/hardware/arduino/libraries D:/arduino/arduino-1.0.5/libraries + C:/Users/xnrq8224/Documents/Arduino/libraries/Low-Power-master/utility + C:/Users/xnrq8224/Documents/Arduino/libraries/Low-Power-master C:/Users/xnrq8224/Documents/Arduino/libraries/DS3231/utility C:/Users/xnrq8224/Documents/Arduino/libraries/DS3231 D:/arduino/arduino-1.0.5/libraries/Wire/utility @@ -109,6 +111,8 @@ C:/Program Files (x86)/Visual Micro/Visual Micro for Arduino/Micro Platforms/default/debuggers D:/arduino/arduino-1.0.5/hardware/arduino/libraries D:/arduino/arduino-1.0.5/libraries + C:/Users/xnrq8224/Documents/Arduino/libraries/Low-Power-master/utility + C:/Users/xnrq8224/Documents/Arduino/libraries/Low-Power-master C:/Users/xnrq8224/Documents/Arduino/libraries/DS3231/utility C:/Users/xnrq8224/Documents/Arduino/libraries/DS3231 D:/arduino/arduino-1.0.5/libraries/Wire/utility @@ -124,13 +128,18 @@ True Default (-g2) True + + + C:\Users\xnrq8224\Documents\Arduino\libraries\Low-Power-master + + Default (-Wa,-g) - D:/arduino/arduino-1.0.5/hardware/arduino/cores/arduino;D:/arduino/arduino-1.0.5/hardware/arduino/variants/leonardo;D:/arduino/arduino-1.0.5/libraries;D:/arduino/arduino-1.0.5/hardware/arduino/libraries;C:/Program Files (x86)/Visual Micro/Visual Micro for Arduino/Micro Platforms/default/debuggers;C:/Users/xnrq8224/Documents/Arduino/libraries;d:/arduino/arduino-1.0.5/hardware/tools/avr/avr/include/;d:/arduino/arduino-1.0.5/hardware/tools/avr/avr/include/avr/;d:/arduino/arduino-1.0.5/hardware/tools/avr/avr/;d:/arduino/arduino-1.0.5/hardware/tools/avr/lib/gcc/avr/4.3.2/include/;;C:/Users/xnrq8224/Documents/Arduino/libraries/DS3231;C:/Users/xnrq8224/Documents/Arduino/libraries/DS3231/utility;D:/arduino/arduino-1.0.5/hardware/arduino/variants/standard;D:/arduino/arduino-1.0.5/libraries/Wire;D:/arduino/arduino-1.0.5/libraries/Wire/utility;D:/arduino/arduino-1.0.5/libraries/EEPROM;D:/arduino/arduino-1.0.5/libraries/EEPROM/utility; + D:/arduino/arduino-1.0.5/hardware/arduino/cores/arduino;D:/arduino/arduino-1.0.5/hardware/arduino/variants/leonardo;D:/arduino/arduino-1.0.5/libraries;D:/arduino/arduino-1.0.5/hardware/arduino/libraries;C:/Program Files (x86)/Visual Micro/Visual Micro for Arduino/Micro Platforms/default/debuggers;C:/Users/xnrq8224/Documents/Arduino/libraries;d:/arduino/arduino-1.0.5/hardware/tools/avr/avr/include/;d:/arduino/arduino-1.0.5/hardware/tools/avr/avr/include/avr/;d:/arduino/arduino-1.0.5/hardware/tools/avr/avr/;d:/arduino/arduino-1.0.5/hardware/tools/avr/lib/gcc/avr/4.3.2/include/;;C:/Users/xnrq8224/Documents/Arduino/libraries/DS3231;C:/Users/xnrq8224/Documents/Arduino/libraries/DS3231/utility;D:/arduino/arduino-1.0.5/hardware/arduino/variants/standard;D:/arduino/arduino-1.0.5/libraries/Wire;D:/arduino/arduino-1.0.5/libraries/Wire/utility;D:/arduino/arduino-1.0.5/libraries/EEPROM;D:/arduino/arduino-1.0.5/libraries/EEPROM/utility;D:/arduino/arduino-1.0.5/hardware/arduino/cores/arduino/avr-libc;C:/Users/xnrq8224/Documents/Arduino/libraries/Low-Power-master;C:/Users/xnrq8224/Documents/Arduino/libraries/Low-Power-master/utility; - COM5 + COM6 @@ -165,6 +174,8 @@ C:/Program Files (x86)/Visual Micro/Visual Micro for Arduino/Micro Platforms/default/debuggers D:/arduino/arduino-1.0.5/hardware/arduino/libraries D:/arduino/arduino-1.0.5/libraries + C:/Users/xnrq8224/Documents/Arduino/libraries/Low-Power-master/utility + C:/Users/xnrq8224/Documents/Arduino/libraries/Low-Power-master C:/Users/xnrq8224/Documents/Arduino/libraries/DS3231/utility C:/Users/xnrq8224/Documents/Arduino/libraries/DS3231 D:/arduino/arduino-1.0.5/libraries/Wire/utility @@ -203,6 +214,8 @@ C:/Program Files (x86)/Visual Micro/Visual Micro for Arduino/Micro Platforms/default/debuggers D:/arduino/arduino-1.0.5/hardware/arduino/libraries D:/arduino/arduino-1.0.5/libraries + C:/Users/xnrq8224/Documents/Arduino/libraries/Low-Power-master/utility + C:/Users/xnrq8224/Documents/Arduino/libraries/Low-Power-master C:/Users/xnrq8224/Documents/Arduino/libraries/DS3231/utility C:/Users/xnrq8224/Documents/Arduino/libraries/DS3231 D:/arduino/arduino-1.0.5/libraries/Wire/utility @@ -218,13 +231,18 @@ True Default (-g2) True + + + C:\Users\xnrq8224\Documents\Arduino\libraries\Low-Power-master + + Default (-Wa,-g) - D:/arduino/arduino-1.0.5/hardware/arduino/cores/arduino;D:/arduino/arduino-1.0.5/hardware/arduino/variants/leonardo;D:/arduino/arduino-1.0.5/libraries;D:/arduino/arduino-1.0.5/hardware/arduino/libraries;C:/Program Files (x86)/Visual Micro/Visual Micro for Arduino/Micro Platforms/default/debuggers;C:/Users/xnrq8224/Documents/Arduino/libraries;d:/arduino/arduino-1.0.5/hardware/tools/avr/avr/include/;d:/arduino/arduino-1.0.5/hardware/tools/avr/avr/include/avr/;d:/arduino/arduino-1.0.5/hardware/tools/avr/avr/;d:/arduino/arduino-1.0.5/hardware/tools/avr/lib/gcc/avr/4.3.2/include/;;C:/Users/xnrq8224/Documents/Arduino/libraries/DS3231;C:/Users/xnrq8224/Documents/Arduino/libraries/DS3231/utility;D:/arduino/arduino-1.0.5/hardware/arduino/variants/standard;D:/arduino/arduino-1.0.5/libraries/Wire;D:/arduino/arduino-1.0.5/libraries/Wire/utility;D:/arduino/arduino-1.0.5/libraries/EEPROM;D:/arduino/arduino-1.0.5/libraries/EEPROM/utility; + D:/arduino/arduino-1.0.5/hardware/arduino/cores/arduino;D:/arduino/arduino-1.0.5/hardware/arduino/variants/leonardo;D:/arduino/arduino-1.0.5/libraries;D:/arduino/arduino-1.0.5/hardware/arduino/libraries;C:/Program Files (x86)/Visual Micro/Visual Micro for Arduino/Micro Platforms/default/debuggers;C:/Users/xnrq8224/Documents/Arduino/libraries;d:/arduino/arduino-1.0.5/hardware/tools/avr/avr/include/;d:/arduino/arduino-1.0.5/hardware/tools/avr/avr/include/avr/;d:/arduino/arduino-1.0.5/hardware/tools/avr/avr/;d:/arduino/arduino-1.0.5/hardware/tools/avr/lib/gcc/avr/4.3.2/include/;;C:/Users/xnrq8224/Documents/Arduino/libraries/DS3231;C:/Users/xnrq8224/Documents/Arduino/libraries/DS3231/utility;D:/arduino/arduino-1.0.5/hardware/arduino/variants/standard;D:/arduino/arduino-1.0.5/libraries/Wire;D:/arduino/arduino-1.0.5/libraries/Wire/utility;D:/arduino/arduino-1.0.5/libraries/EEPROM;D:/arduino/arduino-1.0.5/libraries/EEPROM/utility;D:/arduino/arduino-1.0.5/hardware/arduino/cores/arduino/avr-libc;C:/Users/xnrq8224/Documents/Arduino/libraries/Low-Power-master;C:/Users/xnrq8224/Documents/Arduino/libraries/Low-Power-master/utility; - COM5 + COM6 @@ -234,9 +252,218 @@ + + + + + + + + + + + + + compile + src\sketch-api-readonly\libraries\DS3231\DS3231.cpp + + + compile + src\sketch-api-readonly\libraries\DS3231\DS3231.h + + + compile + src\sketch-api-readonly\core\Arduino.h + + + compile + src\sketch-api-readonly\core\avr-libc\malloc.c + + + compile + src\sketch-api-readonly\core\avr-libc\realloc.c + + + compile + src\sketch-api-readonly\core\avr-libc\sectionname.h + + + compile + src\sketch-api-readonly\core\avr-libc\stdlib_private.h + + + compile + src\sketch-api-readonly\core\binary.h + + + compile + src\sketch-api-readonly\core\CDC.cpp + + + compile + src\sketch-api-readonly\core\Client.h + + + compile + src\sketch-api-readonly\core\HardwareSerial.cpp + + + compile + src\sketch-api-readonly\core\HardwareSerial.h + + + compile + src\sketch-api-readonly\core\HID.cpp + + + compile + src\sketch-api-readonly\core\IPAddress.cpp + + + compile + src\sketch-api-readonly\core\IPAddress.h + + + compile + src\sketch-api-readonly\core\main.cpp + + + compile + src\sketch-api-readonly\core\new.cpp + + + compile + src\sketch-api-readonly\core\new.h + + + compile + src\sketch-api-readonly\core\Platform.h + + + compile + src\sketch-api-readonly\core\Print.cpp + + + compile + src\sketch-api-readonly\core\Print.h + + + compile + src\sketch-api-readonly\core\Printable.h + + + compile + src\sketch-api-readonly\core\Server.h + + + compile + src\sketch-api-readonly\core\Stream.cpp + + + compile + src\sketch-api-readonly\core\Stream.h + + + compile + src\sketch-api-readonly\core\Tone.cpp + + + compile + src\sketch-api-readonly\core\Udp.h + + + compile + src\sketch-api-readonly\core\USBAPI.h + + + compile + src\sketch-api-readonly\core\USBCore.cpp + + + compile + src\sketch-api-readonly\core\USBCore.h + + + compile + src\sketch-api-readonly\core\USBDesc.h + + + compile + src\sketch-api-readonly\core\WCharacter.h + + + compile + src\sketch-api-readonly\core\WInterrupts.c + + + compile + src\sketch-api-readonly\core\wiring.c + + + compile + src\sketch-api-readonly\core\wiring_analog.c + + + compile + src\sketch-api-readonly\core\wiring_digital.c + + + compile + src\sketch-api-readonly\core\wiring_private.h + + + compile + src\sketch-api-readonly\core\wiring_pulse.c + + + compile + src\sketch-api-readonly\core\wiring_shift.c + + + compile + src\sketch-api-readonly\core\WMath.cpp + + + compile + src\sketch-api-readonly\core\WString.cpp + + + compile + src\sketch-api-readonly\core\WString.h + + + compile + src\sketch-api-readonly\variants\leonardo\pins_arduino.h + + + compile + src\sketch-api-readonly\libraries\EEPROM\EEPROM.cpp + + + compile + src\sketch-api-readonly\libraries\EEPROM\EEPROM.h + + + compile + src\sketch-api-readonly\libraries\Wire\utility\twi.c + + + compile + src\sketch-api-readonly\libraries\Wire\utility\twi.h + + + compile + src\sketch-api-readonly\libraries\Wire\Wire.cpp + -I"D:\arduino\arduino-1.0.5\libraries\Wire\utility" + + + compile + src\sketch-api-readonly\libraries\Wire\Wire.h + -I"D:\arduino\arduino-1.0.5\libraries\Wire\utility" + compile diff --git a/HorlogeBodet.ino b/HorlogeBodet.ino index cd9d99c..fa0234c 100644 --- a/HorlogeBodet.ino +++ b/HorlogeBodet.ino @@ -1,21 +1,31 @@ #include #include -#include +#include "DS3231.h" +#include "LowPower.h" +//includes pour sleep mode +#include +#include +#include +#include -#ifdef ATTINY -#define PIN_1 1 -#define PIN_2 2 +#define DEBUG_SERIAL + +#if defined(__AVR_ATmega32U4__) +#define PIN_INTERRUPT 0 +#define ID_INTERRUPT 2 #else -#define PIN_1 12 -#define PIN_2 13 +#define ID_INTERRUPT 0 +#define PIN_INTERRUPT 2 #endif -#define PIN_FF 3 -#define PIN_INTERRUPT 0 +#define PIN_1 9 +#define PIN_2 10 +#define PIN_FF 4 #define PULSE_WIDTH 400 -#define PERIOD 30000 +#define PERIOD 1000 +//#define PERIOD 30000 #define OFFSET_WINTER 3600 #define OFFSET_SUMMER 7200 #define OFFSET_ADDRESS 0 @@ -23,14 +33,46 @@ //positive if clock is disabled (for specified number of cycles) //used to disable clock for 1h during winter time change uint8_t disabled = 0; +RTClib RTC; +DS3231 clock; + +/************************************************************************/ +/* Wake-up interrupt routine */ +/************************************************************************/ +void tick(){ + +} void setup() { + Wire.begin(); pinMode(PIN_1, OUTPUT); pinMode(PIN_2, OUTPUT); pinMode(PIN_FF,INPUT_PULLUP); + pinMode(PIN_INTERRUPT, INPUT); digitalWrite(PIN_1,LOW); digitalWrite(PIN_2,LOW); - //Serial.begin(115200); +#ifdef DEBUG_SERIAL + Serial.begin(57600); +#endif + //init RTC + clock.enableOscillator(true,false,0); //enable 1Hz on SQW output + + DateTime now = RTC.now(); + //TODO: remove true after tests + if(true || now.year() == 2000){ + //first run or dead battery, reinit to compile time & date + //DateTime newDT = DateTime(__DATE__, __TIME__); + DateTime newDT = DateTime(2015,5,1,15,20); + clock.setClockMode(false); // set to 24h + clock.setYear(newDT.year()-2000); + clock.setMonth(newDT.month()); + clock.setDate(newDT.day()); + clock.setHour(newDT.hour()); + clock.setMinute(newDT.minute()); + clock.setSecond(newDT.second()); + } + + attachInterrupt(ID_INTERRUPT, tick, RISING); } void pulse(uint16_t pulseWidth) @@ -133,7 +175,7 @@ uint16_t adjustDstEurope(DateTime t) uint32_t getCurrentTimeOffset() { - DateTime now = RTClib::now(); + DateTime now = RTC.now(); uint32_t offset = adjustDstEurope(now); return offset; } @@ -142,11 +184,11 @@ uint32_t getCurrentTimeOffset() void loop() { unsigned long t1,t2; //fast-forward mode - if(digitalRead(PIN_FF)){ + if(!digitalRead(PIN_FF)){ do{ pulse(PULSE_WIDTH); delay(400); - }while(digitalRead(PIN_FF)); + }while(!digitalRead(PIN_FF)); } //check if DTS time change is required //TODO implement @@ -162,5 +204,26 @@ void loop() { //updates are disabled disabled--; } - delay(PERIOD-((t2-t1))); + +#ifdef DEBUG_SERIAL + DateTime now = RTC.now(); + Serial.print(now.year(), DEC); + Serial.print('/'); + Serial.print(now.month(), DEC); + Serial.print('/'); + Serial.print(now.day(), DEC); + Serial.print(' '); + Serial.print(now.hour(), DEC); + Serial.print(':'); + Serial.print(now.minute(), DEC); + Serial.print(':'); + Serial.print(now.second(), DEC); + Serial.println(); +#endif + //delay(PERIOD-((t2-t1))); + // Enter power down state with ADC and BOD module disabled. + // Wake up when wake up pin is rising + //TODO set BOD_OFF after tests + LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_ON); + } diff --git a/Visual Micro/.HorlogeBodet.vsarduino.h b/Visual Micro/.HorlogeBodet.vsarduino.h index e65cd1c..f2900c0 100644 --- a/Visual Micro/.HorlogeBodet.vsarduino.h +++ b/Visual Micro/.HorlogeBodet.vsarduino.h @@ -16,6 +16,7 @@ #define __AVR__ extern "C" void __cxa_pure_virtual() {;} +void tick(); // void pulse(uint16_t pulseWidth); void recordOffset(uint16_t offset); diff --git a/Visual Micro/Compile.vmps.xml b/Visual Micro/Compile.vmps.xml index c9e35df..041f0d4 100644 --- a/Visual Micro/Compile.vmps.xml +++ b/Visual Micro/Compile.vmps.xml @@ -1,9 +1,9 @@ - + - + - + diff --git a/Visual Micro/Configuration.Debug.vmps.xml b/Visual Micro/Configuration.Debug.vmps.xml index 66f7b34..16fce6c 100644 --- a/Visual Micro/Configuration.Debug.vmps.xml +++ b/Visual Micro/Configuration.Debug.vmps.xml @@ -1,9 +1,9 @@ - + - + - + \ No newline at end of file diff --git a/Visual Micro/Upload.vmps.xml b/Visual Micro/Upload.vmps.xml index dfe45ab..041f0d4 100644 --- a/Visual Micro/Upload.vmps.xml +++ b/Visual Micro/Upload.vmps.xml @@ -1,7 +1,7 @@ - + diff --git a/doc/Horloge Bodet.fzz b/doc/Horloge Bodet.fzz new file mode 100644 index 0000000000000000000000000000000000000000..98f40ca3d986b47d76427f9a07558d934f9931fd GIT binary patch literal 49933 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