I2C温度センサADT7410を使う(5) 16bitで読み出し

今回は16ビット精度で温度を読み出してみます。

●16bitモード

と言ってもADT7410側の対応は、動作モード設定の際にコンフィギュレーション・レジスタ(Configuration register)のbit7を”1″にするだけです。

ADT7410_02

読み出した値は16ビットまるまるAD変換された温度値ですので、そのまま摂氏温度の換算に使えます。今回は負数の場合に65536を減算する関係で、読み出したAD変換値を一旦32bitのlong型にして減算したあとにfloat型に戻して余算しています。

サンプルスケッチを次に示しますが、全動作モードを組み込んで、if-defで切り替えるようにしてありますので、あらかじめ希望のdefine文のコメントを外して1づたけ有効化してから実行してください。

// ********** どれか一つを有効化(コメントアウトを外す) *******
//#define SLEEP
//#define ONESHOT
#define NORM
//#define SPS
// ***********************************************************

#include <Wire.h>

int I2CAdrs;

// 初期化
void setup(void) {
  I2CAdrs = 0x48;
  Serial.begin(19200);
  Wire.begin();       // マスタ初期化

#ifdef NORM
  // ノーマル
  Wire.beginTransmission(I2CAdrs);  // S.C発行,CB送信
  Wire.write(0x03);                 // Configuration register 選択
  Wire.write(0x00 | 0x80);          // SLEEP mode 設定 0110 0000
  Wire.endTransmission();           // ストップ・コンディション
#endif

#ifdef SPS
  // SPS
  Wire.beginTransmission(I2CAdrs);  // S.C発行,CB送信
  Wire.write(0x03);                 // Configuration register 選択
  Wire.write(0x40 | 0x80);          // one-shot mode 設定 0100 0000
  Wire.endTransmission();           // ストップ・コンディション
#endif

#ifdef SLEEP
  // スリープ
  Wire.beginTransmission(I2CAdrs);  // S.C発行,CB送信
  Wire.write(0x03);                 // Configuration register 選択
  Wire.write(0x60);                 // SLEEP mode 設定 0110 0000
  Wire.endTransmission();           // ストップ・コンディション
#endif
}

// メインループ
void loop(void) {
  uint16_t val;
  float tmp;
  long int ival;

#ifdef ONSHOT
  // ワンショット リトリガ再設定
  Wire.beginTransmission(I2CAdrs);  // S.C発行,CB送信
  Wire.write(0x03);                 // Configuration register 選択
  Wire.write(0x20 | 0x80);          // one-shot mode 設定
  Wire.endTransmission();           // ストップ・コンディション
  delay(240);
#endif

  Wire.requestFrom(I2CAdrs, 2);       // S.C発行,CB送信
  val = (uint16_t)Wire.read() << 8;   // データの読み出し(上位)
  val |= Wire.read();                 // データの読み出し(下位)

  ival = (long int)val;
  if(val & 0x8000) {         // 符号判定
    // 負数
    ival = ival - 65536;
  }

  tmp = (float)ival / 128.0;
  Serial.println(tmp, 2);     // xx.xx

  delay(1000);
}

表示される温度は、見かけ上は13ビットの時と変わりませんが、小数点以下の値の変化量が細かくなっているはずです。

次回はI2C制御のLCDをI2Cバスに並列に接続して、温度値をLCDへ表示させます。

(続く)

コメントは受け付けていません。