Library for the DS1620 Digital Thermometer

DS1620.h

Committer:
rybancr
Date:
2015-03-08
Revision:
0:45c93163189a
Child:
1:f6fbf299550b

File content as of revision 0:45c93163189a:

// Library for the DS1620 digital thermometer
// Copyright (C) <2015> Ryan Bancroft
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// For copy of the GNU General Public License
// see <http://www.gnu.org/licenses/>.


#ifndef DS1620_H
#define DS1620_H

#include "mbed.h"

//#define CLOCK_FREQUENCY 1000000.0
//#define CLOCK_DELAY 1.0 / CLOCK_FREQUENCY / 2.0

enum clock_frequencies_t {freq500k = 1, 
                          freq250k = 2,
                          freq125k = 4,
                          freq20k = 25,
                          freq10k = 50,
                          freq1k = 500}; 
                          
#define CLOCK_DELAY freq500k

// Command definitions
#define READ_TEMPERATURE 0xAA
#define WRITE_TH         0x01
#define WRITE_TL         0x02
#define READ_TH          0xA1
#define READ_TL          0xA2
#define READ_COUNTER     0xA0
#define READ_SLOPE       0xA9
#define START_CONVERT    0xEE
#define STOP_CONVERT     0x22
#define WRITE_CONFIG     0x0C
#define READ_CONFIG      0xAC
#define LOAD_SLOPE       0x41

/**
* Example:
* @code
* // Send the temperature to your computer
* #include "mbed.h"
* #include "DS1620.h"
*
* DS1620 temperatureSensor(p11, p12, p13);
* Serial pc(USBTX, USBRX);
*
* int main() {
*   //Set mode to CPU & One Shot if it's not already set.
*   if((temperatureSensor.readConfig() & 0x03) != 0x03) {
*      temperatureSensor.writeConfig(0x03);
*   }
*   
*   float temperature = 0.0;
*   while(1) {
*       temperatureSensor.startConversion();
*       wait(1.0); //Wait for the temperature conversion to complete.  You can also poll the DONE flag in the STATUS REGISTER
*       temperature = temperatureSensor.getHighResolutionTemperature();
*       pc.printf("%.2f C\r\n", temperature);
*   }       
* }
* @endcode
*/

// Class declaration
class DS1620
{
    public:
        DS1620 (PinName dq, PinName clk, PinName rst);
        ~DS1620 ();
 
 
        /**
        * Get the temperature in degrees Celsius
        * 
        * @returns The temperature in Celsius with 0.5 degree resolution as a float 
        */
        float getTemperature();
        
        
        /**
        * Get the temperature in degrees Celsius
        * 
        * @returns The temperature in Celsius calculated using the COUNTER and SLOPE REGISTERS as a float
        * @note The DS1620 must be in 1SHOT mode for accurate results.
        */
        float getHighResolutionTemperature();
 
        /**
        * Read the TEMPERATURE REGISTER
        * 
        * @returns The temperature in Celsius with 0.5 degree resolution as stored in the DS1620 registers 
        */       
        unsigned short readTemperatureRaw();
        
        /**
        * Read the CONFIGURATION/STATUS REGISTER
        * 
        * @returns The value of the CONFIGURATION/STATUS REGISTER 
        */
        unsigned char readConfig();
        
        /**
        * Write to the CONFIGURATION/STATUS REGISTER
        * 
        * @param  config  The value to write to the CONFIGURATION/STATUS REGISTER 
        */
        void writeConfig(unsigned char config);
        

        /**
        * Read the TL (Thermostat Low Limit) REGISTER
        * 
        * @returns  The value to write to the TL (Thermostat Low Limit) REGISTER in the DS1620 format
        */        
        unsigned short readTLRaw();
        
        /**
        * Write to the TL (Thermostat Low Limit) REGISTER
        * 
        * @param  temperature  The value to write to the TL (Thermostat Low Limit) REGISTER in the DS1620 format
        */
        void writeTLRaw(unsigned short temperature);
        
        
        /**
        * Read the TH (Thermostat High Limit) REGISTER
        * 
        * @returns  The value to write to the TH (Thermostat High Limit) REGISTER in the DS1620 format
        */
        unsigned short readTHRaw();
        
        
        /**
        * Write to the TH (Thermostat High Limit) REGISTER
        * 
        * @param  temperature  The value to write to the TH (Thermostat High Limit) REGISTER in the DS1620 format
        */
        void writeTHRaw(unsigned short temperature);
        
        /**
        * Read the COUNTER REGISTER
        * 
        * @returns The COUNTER REGISTER
        */
        unsigned short readCounter();
        
        /**
        * Read the SLOPE REGISTER
        * 
        * @returns The SLOPE REGISTER
        */
        unsigned short readSlope();
        
        
        /**
        * Loads the SLOPE REGISTER into the COUNTER REGISTER
        */
        void loadSlope();
        
        
        /**
        * Starts a temperature conversion
        */        
        void startConversion();
        
        
        /**
        * Stops a temperature conversion
        */
        void stopConversion();
        
        /**
        * Sets the clock frequency for the serial interface
        *
        * @param frequency (freq500k, freq250k, freq125k, freq20k, freq10k, freq1k)
        * @note Defaults to 500KHz (freq500k)
        */
        void setSerialClockFrequency(clock_frequencies_t frequency);
        

    private:
        void shiftOut(unsigned char data);
        unsigned char shiftIn();
        
        clock_frequencies_t _clockDelay;
        
        DigitalInOut _dq;
        DigitalOut _clk;
        DigitalOut _rst;
        
};

#endif