189 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 * 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
 | 
						|
// Modified by Simon Gassner 11/28/2017: Changed Term "PM" to "PM_time" for compability with SAMD Processors
 | 
						|
#ifndef DS3231_h
 | 
						|
#define DS3231_h
 | 
						|
 | 
						|
// Changed the following to work on 1.0
 | 
						|
//#include "WProgram.h"
 | 
						|
#include <Arduino.h>
 | 
						|
 | 
						|
#include <Wire.h>
 | 
						|
 | 
						|
// 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 dayOfTheWeek() 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;
 | 
						|
};
 | 
						|
 | 
						|
//checks if a year is a leap year
 | 
						|
bool isleapYear(const uint8_t);
 | 
						|
 | 
						|
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_time); 
 | 
						|
			// 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
 | 
						|
 | 
						|
	protected:
 | 
						|
 | 
						|
		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
 |