a library for TI's TMP102 temperature sensor.

Dependents:   ou_OLED_TMP102 ou_mbed_tmp102

Committer:
poushen
Date:
Sun Jun 17 07:09:46 2018 +0000
Revision:
1:d4774de8a3be
Parent:
0:dd209ce90298
add some description

Who changed what in which revision?

UserRevisionLine numberNew 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, &reg, 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, &reg, 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, &reg, 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, &reg, 1);
poushen 0:dd209ce90298 149 reg &= 0x80;
poushen 0:dd209ce90298 150 } while (reg == 0);
poushen 0:dd209ce90298 151 }