a library for TI's TMP102 temperature sensor.
Dependents: ou_OLED_TMP102 ou_mbed_tmp102
test_TMP102.cpp@0:dd209ce90298, 2018-06-12 (annotated)
- Committer:
- poushen
- Date:
- Tue Jun 12 03:37:27 2018 +0000
- Revision:
- 0:dd209ce90298
move tmp102 class to TMP102 library
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
poushen | 0:dd209ce90298 | 1 | #include "test_TMP102.h" |
poushen | 0:dd209ce90298 | 2 | |
poushen | 0:dd209ce90298 | 3 | test_TMP102::test_TMP102(PinName sda, PinName scl, char address) |
poushen | 0:dd209ce90298 | 4 | : i2c_p(new I2C(sda, scl)), i2c(*i2c_p),adr(address) |
poushen | 0:dd209ce90298 | 5 | { |
poushen | 0:dd209ce90298 | 6 | init(); |
poushen | 0:dd209ce90298 | 7 | } |
poushen | 0:dd209ce90298 | 8 | test_TMP102::test_TMP102(I2C &i2c_obj, char address) |
poushen | 0:dd209ce90298 | 9 | : i2c_p(NULL), i2c(i2c_obj), adr(address) |
poushen | 0:dd209ce90298 | 10 | { |
poushen | 0:dd209ce90298 | 11 | init(); |
poushen | 0:dd209ce90298 | 12 | } |
poushen | 0:dd209ce90298 | 13 | |
poushen | 0:dd209ce90298 | 14 | test_TMP102::~test_TMP102() |
poushen | 0:dd209ce90298 | 15 | { |
poushen | 0:dd209ce90298 | 16 | if(NULL!=i2c_p) |
poushen | 0:dd209ce90298 | 17 | delete i2c_p; |
poushen | 0:dd209ce90298 | 18 | } |
poushen | 0:dd209ce90298 | 19 | |
poushen | 0:dd209ce90298 | 20 | void test_TMP102::init(void) |
poushen | 0:dd209ce90298 | 21 | { |
poushen | 0:dd209ce90298 | 22 | } |
poushen | 0:dd209ce90298 | 23 | |
poushen | 0:dd209ce90298 | 24 | float test_TMP102::read(void) |
poushen | 0:dd209ce90298 | 25 | { |
poushen | 0:dd209ce90298 | 26 | char reg[2]= {0,0}; |
poushen | 0:dd209ce90298 | 27 | char pointer = TMP102_Temp; |
poushen | 0:dd209ce90298 | 28 | i2c.write(adr, &pointer, 1); //Pointer to the temperature register |
poushen | 0:dd209ce90298 | 29 | i2c.read(adr, reg, 2); // read two bytes data |
poushen | 0:dd209ce90298 | 30 | |
poushen | 0:dd209ce90298 | 31 | int16_t res; |
poushen | 0:dd209ce90298 | 32 | // Bit 0 of second byte will always be 0 in 12-bit readings and 1 in 13-bit |
poushen | 0:dd209ce90298 | 33 | if(reg[1]&0x01) // 13 bit mode |
poushen | 0:dd209ce90298 | 34 | { |
poushen | 0:dd209ce90298 | 35 | // combine bytes to create a signed int |
poushen | 0:dd209ce90298 | 36 | res = ((int8_t)reg[0] << 5) | ((uint8_t)reg[1] >> 3); |
poushen | 0:dd209ce90298 | 37 | // Temperature data can be + or -, if it should be negative, |
poushen | 0:dd209ce90298 | 38 | // convert 13 bit to 16 bit and use the 2s compliment. |
poushen | 0:dd209ce90298 | 39 | if (res > 0xFFF) res |= 0xE000; |
poushen | 0:dd209ce90298 | 40 | } else // 12 bit mode |
poushen | 0:dd209ce90298 | 41 | { |
poushen | 0:dd209ce90298 | 42 | res = ((int8_t)reg[0] << 4) | ((uint8_t)reg[1] >> 4); |
poushen | 0:dd209ce90298 | 43 | if (res > 0x7FF) res |= 0xF000; |
poushen | 0:dd209ce90298 | 44 | } |
poushen | 0:dd209ce90298 | 45 | |
poushen | 0:dd209ce90298 | 46 | float temp = (float)(res * 0.0625); |
poushen | 0:dd209ce90298 | 47 | return temp; |
poushen | 0:dd209ce90298 | 48 | } |
poushen | 0:dd209ce90298 | 49 | |
poushen | 0:dd209ce90298 | 50 | float test_TMP102::readTempC(void) |
poushen | 0:dd209ce90298 | 51 | { |
poushen | 0:dd209ce90298 | 52 | return read(); |
poushen | 0:dd209ce90298 | 53 | } |
poushen | 0:dd209ce90298 | 54 | |
poushen | 0:dd209ce90298 | 55 | float test_TMP102::readTempF(void) |
poushen | 0:dd209ce90298 | 56 | { |
poushen | 0:dd209ce90298 | 57 | return (float)((double)readTempC()*9.0/5.0 + 32.0); |
poushen | 0:dd209ce90298 | 58 | } |
poushen | 0:dd209ce90298 | 59 | |
poushen | 0:dd209ce90298 | 60 | void test_TMP102::setConversionRate(char rate) |
poushen | 0:dd209ce90298 | 61 | { |
poushen | 0:dd209ce90298 | 62 | char reg[2] = {0, 0}; |
poushen | 0:dd209ce90298 | 63 | char pointer = TMP102_Conf; |
poushen | 0:dd209ce90298 | 64 | rate = rate & 0x03; // make sure rate is not set higher than 3. |
poushen | 0:dd209ce90298 | 65 | |
poushen | 0:dd209ce90298 | 66 | i2c.write(adr, &pointer, 1); //Pointer to the conf register |
poushen | 0:dd209ce90298 | 67 | i2c.read(adr, reg, 2); // read two bytes data |
poushen | 0:dd209ce90298 | 68 | |
poushen | 0:dd209ce90298 | 69 | reg[1] &= 0x3F; // Clear CR0/1 (bit 6 and 7 of second byte) |
poushen | 0:dd209ce90298 | 70 | reg[1] |= rate << 6; // Shift in new conversion rate |
poushen | 0:dd209ce90298 | 71 | |
poushen | 0:dd209ce90298 | 72 | char data[3]; |
poushen | 0:dd209ce90298 | 73 | data[0] = pointer; |
poushen | 0:dd209ce90298 | 74 | data[1] = reg[0]; |
poushen | 0:dd209ce90298 | 75 | data[2] = reg[1]; |
poushen | 0:dd209ce90298 | 76 | i2c.write(adr, data, 3); |
poushen | 0:dd209ce90298 | 77 | } |
poushen | 0:dd209ce90298 | 78 | |
poushen | 0:dd209ce90298 | 79 | void test_TMP102::setExtendedMode(bool mode) |
poushen | 0:dd209ce90298 | 80 | { |
poushen | 0:dd209ce90298 | 81 | char reg[2] = {0, 0}; |
poushen | 0:dd209ce90298 | 82 | char pointer = TMP102_Conf; |
poushen | 0:dd209ce90298 | 83 | |
poushen | 0:dd209ce90298 | 84 | i2c.write(adr, &pointer, 1); //Pointer to the conf register |
poushen | 0:dd209ce90298 | 85 | i2c.read(adr, reg, 2); // read two bytes data |
poushen | 0:dd209ce90298 | 86 | |
poushen | 0:dd209ce90298 | 87 | reg[1] &= 0xEF; // Clear EM (bit 4 of second byte) |
poushen | 0:dd209ce90298 | 88 | reg[1] |= mode<<4; // Shift in new exentended mode bit |
poushen | 0:dd209ce90298 | 89 | |
poushen | 0:dd209ce90298 | 90 | char data[3]; |
poushen | 0:dd209ce90298 | 91 | data[0] = pointer; |
poushen | 0:dd209ce90298 | 92 | data[1] = reg[0]; |
poushen | 0:dd209ce90298 | 93 | data[2] = reg[1]; |
poushen | 0:dd209ce90298 | 94 | i2c.write(adr, data, 3); |
poushen | 0:dd209ce90298 | 95 | } |
poushen | 0:dd209ce90298 | 96 | |
poushen | 0:dd209ce90298 | 97 | test_TMP102::operator float(void) |
poushen | 0:dd209ce90298 | 98 | { |
poushen | 0:dd209ce90298 | 99 | return (read()); |
poushen | 0:dd209ce90298 | 100 | } |
poushen | 0:dd209ce90298 | 101 | |
poushen | 0:dd209ce90298 | 102 | void test_TMP102::sleep(void) |
poushen | 0:dd209ce90298 | 103 | { |
poushen | 0:dd209ce90298 | 104 | char reg; |
poushen | 0:dd209ce90298 | 105 | char pointer = TMP102_Conf; |
poushen | 0:dd209ce90298 | 106 | i2c.write(adr, &pointer, 1); //Pointer to the conf register |
poushen | 0:dd209ce90298 | 107 | i2c.read(adr, ®, 1); // read one byte data |
poushen | 0:dd209ce90298 | 108 | |
poushen | 0:dd209ce90298 | 109 | reg |= 0x01; // set SD (bit 0 of first byte) |
poushen | 0:dd209ce90298 | 110 | |
poushen | 0:dd209ce90298 | 111 | char data[2]; |
poushen | 0:dd209ce90298 | 112 | data[0] = pointer; |
poushen | 0:dd209ce90298 | 113 | data[1] = reg; |
poushen | 0:dd209ce90298 | 114 | i2c.write(adr, data, 2); |
poushen | 0:dd209ce90298 | 115 | } |
poushen | 0:dd209ce90298 | 116 | |
poushen | 0:dd209ce90298 | 117 | void test_TMP102::wakeup(void) |
poushen | 0:dd209ce90298 | 118 | { |
poushen | 0:dd209ce90298 | 119 | char reg; |
poushen | 0:dd209ce90298 | 120 | char pointer = TMP102_Conf; |
poushen | 0:dd209ce90298 | 121 | i2c.write(adr, &pointer, 1); //Pointer to the conf register |
poushen | 0:dd209ce90298 | 122 | i2c.read(adr, ®, 1); // read one byte data |
poushen | 0:dd209ce90298 | 123 | |
poushen | 0:dd209ce90298 | 124 | reg &= 0xFE; // Clear SD (bit 0 of first byte) |
poushen | 0:dd209ce90298 | 125 | |
poushen | 0:dd209ce90298 | 126 | char data[2]; |
poushen | 0:dd209ce90298 | 127 | data[0] = pointer; |
poushen | 0:dd209ce90298 | 128 | data[1] = reg; |
poushen | 0:dd209ce90298 | 129 | i2c.write(adr, data, 2); |
poushen | 0:dd209ce90298 | 130 | } |
poushen | 0:dd209ce90298 | 131 | |
poushen | 0:dd209ce90298 | 132 | void test_TMP102::oneShot(void) |
poushen | 0:dd209ce90298 | 133 | { |
poushen | 0:dd209ce90298 | 134 | char reg; |
poushen | 0:dd209ce90298 | 135 | char pointer = TMP102_Conf; |
poushen | 0:dd209ce90298 | 136 | i2c.write(adr, &pointer, 1); //Pointer to the conf register |
poushen | 0:dd209ce90298 | 137 | i2c.read(adr, ®, 1); // read one byte data |
poushen | 0:dd209ce90298 | 138 | |
poushen | 0:dd209ce90298 | 139 | reg |= 0x80; // Set OS (bit 7 of first byte) |
poushen | 0:dd209ce90298 | 140 | |
poushen | 0:dd209ce90298 | 141 | char data[2]; |
poushen | 0:dd209ce90298 | 142 | data[0] = pointer; |
poushen | 0:dd209ce90298 | 143 | data[1] = reg; |
poushen | 0:dd209ce90298 | 144 | i2c.write(adr, data, 2); |
poushen | 0:dd209ce90298 | 145 | |
poushen | 0:dd209ce90298 | 146 | do { |
poushen | 0:dd209ce90298 | 147 | wait(0.026); |
poushen | 0:dd209ce90298 | 148 | i2c.read(adr, ®, 1); |
poushen | 0:dd209ce90298 | 149 | reg &= 0x80; |
poushen | 0:dd209ce90298 | 150 | } while (reg == 0); |
poushen | 0:dd209ce90298 | 151 | } |