TMP102 디지털 온도센서
       
 
이 매뉴얼은 주식회사 제이케이이엠씨(JK EMC) 에 의해서 번역, 수정, 작성 되었고 소유권 또한
주 식회사 제이케이이엠씨(JK EMC)의 것입니다. 소유권자의 허가를 받지 않고 무단으로 수정, 삭제하거나 배포 할 수 없습니다.

 

 

TMP102 Digital Temperature Sensor 3.3/5V 공용 ( 디지털 온도 센서 모듈 )


 
 




  1. TMP102 센서 소개
2. 아 두이노와 같이 사용하기
    2.1 센서 회로도및 외곽 치수
    2.2 아두이노 UNO R3 배선도
    2.3 아두이노 스케치 코드
    2.4 아두이노 스케치 코드 실행 결과

 
 TMP102 센서 소개

TMP102 온도 센서는 정확한 온도를 측정할 수 있는 센서 입니다.
많은 셋업이 필요하지않아 여러 곳에 쉽게 쓰일 수 있는 간단한 센서입니다.
3.3V의 전압을 사용하는 센서지만 레벨 쉬프트를 장착해 5V에서도 사용할 수 있는 센서입니다.
이센서는 오차율 섭씨0.5도까지 완벽하게 측정이 가능합니다.
I2C통신으로 4개의 TMP102센서까지 지원이 가능합니다.
또한 12비트를 사용하며 섭씨0.0625도의 해상도를 보여줍니다.




Characteristic Value Unit
Supply Voltage 3.6 V
Operating Temperature -48~65
Storage Temperature -51~65
Junction Temperature 65




 
TMP102 회로도및 외곽치수

TMP102센서 회로도

     - TMP102 PDF 회로도 다운로드
     - TMP102 데이터시트 다운로드(http://www.jkelec.co.kr)
     - TMP102 DXF 캐드 파일 다운로드
TMP102


TMP102 센서 외곽(mm단위) 치수

      TMP102

 
 TMP102 아두이노 UNO R3 배선도

TMP102<---> 아두이노
VCC <---> 5V, 3.3V
GND <---> GND
SDA <---> A4
SCL <---> A5
ALERT <---> A3


- Fritzing 파일 다운로드


TMP102

 


 
TMP102 아두이노 스케치 코드

TMP102센서를 이용하여 온도를 측정하여 시리얼 데이터로 출력하는 예제 이다.

아두이노 스케치 코드
     - TMP102 온도 데이터 표시 스캐치 파일 다운로드


#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
}



 
TMP102 아두이노 스케치 코드 실행 결과

시리얼모니터

TMP102