library for ADT7410 temperature sensor first version

Committer:
igbt6
Date:
Sun Dec 21 11:42:40 2014 +0000
Revision:
5:d003a86ca20e
Parent:
3:41839eb9229f
library for ADT7410 temperature sensor first version done

Who changed what in which revision?

UserRevisionLine numberNew contents of line
igbt6 1:131a836c6b79 1 #include "adt7410.h"
igbt6 1:131a836c6b79 2
igbt6 2:d12dffd027a8 3
igbt6 5:d003a86ca20e 4 ADT7410::ADT7410(PinName sda, PinName scl, int i2cFrequencyHz, int address):mI2c(sda,scl), mI2cAddr(address)
igbt6 5:d003a86ca20e 5 {
igbt6 5:d003a86ca20e 6 mI2c.frequency(i2cFrequencyHz);
igbt6 5:d003a86ca20e 7 setConfiguration();
igbt6 5:d003a86ca20e 8 mTemperature= UNSET_ADT7410_TEMPERATURE;
igbt6 1:131a836c6b79 9 }
igbt6 1:131a836c6b79 10
igbt6 1:131a836c6b79 11
igbt6 1:131a836c6b79 12
igbt6 5:d003a86ca20e 13
igbt6 5:d003a86ca20e 14 bool ADT7410::write(uint8_t regAddress, uint8_t* data,int dataLength)
igbt6 5:d003a86ca20e 15 {
igbt6 5:d003a86ca20e 16 uint8_t tempBuf[dataLength+1];
igbt6 5:d003a86ca20e 17 tempBuf[0]=regAddress;
igbt6 5:d003a86ca20e 18 memcpy(&(tempBuf[1]),data,dataLength);
igbt6 5:d003a86ca20e 19 return mI2c.write(mI2cAddr,(char*)tempBuf,dataLength+1)==0;
igbt6 5:d003a86ca20e 20
igbt6 5:d003a86ca20e 21 }
igbt6 5:d003a86ca20e 22
igbt6 3:41839eb9229f 23 //read data from the sensor
igbt6 5:d003a86ca20e 24 bool ADT7410::read(uint8_t regAddress, uint8_t *data,int dataLength)
igbt6 5:d003a86ca20e 25 {
igbt6 5:d003a86ca20e 26 mI2c.write(mI2cAddr,(char*)&regAddress,1,true);
igbt6 5:d003a86ca20e 27 return (mI2c.read(mI2cAddr,(char*)data,dataLength)==0);
igbt6 2:d12dffd027a8 28 }
igbt6 2:d12dffd027a8 29
igbt6 5:d003a86ca20e 30
igbt6 2:d12dffd027a8 31 //configuration of ADT7410 sensor
igbt6 5:d003a86ca20e 32 bool ADT7410::setConfiguration(CONF_FAULT_QUEUE faultQueue, CONF_CT_PIN_POLARITY ctPinPolarity, CONF_INT_PIN_POLARITY intPinPolarity, CONF_INT_CT_MODE intCtMode, CONF_OPERATION_MODE operMode, CONF_RESOLUTION res)
igbt6 5:d003a86ca20e 33 {
igbt6 2:d12dffd027a8 34 uint8_t confByte=0;
igbt6 2:d12dffd027a8 35 confByte=(res<<7|operMode<<5|intCtMode<<4|intPinPolarity<<3|ctPinPolarity<<2|faultQueue);
igbt6 5:d003a86ca20e 36 if(write(0x03,&confByte,1)) {
igbt6 5:d003a86ca20e 37 mResolution = res;
igbt6 5:d003a86ca20e 38 return true;
igbt6 2:d12dffd027a8 39 }
igbt6 5:d003a86ca20e 40 return false;
igbt6 5:d003a86ca20e 41 }
igbt6 2:d12dffd027a8 42
igbt6 2:d12dffd027a8 43 // read 13 bit temperature
igbt6 5:d003a86ca20e 44 bool ADT7410::readTemp()
igbt6 5:d003a86ca20e 45 {
igbt6 5:d003a86ca20e 46
igbt6 5:d003a86ca20e 47 uint8_t data[2];
igbt6 3:41839eb9229f 48 float tempFin = 0;
igbt6 3:41839eb9229f 49 int tempRaw = 0;
igbt6 2:d12dffd027a8 50
igbt6 2:d12dffd027a8 51
igbt6 2:d12dffd027a8 52 // read temperature register, two bytes
igbt6 5:d003a86ca20e 53 if(!read(0x00, data, 2)) {
igbt6 5:d003a86ca20e 54 mTemperature= UNSET_ADT7410_TEMPERATURE;
igbt6 5:d003a86ca20e 55 return false;
igbt6 2:d12dffd027a8 56
igbt6 5:d003a86ca20e 57 }
igbt6 5:d003a86ca20e 58
igbt6 5:d003a86ca20e 59 // temperature received takes only 13 bits
igbt6 2:d12dffd027a8 60 // discard alarm flags in lower bits
igbt6 5:d003a86ca20e 61 tempRaw = (data[0] << 8) | (data[1]);
igbt6 5:d003a86ca20e 62 if(mResolution==_13_BIT) { ////resolution 13 --- bit 0.0625°C
igbt6 3:41839eb9229f 63 tempRaw >>= 3;
igbt6 3:41839eb9229f 64 if ( tempRaw & 0x1000) {
igbt6 3:41839eb9229f 65 tempFin = (float) (tempRaw - 8192) / 16;
igbt6 5:d003a86ca20e 66 } else {
igbt6 5:d003a86ca20e 67 tempFin = (float) tempRaw / 16;
igbt6 3:41839eb9229f 68 }
igbt6 5:d003a86ca20e 69 } else { //resolution 16bit --- 0.0078°C.
igbt6 5:d003a86ca20e 70
igbt6 5:d003a86ca20e 71 if(tempRaw &0x8000) {
igbt6 3:41839eb9229f 72 tempFin =(float) (tempRaw-65536)/128;
igbt6 5:d003a86ca20e 73 } else
igbt6 3:41839eb9229f 74 tempFin =(float)tempRaw/128;
igbt6 3:41839eb9229f 75 }
igbt6 5:d003a86ca20e 76
igbt6 5:d003a86ca20e 77 mTemperature=tempFin;
igbt6 5:d003a86ca20e 78 return true;
igbt6 2:d12dffd027a8 79 }
igbt6 2:d12dffd027a8 80
igbt6 2:d12dffd027a8 81
igbt6 5:d003a86ca20e 82 bool ADT7410::setResolution(CONF_RESOLUTION res)
igbt6 5:d003a86ca20e 83 {
igbt6 5:d003a86ca20e 84
igbt6 5:d003a86ca20e 85 uint8_t tempVal=0;
igbt6 5:d003a86ca20e 86 bool retVal=0;
igbt6 5:d003a86ca20e 87
igbt6 5:d003a86ca20e 88 if(!read(0x03,&tempVal,1)) {
igbt6 5:d003a86ca20e 89 return false;
igbt6 3:41839eb9229f 90 }
igbt6 2:d12dffd027a8 91
igbt6 5:d003a86ca20e 92 tempVal|=res<<7;
igbt6 5:d003a86ca20e 93 if( !write(0x03,&tempVal,1)) {
igbt6 5:d003a86ca20e 94 retVal=false;
igbt6 5:d003a86ca20e 95 } else {
igbt6 5:d003a86ca20e 96 retVal=true;
igbt6 5:d003a86ca20e 97 mResolution=res;
igbt6 5:d003a86ca20e 98 }
igbt6 2:d12dffd027a8 99
igbt6 5:d003a86ca20e 100 return retVal;
igbt6 5:d003a86ca20e 101 }
igbt6 5:d003a86ca20e 102
igbt6 2:d12dffd027a8 103
igbt6 5:d003a86ca20e 104 int ADT7410::readIdNumber(void)
igbt6 5:d003a86ca20e 105 {
igbt6 5:d003a86ca20e 106
igbt6 5:d003a86ca20e 107 uint8_t data = 0;
igbt6 5:d003a86ca20e 108 uint8_t regAddress = 0x0B;
igbt6 5:d003a86ca20e 109 if(read(regAddress, &data, 1))
igbt6 5:d003a86ca20e 110 return data;
igbt6 5:d003a86ca20e 111 else
igbt6 5:d003a86ca20e 112 return -1;
igbt6 5:d003a86ca20e 113
igbt6 2:d12dffd027a8 114 }