DS3231 External RTC I2C

Dependents:   HumidityController

DS3231.h

Committer:
techstep
Date:
2014-08-06
Revision:
1:1607610a4ee9
Parent:
0:e4fbbd93299b

File content as of revision 1:1607610a4ee9:

/*****************************************************************************
 * Type : Header
 * File : DS3231.h
 * Dec. : DS3231 + AT24C32 IIC Module Precision RTC Module Memory Module
 * Copyright (c) 2013-2014, Bird Techstep, tbird_th@hotmail.com
 *
 * Remark Original codr from DS3231 Library [Arduino]
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * 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 OR COPYRIGHT HOLDERS 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.
 *****************************************************************************/
#ifndef DS3231_H
#define DS3231_H

#include "mbed.h"
#include "I2C.h"

class DS3231 {
public:
    /*************************************************************************
     * Create MAX72XX Object.
     *************************************************************************
     * @param scl_pin    : Clock
     * @param sda_pin    : Data Input & Output
     * @param addrDevice : Address device.
     *************************************************************************/
    DS3231(PinName sda_pin, PinName scl_pin);

    // Time-retrieval functions
    
    // the get*() functions retrieve current values of the registers.
    // If you only need one element, use that one for simplicity; but 
    // if you need the whole passel then use getTime() to avoid
    // the chance of rollover between reads of the different components.
    void getTime(uint8_t& year, uint8_t& month, uint8_t& date, uint8_t& DoW, uint8_t& hour, uint8_t& minute, uint8_t& second); 
    int8_t getSecond(); 
    uint8_t getMinute(); 
    uint8_t 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.
    uint8_t getDoW(); 
    uint8_t getDate(); 
    uint8_t getMonth(bool& Century); 
    // Also sets the flag indicating century roll-over.
    uint8_t 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(uint8_t Second); 
    // In addition to setting the seconds, this clears the 
    // "Oscillator Stop Flag".
    void setMinute(uint8_t Minute); 
    // Sets the minute
    void setHour(uint8_t Hour); 
    // Sets the hour
    void setDoW(uint8_t DoW); 
    // Sets the Day of the Week (1-7);
    void setDate(uint8_t Date); 
    // Sets the Date of the Month
    void setMonth(uint8_t Month); 
    // Sets the Month of the year
    void setYear(uint8_t 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(uint8_t& A1Day, uint8_t& A1Hour, uint8_t& A1Minute, uint8_t& A1Second, uint8_t& 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(uint8_t& A2Day, uint8_t& A2Hour, uint8_t& A2Minute, uint8_t& AlarmBits, bool& A2Dy, bool& A2h12, bool& A2PM); 
    // Same as getA1Time();, but A2 only goes on seconds == 00.
    void setA1Time(uint8_t A1Day, uint8_t A1Hour, uint8_t A1Minute, uint8_t A1Second, uint8_t AlarmBits, bool A1Dy, bool A1h12, bool A1PM); 
    // Set the details for Alarm 1
    void setA2Time(uint8_t A2Day, uint8_t A2Hour, uint8_t A2Minute, uint8_t AlarmBits, bool A2Dy, bool A2h12, bool A2PM); 
    // Set the details for Alarm 2
    void turnOnAlarm(uint8_t Alarm); 
    // Enables alarm 1 or 2 and the external interrupt pin.
    // If Alarm != 1, it assumes Alarm == 2.
    void turnOffAlarm(uint8_t Alarm); 
    // Disables alarm 1 or 2 (default is 2 if Alarm != 1);
    // and leaves the interrupt pin alone.
    bool checkAlarmEnabled(uint8_t Alarm); 
    // Returns T/F to indicate whether the requested alarm is
    // enabled. Defaults to 2 if Alarm != 1.
    bool checkIfAlarm(uint8_t Alarm); 
    // Checks whether the indicated alarm (1 or 2, 2 default);
    // has been activated.

    // Oscillator functions
    void enableOscillator(bool TF, bool battery, uint8_t 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:

    uint8_t decToBcd(uint8_t val); 
    // Convert normal decimal numbers to binary coded decimal
    uint8_t bcdToDec(uint8_t val); 
    // Convert binary coded decimal to normal decimal numbers
    uint8_t readControlByte(bool which); 
    // Read selected control byte: (0); reads 0x0e, (1) reads 0x0f
    void writeControlByte(uint8_t control, bool which); 
    // Write the selected control byte. 
    // which == false -> 0x0e, true->0x0f.
protected:
    I2C _i2c;
    //int8_t _addrDevice;
};

#endif // MAX72XX_H