library for ADT7410 temperature sensor first version
adt7410.cpp@5:d003a86ca20e, 2014-12-21 (annotated)
- 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?
User | Revision | Line number | New 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*)®Address,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 | } |