超精密温度計の製作③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); }