Library for the DS1620 Digital Thermometer

Revision:
0:45c93163189a
Child:
1:f6fbf299550b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DS1620.h	Sun Mar 08 00:31:35 2015 +0000
@@ -0,0 +1,205 @@
+// 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
\ No newline at end of file