Library for the DS1721, 2-Wire Digital Thermometer and Thermostat from Dallas Semiconductor (Maxim Integrated)
Diff: DS1721.cpp
- Revision:
- 1:4fd830a97574
- Child:
- 2:22dbeccb82be
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DS1721.cpp Thu May 02 17:12:06 2013 +0000 @@ -0,0 +1,258 @@ +/*********************************************************************************** + * @file ds1721.cpp + * @brief Source file, enabling communication to/from the Dallas Semiconductor + * (Maxim Integrated) DS1721 2-Wire Digital Theremometer and Thermostat. + * @version 1.00 + * @date 04/29/2013 + * + * @author Cameron Haegle + * @company Digi International + * @copyright + * + * @limitations + * + * + **********************************************************************************/ + + +#include "ds1721.h" + +/** + * + **/ +DS1721::DS1721(PinName sda, PinName scl, int addr) : m_i2c(sda, scl) , m_addr(addr) +{ + _resolution = RES_9_BIT; + _polarity = POLARITY_ACTIVE_HIGH; + _mode = CONV_FOREVER; + _num_read = 1; + + setConfig(_resolution | _polarity | _one_shot); +} + +/** + * + **/ +DS1721::DS1721(PinName sda, PinName scl, int addr, int resolution, int polarity, int mode) + : m_i2c(sda, scl) , m_addr(addr) , _resolution(resolution) , _polarity(polarity) , _one_shot(one_shot) +{ + _num_read = 1; + setConfig(_resolution | _polarity | _mode); +} + +/** + * deconstructor + * + **/ +DS1721::~DS1721(void) +{ +} + + +/** + * + **/ +int DS1721::setConfig(int config) +{ + char cmd[2]; + cmd[0] = CMD_ACCESS_CFG; + cmd[1] = (config & 0xFF); + + if(!m_i2c.write(m_addr, cmd, 2) != 0) + { + return 0; + } + return 1; +} + +/** + * + **/ +int DS1721::getConfig(int* config) +{ + char cmd[2]; + + cmd[0] = CMD_ACCESS_CFG; // 0xAC + if(m_i2c.write(m_addr, cmd, 1) != 0) + { + return 0; + } + //Delay(RW_DELAY); + if((m_i2c.read(m_addr, cmd, 1)) != 0) + { + return 0; + } + *config = cmd[0]; + return 1; +} + + +int DS1721::getTemp(void) +{ + char cmd[3]; + + cmd[0] = CMD_READ_TEMP; + + // if this is the first read, since power up, perform the read twice + // this eliminate an erroneous initial read. + do + { + if((m_i2c.write(m_addr, cmd, 1)) != 0) + { + return 0; + } + //Delay(RW_DELAY); + // read 1 byte, ignoring fractional portion of temperature + if((m_i2c.read(m_addr, cmd, 2)) != 0) + { + return 0; + } + _num_read--; + }while(_num_read); + + _num_read = 1; + + return cmd[0]; +} + + +/** + * + * + **/ +int DS1721::setPolarity(int polarity) +{ + _polarity = polarity; + return setConfig(_resolution | _polarity | _one_shot); +} + +/** + * + * + **/ +int DS1721::getPolarity(void) +{ + int config; + getConfig(&config); + return ((config & (1<<1)) ? 1: 0); +} + + +/** + * + * + **/ +int DS1721::startConversion(void) +{ + char cmd[1]; + + cmd[0] = CMD_START_CONVT; // 0x51 + + if((m_i2c.write(m_addr, cmd, 1)) != 1) + { + return 0; + } + return 1; +} + +/** + * + * + **/ +int DS1721::stopConversion(void) +{ + char cmd[1]; + + cmd[0] = CMD_STOP_CONVT; // 0x51 + + if((m_i2c.write(m_addr, cmd, 1)) != 0) + { + return 0; + } + return 1; +} + +/** + * + **/ +int DS1721::getLowSetpoint(void) +{ + char cmd[4]; + + cmd[0] = CMD_ACCESS_TL; + if((m_i2c.write(m_addr, cmd, 1)) != 0) + { + //return FALSE; + } + //Delay(RW_DELAY); + + // read back TL msb & lsb bytes + if((m_i2c.read(m_addr, cmd, 2)) != 0) + { + return 0; + } + _tl = (cmd[0] & 0xFF); + return _tl; +} + +/** + * + **/ +int DS1721::setLowSetpoint(int newSp) +{ + char cmd[3]; + + _tl = newSp; + + cmd[0] = CMD_ACCESS_TL; + cmd[1] = _tl; // temp MSB + cmd[2] = 0x80; // temp LSB (+/-0.5) + + if((m_i2c.write(m_addr, cmd, 3)) != 0) + { + return 0; + } + return 1; +} + +/** + * + **/ +int DS1721::getHighSetpoint(void) +{ + char cmd[3]; + + cmd[0] = CMD_ACCESS_TH; + if((m_i2c.write(m_addr, cmd, 1)) != 0) + { + //return 0; + } + //Delay(RW_DELAY); + // read back TL msb & lsb bytes + if((m_i2c.read(m_addr, cmd, 2)) != 0) + { + //return 0; + } + _th = (cmd[0] & 0xFF); + return _th; +} + +/** + * + **/ +int DS1721::setHighSetpoint(int newSp) +{ + char cmd[3]; + + _th = newSp; + + cmd[0] = CMD_ACCESS_TH; + cmd[1] = _th; // temp MSB + cmd[2] = 0x00; // temp LSB + + if((m_i2c.write(m_addr, cmd, 3)) != 0) + { + return 0; + } + return 1; +}