#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include <Wire.h>
#define TMP102_h
#define TEMPERATURE_REGISTER 0x00
#define CONFIG_REGISTER 0x01
#define T_LOW_REGISTER 0x02
#define T_HIGH_REGISTER 0x03
const int ALERT_PIN = A3;
class TMP102
{
public:
TMP102(byte address);
void begin(void);
float readTempC(void);
float readTempF(void);
void sleep(void);
void wakeup(void);
bool alert(void);
void setLowTempC(float temperature);
void setHighTempC(float temperature);
void setLowTempF(float temperature);
void setHighTempF(float temperature);
float readLowTempC(void);
float readHighTempC(void);
float readLowTempF(void);
float readHighTempF(void);
void setConversionRate(byte rate);
void setExtendedMode(bool mode);
void setAlertPolarity(bool polarity);
void setFault(byte faultSetting);
void setAlertMode(bool mode);
private:
int _address;
void openPointerRegister(byte pointerReg);
byte readRegister(bool registerNumber);
};
TMP102 sensor0(0x48);
TMP102::TMP102(uint8_t address)
{
_address = address;
}
void TMP102::begin(void)
{
Wire.begin();
}
void TMP102::openPointerRegister(uint8_t pointerReg)
{
Wire.beginTransmission(_address);
Wire.write(pointerReg);
Wire.endTransmission();
}
uint8_t TMP102::readRegister(bool registerNumber){
uint8_t registerByte[2];
Wire.requestFrom(_address, 2);
Wire.endTransmission();
registerByte[0] = (Wire.read());
registerByte[1] = (Wire.read());
return registerByte[registerNumber];
}
float TMP102::readTempC(void)
{
uint8_t registerByte[2];
int16_t digitalTemp;
openPointerRegister(TEMPERATURE_REGISTER);
registerByte[0] = readRegister(0);
registerByte[1] = readRegister(1);
if(registerByte[1]&0x01)
{
digitalTemp = ((registerByte[0]) << 5) | (registerByte[1] >> 3);
if(digitalTemp > 0xFFF)
{
digitalTemp |= 0xE000;
}
}
else // 12 bit mode
{
digitalTemp = ((registerByte[0]) << 4) | (registerByte[1] >> 4);
if(digitalTemp > 0x7FF)
{
digitalTemp |= 0xF000;
}
}
return digitalTemp*0.0625;
}
float TMP102::readTempF(void)
{
return readTempC()*9.0/5.0 + 32.0;
}
void TMP102::setConversionRate(uint8_t rate)
{
uint8_t registerByte[2];
rate = rate&0x03;
openPointerRegister(CONFIG_REGISTER);
registerByte[0] = readRegister(0);
registerByte[1] = readRegister(1);
registerByte[1] &= 0x3F;
registerByte[1] |= rate<<6;
Wire.beginTransmission(_address);
Wire.write(CONFIG_REGISTER);
Wire.write(registerByte[0]);
Wire.write(registerByte[1]);
Wire.endTransmission();
}
void TMP102::setExtendedMode(bool mode)
{
uint8_t registerByte[2];
openPointerRegister(CONFIG_REGISTER);
registerByte[0] = readRegister(0);
registerByte[1] = readRegister(1);
registerByte[1] &= 0xEF;
registerByte[1] |= mode<<4;
Wire.beginTransmission(_address);
Wire.write(CONFIG_REGISTER);
Wire.write(registerByte[0]);
Wire.write(registerByte[1]);
Wire.endTransmission();
}
void TMP102::sleep(void)
{
uint8_t registerByte;
openPointerRegister(CONFIG_REGISTER);
registerByte = readRegister(0);
registerByte |= 0x01;
Wire.beginTransmission(_address);
Wire.write(CONFIG_REGISTER);
Wire.write(registerByte);
Wire.endTransmission();
}
void TMP102::wakeup(void)
{
uint8_t registerByte;
openPointerRegister(CONFIG_REGISTER);
registerByte = readRegister(0);
registerByte &= 0xFE;
Wire.beginTransmission(_address);
Wire.write(CONFIG_REGISTER);
Wire.write(registerByte);
Wire.endTransmission();
}
void TMP102::setAlertPolarity(bool polarity)
{
uint8_t registerByte;
openPointerRegister(CONFIG_REGISTER);
registerByte = readRegister(0);
registerByte &= 0xFB;
registerByte |= polarity<<2;
Wire.beginTransmission(_address);
Wire.write(CONFIG_REGISTER);
Wire.write(registerByte);
Wire.endTransmission();
}
bool TMP102::alert(void)
{
uint8_t registerByte;
openPointerRegister(CONFIG_REGISTER);
registerByte = readRegister(1);
registerByte &= 0x20;
return registerByte>>5;
}
void TMP102::setLowTempC(float temperature)
{
uint8_t registerByte[2];
bool extendedMode;
if(temperature > 150.0f)
{
temperature = 150.0f;
}
if(temperature < -55.0)
{
temperature = -55.0f;
}
//Check if temperature should be 12 or 13 bits
openPointerRegister(CONFIG_REGISTER);
// Read current configuration register value
registerByte[0] = readRegister(0);
registerByte[1] = readRegister(1);
extendedMode = (registerByte[1]&0x10)>>4;
temperature = temperature/0.0625;
if(extendedMode)
{
registerByte[0] = int(temperature)>>5;
registerByte[1] = (int(temperature)<<3);
}
else // 12-bit mode
{
registerByte[0] = int(temperature)>>4;
registerByte[1] = int(temperature)<<4;
}
Wire.beginTransmission(_address);
Wire.write(T_LOW_REGISTER);
Wire.write(registerByte[0]);
Wire.write(registerByte[1]);
Wire.endTransmission();
}
void TMP102::setHighTempC(float temperature)
{
uint8_t registerByte[2];
bool extendedMode;
if(temperature > 150.0f)
{
temperature = 150.0f;
}
if(temperature < -55.0)
{
temperature = -55.0f;
}
openPointerRegister(CONFIG_REGISTER);
registerByte[0] = readRegister(0);
registerByte[1] = readRegister(1);
extendedMode = (registerByte[1]&0x10)>>4;
temperature = temperature/0.0625;
if(extendedMode)
{
registerByte[0] = int(temperature)>>5;
registerByte[1] = (int(temperature)<<3);
}
else // 12-bit mode
{
registerByte[0] = int(temperature)>>4;
registerByte[1] = int(temperature)<<4;
}
// Write to T_HIGH Register
Wire.beginTransmission(_address);
Wire.write(T_HIGH_REGISTER);
Wire.write(registerByte[0]);
Wire.write(registerByte[1]);
Wire.endTransmission();
}
void TMP102::setLowTempF(float temperature)
{
temperature = (temperature - 32)*5/9;
setLowTempC(temperature);
}
void TMP102::setHighTempF(float temperature)
{
temperature = (temperature - 32)*5/9;
setHighTempC(temperature);
}
float TMP102::readLowTempC(void)
{
uint8_t registerByte[2];
bool extendedMode;
int16_t digitalTemp;
float temperature;
openPointerRegister(CONFIG_REGISTER);
registerByte[0] = readRegister(0);
registerByte[1] = readRegister(1);
extendedMode = (registerByte[1]&0x10)>>4;
openPointerRegister(T_LOW_REGISTER);
registerByte[0] = readRegister(0);
registerByte[1] = readRegister(1);
if(extendedMode) // 13 bit mode
{
digitalTemp = ((registerByte[0]) << 5) | (registerByte[1] >> 3);
if(digitalTemp > 0xFFF)
{
digitalTemp |= 0xE000;
}
}
else // 12 bit mode
{
digitalTemp = ((registerByte[0]) << 4) | (registerByte[1] >> 4);
if(digitalTemp > 0x7FF)
{
digitalTemp |= 0xF000;
}
}
return digitalTemp*0.0625;
}
float TMP102::readHighTempC(void)
{
uint8_t registerByte[2];
bool extendedMode;
int16_t digitalTemp;
float temperature;
openPointerRegister(CONFIG_REGISTER);
registerByte[0] = readRegister(0);
registerByte[1] = readRegister(1);
extendedMode = (registerByte[1]&0x10)>>4;
openPointerRegister(T_HIGH_REGISTER);
registerByte[0] = readRegister(0);
registerByte[1] = readRegister(1);
if(extendedMode)
{
digitalTemp = ((registerByte[0]) << 5) | (registerByte[1] >> 3);
if(digitalTemp > 0xFFF)
{
digitalTemp |= 0xE000;
}
}
else
{
digitalTemp = ((registerByte[0]) << 4) | (registerByte[1] >> 4);
if(digitalTemp > 0x7FF)
{
digitalTemp |= 0xF000;
}
}
return digitalTemp*0.0625;
}
float TMP102::readLowTempF(void)
{
return readLowTempC()*9.0/5.0 + 32.0;
}
float TMP102::readHighTempF(void)
{
return readHighTempC()*9.0/5.0 + 32.0;
}
void TMP102::setFault(uint8_t faultSetting)
{
uint8_t registerByte;
faultSetting = faultSetting&3;
openPointerRegister(CONFIG_REGISTER);
registerByte = readRegister(0);
registerByte &= 0xE7;
registerByte |= faultSetting<<3;
Wire.beginTransmission(_address);
Wire.write(CONFIG_REGISTER);
Wire.write(registerByte);
Wire.endTransmission();
}
void TMP102::setAlertMode(bool mode)
{
uint8_t registerByte;
openPointerRegister(CONFIG_REGISTER);
registerByte = readRegister(0);
registerByte &= 0xFD;
registerByte |= mode<<1;
Wire.beginTransmission(_address);
Wire.write(CONFIG_REGISTER);
Wire.write(registerByte);
Wire.endTransmission();
}
void setup() {
Serial.begin(9600);
pinMode(ALERT_PIN,INPUT);
sensor0.begin();
sensor0.setFault(0);
sensor0.setAlertPolarity(1);
sensor0.setAlertMode(0);
sensor0.setConversionRate(2);
sensor0.setExtendedMode(0);
sensor0.setHighTempC(31.0);
sensor0.setLowTempC(20.0);
}
void loop()
{
float temperature;
boolean alertPinState, alertRegisterState;
sensor0.wakeup();
temperature = sensor0.readTempC();
alertPinState = digitalRead(ALERT_PIN);
alertRegisterState = sensor0.alert();
sensor0.sleep();
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print("\tAlert Pin: ");
Serial.print(alertPinState);
Serial.print("\tAlert Register: ");
Serial.println(alertRegisterState);
delay(1000); // Wait 1000ms
}