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

前へ

超精密温度計の製作②マイコンはESP32

次へ

超精密温度計の製作④BLEペリフェラルに