Complete DS1621 library (all functions implemented)
Diff: ds1621.h
- Revision:
- 0:096dbb58d60e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ds1621.h Sat Jul 14 08:20:05 2012 +0000 @@ -0,0 +1,264 @@ +#ifndef DS1621__H_ +#define DS1621__H_ + +// Includes +#include <string> + +#include "mbed.h" + +// Example +/* +#include <string> + +#include "mbed.h" +#include "ds1621.h" +#define DS1621_ADDR 0 // I2c DS1621 address is 0x00 + +static void myerror(std::string msg) +{ + printf("Error %s\n",msg.c_str()); + exit(1); +} + +int main() +{ + DS1621 ds(p9,p10,DS1621_ADDR); // Declare DS1621 i2c with sda = p9 and scl = p10 + bool tlf,thf; + uint8_t i; + uint8_t config; + uint16_t count = 0; + float temp = 0.0; + + printf("Test DS1621 I2C\n\n"); + + // Check error + if(ds.getError() != 0) + myerror(ds.getErrorMessage()); + + // Config with OneShot and Pol high and test error + ds.setConfig(DS1621_1Shot | DS1621_PolHigh); + if(ds.getError() != 0) + myerror(ds.getErrorMessage()); + + // Read Config register + config = ds.getConfig(); + if(ds.getError() != 0) + myerror(ds.getErrorMessage()); + printf("DS1621 Config : %02X\n",config); + + printf("Test HR Temperature\n"); + + // Test HR temperature + for(i = 0;i < 24;i++) { + temp = ds.getHrTemp(); + if(ds.getError() != 0) + myerror(ds.getErrorMessage()); + printf("Measurment at start + %d seconds, Temperature HR = %.2f\n",(count*5),temp); + wait(5.0); + count++; + } + + printf("Test Temperature\n"); + + // Test temperature + count = 0; + for(i = 0;i < 12;i++) { + temp = ds.getTemp(); + if(ds.getError() != 0) + myerror(ds.getErrorMessage()); + printf("Measurment at start + %d seconds, Temperature = %.2f\n",(count*5),temp); + wait(5.0); + count++; + } + + // Config with Continuous and Pol high + ds.setConfig(DS1621_PolHigh); + if(ds.getError() != 0) + myerror(ds.getErrorMessage()); + + // Read Config register + config = ds.getConfig(); + if(ds.getError() != 0) + myerror(ds.getErrorMessage()); + printf("DS1621 Config : %02X\n",config); + + // Write trigger temperatures + ds.setTemperature(18.0,DS1621_Access_TL); + if(ds.getError() != 0) + myerror(ds.getErrorMessage()); + ds.setTemperature(25.5,DS1621_Access_TH); + if(ds.getError() != 0) + myerror(ds.getErrorMessage()); + + printf("Test temperature and triggers\n"); + while(1) { + temp = ds.getTemp(); + if(ds.getError() != 0) + myerror(ds.getErrorMessage()); + ds.getTF(tlf,thf); + if(ds.getError() != 0) + myerror(ds.getErrorMessage()); + printf("Temperature=%.2f TLF %d THF %d\n",temp,tlf,thf); + wait(5.0); + } +} +*/ + +// Defines +#define DS1621_address 0x90 + +#define DS1621_PolHigh 0x02 +#define DS1621_1Shot 0x01 +#define DS1621_DONE 0x80 + +#define DS1621_CFG_1SHOT 0 +#define DS1621_CFG_POL 1 +#define DS1621_CFG_TLF 5 +#define DS1621_CFG_THF 6 +#define DS1621_CFG_DONE 7 + +#define DS1621_Access_TH 0 +#define DS1621_Access_TL 1 + +#define DS1621_NoError 0x00 +#define DS1621_BadAddress 0x01 +#define DS1621_I2cError 0x02 +#define DS1621_ParamError 0x03 + +#define DS1621_MaxError 4 + +static std::string _ErrorMessageDS1621[DS1621_MaxError] = { + "", + "Bad chip address", + "I2C error (nack)", + "Invalid parameter", + }; + +// Class +class DS1621 { +public: + /* + * Constructor, initialize the ds1621 on i2c interface. + * @param sda : sda i2c pin (PinName) + * @param scl : scl i2c pin (PinName) + * @param address : ds1621 address between 0 and 7 (uint8_t) + * @return none + */ + DS1621(PinName sda, PinName scl, uint8_t address); + + /* + * Get temperature from the ds1621 with 0.5 degrees resolution + * @param : none + * @return current temperature in degrees Celsius between -55 and +125 (float) + */ + float getTemp(void); + + /* + * Get temperature from the ds1621 with 0.01 degrees resolution + * @param : none + * @return current temperature in degrees Celsius between -55 and +125 (float) + */ + float getHrTemp(void); + + /* + * Read config register + * @param : none + * @return current config register value (uin8_t) + */ + uint8_t getConfig(void); + + /* + * Write config register + * @param config : config value (uint8_t) + * @return none + */ + void setConfig(uint8_t config); + + /* + * Start / stop convert + * @param flag : start convert if true else stop + * @return none + */ + void startConvert(bool flag); + + /* + * Wait end of conversion (Config register bit 7 at 1) + * @param : none + * @return none + */ + void waitEndConvert(void); + + /* + * Get Temperature High Flag + * @param : none + * @return thf flag (bool) + */ + bool getTHF(void); + + /* + * Get Temperature Low Flag + * @param : none + * @return tlf flag (bool) + */ + bool getTLF(void); + + /* + * Get Temperature Low and High Flags + * @param tlf : temperature low flag (uint8_t&) + * @param thf : temperature high flag (uint8_t&) + * @return none + */ + void getTF(bool& tlf,bool& thf); + + /* + *Get 1Shot bit + *@param : none + *@return true if 1Shot (bool) + */ + bool get1Shot(void); + + /* + *Set Temperature (High or Low) + *@param temp : temperature, the fractionnal part is rounded to 0.5 (float) + *@param trig : mode,low or high (uint8_t) [DS1621_Access_TL DS1621_Access_TH] + *@return none + */ + void setTemperature(float temp,uint8_t trig); + + /* + *Get Temperature (High or Low) + *@param trig : mode,low or high (uint8_t) [DS1621_Access_TL DS1621_Access_TH] + *@return temperature, with 0.5 degrees Celsius resolution (float) + */ + float getTemperature(uint8_t trig); + + /* + *Get current error message + *@param : none + *@return current error message(std::string) + */ + std::string getErrorMessage(void) + { + if(_errnum < DS1621_MaxError) + return(_ErrorMessageDS1621[_errnum]); + else + return("errnum out of range"); + } + + /* + * Get the current error number (DS1621_NoError if no error) + * @param : none + * @return current error number (uint8_t) + */ + uint8_t getError(void); + +//---------- local variables ---------- +private: + I2C _i2c; // Local i2c communication interface instance + int _address; // Local ds1621 i2c address + uint8_t _errnum; // Error number + uint8_t _config; // Config register value +//------------------------------------- +}; + +#endif \ No newline at end of file