library for ADT7410 temperature sensor first version
Diff: adt7410.cpp
- Revision:
- 3:41839eb9229f
- Parent:
- 2:d12dffd027a8
- Child:
- 5:d003a86ca20e
--- a/adt7410.cpp Sun Apr 27 19:05:13 2014 +0000 +++ b/adt7410.cpp Tue Apr 29 00:35:40 2014 +0000 @@ -1,8 +1,11 @@ #include "adt7410.h" -ADT7410::ADT7410(PinName sda, PinName scl, int i2cFrequencyHz, int address,CONF_RESOLUTION res ):i2c(sda,scl), i2cAddr(address), resolution(res){ +ADT7410::ADT7410(PinName sda, PinName scl, int i2cFrequencyHz, int address,CONF_RESOLUTION res ):i2c(sda,scl), i2cAddr(address){ i2c.frequency(i2cFrequencyHz); + if(res==_16_BIT){ + setResolution(_16_BIT); + } } @@ -13,16 +16,16 @@ char temp[2]; temp[0]=regAddress; temp[1]=data; - return i2c.write(ADT7410_I2C_ADDRESS,temp,2)==0; + return i2c.write(i2cAddr,temp,2)==0; } - +//read data from the sensor int ADT7410::read(uint8_t regAddress, uint8_t *data,int length){ - i2c.write(i2cAddr,(char*)®Address,1); - return i2c.read(i2cAddr,(char*)data,length)==0; + if(i2c.read(i2cAddr,(char*)data,length)==0) return 1; + return -1; } //configuration of ADT7410 sensor @@ -39,11 +42,11 @@ } // read 13 bit temperature -int ADT7410::readTemp(float* temperature){ +int ADT7410::readTemp(){ char rData[2] = {0,0}; - float tFin = 0; - int tRaw = 0; + float tempFin = 0; + int tempRaw = 0; // set address pointer to temperature register if(i2c.write(i2cAddr, 0x00, 1))return -1; @@ -53,22 +56,44 @@ // temperature returned is only 13 bits // discard alarm flags in lower bits - tRaw = (rData[0] << 8) | (rData[1]); - tRaw >>= 3; - - // handle positive and negative temperatures - // results in two's complement - if ( tRaw & 0x1000) { - tFin = (float) (tRaw - 8192) / 16; - } else { - tFin = (float) tRaw / 16; + tempRaw = (rData[0] << 8) | (rData[1]); + if(resolution==_13_BIT){ ////resolution 13 --- bit 0.0625°C + tempRaw >>= 3; + if ( tempRaw & 0x1000) { + tempFin = (float) (tempRaw - 8192) / 16; + } + else { + tempFin = (float) tempRaw / 16; + } } - *temperature=tFin; + else{ //resolution 16bit --- 0.0078°C. + + if(tempRaw &0x8000){ + tempFin =(float) (tempRaw-65536)/128; + } + else + tempFin =(float)tempRaw/128; + } + + currentTemperature=tempFin; return 1; } - +int ADT7410::setResolution(CONF_RESOLUTION res){ + + uint8_t temp=0; + + int retVal=0; + if(!read(0x03,&temp,1)) return -1; + temp|=res<<7; + if( !write(0x03,temp)) + + retVal=0; + else retVal=1; + + return retVal; + } int ADT7410::getIdNumber(void){ @@ -76,10 +101,9 @@ uint8_t data=0; uint8_t regAddress=0x0B; - if(i2c.write(i2cAddr,(char*)®Address,1)) return -1; + if(i2c.write(i2cAddr,(char*)®Address,1,true)) return -1; if(i2c.read(i2cAddr,(char*)&data,1)) return -1; - else return data;