I2C温度センサADT7410を使う(4)

今回は、ワンショットモードや1 SPSモードを試してみます。

●ワンショットモード(ONE-SHOT MODE)

一発だけ温度測定、変換してすぐにスリープになるモードです。再読み出しには再びワンショットモードの設定動作(リトリガ)が必要です。次にサンプルスケッチを示します。リトリガを掛けたあとの、読み出し、シリアル送信の部分は前回のノーマルモードの処理と同じです。

#include <Wire.h>

int I2CAdrs;

// 初期化
void setup(void) {
  I2CAdrs = 0x48;

  Serial.begin(19200);
  Wire.begin();       // マスタ初期化
}

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

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

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

  val >>= 3;

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

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

  delay(1000);
}

19行目からADT7410の動作モードをワンショット・モードに設定しています。0×03がレジスタアドレス(configuration register)、0×20(b6,b7)がモードです。初回のモード設定ではノーマル・モードからワンショット・モードに切り替わり、第1回目の測定、変換が始まります。単純に240ms待って、26行目より温度値を読み出し、シリアル送信します。その後1秒待って再び20行目でリトリガを掛けて測定、変換、シリアル送信を繰り返します。

測定のときだけウェイクアップするため、ADT7410の消費電力はかなり少なくなります。

なお、トリガを掛けないで温度値を読み出すと、最後に測定、変換した温度値がそのまま返ります。

●1 SPSモード

1秒周期で読み出すモードです。サンプルスケッチを次に示します。

#include <Wire.h>

int I2CAdrs;

// 初期化
void setup(void) {
  I2CAdrs = 0x48;

  Serial.begin(19200);
  Wire.begin();       // マスタ初期化

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

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

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

  val >>= 3;

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

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

  delay(1000);
}

13行目でSPSモードに設定して約1秒周期で読み出しているだけです。本当は変換完了のタイミングを割り込みやステータスレジスタの内容で調べて値をリードすればよりよいのですが、ここでは単純に約1秒周期で読み出しています。

●消費電力

どれぐらい消費電力が変わるかディジタルテスタで測定してみました。平均値がとれないので目安です。電源電圧はCQカチャduinoのUSBバスパワー電源を利用しているため、4.5V程度です。

  • スリープ状態時 0.005mA
  • ノーマルモード時 0.25mA
  • ワンショットモード時 0.005mA+アルファ
  • SPSモード時 0.1mA程度

ワンショットモードやSPSモードは測定時に電力が変化するため、ディジタルテスタでは変化していることぐらいしか捕らえられません、こんなもんかなぁ、という程度のおおよその目安です。
時計などに組み込む場合は時刻の更新タイミングに合わせてでワンショットモードで測定するというのがよさそうですね。

(続く)

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