超精密温度計の製作③TMP117の読み出しスケッチ
前回は、TMP117のライブラリを利用して温度を測定しました。ここでは、デバイスのレジスタを直接触って温度を読み出します。
●TMP117のおもなスペック
- 電源電圧 1.8~5.5V
- 消費電流 135µA(変換時のみ)
- 測定温度範囲 -40~125℃。0.007815℃ の分解能(16 ビット)で±0.1℃ (+20~+50℃、8回平均、1Hz繰り返し)の確度
- インターフェース I2C(1~400kHz)
- データ長 2の補数形式の16ビット
●主なレジスタ
温度データは読み出し専用です。コンフィギュレーションのデフォルト0x0220は、測定を8回して平均を求め、1Hzサイクルの変換の設定です。
| ポインタ・ レジスタ |
機能 | 初期値 |
|---|---|---|
| 0x00 | 温度データ | 0x8000 |
| 0x01 | コンフィギュレーション | 0x0220 |
●スケッチ
setup()内でコンフィギュレーション・レジスタを設定します。デフォルトでもよい場合は10~14行をコメントアウトします。(byte)0x00のキャストは、過去、0の書き込みを失敗したことがあるためです。
設定内容によって、読み出すデータがどのように変わるかを確認するために、小数点第4位まで表示しました。
read_tempdata()関数の最後は、最上位ビットを見て、符号の判断をしています。'1'だとマイナスにします。
#include <Wire.h>
#define TMP117address 0x48
#define TemperatureRegiste 0x00
#define ConfigurationRegister 0x01
void setup() {
Wire.begin();
Serial.begin(9600);
Wire.setClock(400000);
Wire.beginTransmission(TMP117address);
Wire.write((byte)ConfigurationRegister);
Wire.write((byte)0x00); // high
Wire.write(0x60); // low
Wire.endTransmission();
}
int read_tempdata() {
Wire.beginTransmission(TMP117address);
Wire.write((byte)TemperatureRegiste);
Wire.endTransmission();
Wire.requestFrom(TMP117address, 2);
//wait for response
while(Wire.available() == 0);
int T = Wire.read();
T = T << 8 | Wire.read() ;
return ( -(T & 0b1000000000000000) | (T & 0b0111111111111111) );
}
void loop() {
double Temp = read_tempdata() * 7.8125 /1000.0;
Serial.println(Temp,4);
delay(1000);
}