SPI温度センサADT7310を使う(5) 16ビット ワンショット・モードで測定

今回はワンショットモードで温度を測定します。前述のように、ワンショット・モードでは測定後にスリープへ移行するため、消費電力を抑えることができます。

●動作概要

レジスタへのアクセス方法が異なるだけで、操作の考え方はI2C版のADT7410と同じです。

コンフィギュレーションレジスタ(Configuration register)へワンショットのコマンドを書き込み、240ms以上待ってから温度レジスタ(Temperature Value register)よりAD変換値を読み出し、摂氏温度に換算します。

●サンプルスケッチ

配線は前回のcontinuousモードのときと全く同じです。スケッチを次に示します。

#include <SPI.h>

int pinCS = 9;      // 温度センサCS D9

#define SPI_CS_ON   digitalWrite(pinCS, LOW)      // /cs = L
#define SPI_CS_OFF  digitalWrite(pinCS, HIGH)     // /cs = H

byte count = 0;

// 初期化
void setup(void) {
  byte reg;

  pinMode(pinCS, OUTPUT);   // spi cs
  SPI_CS_OFF;
  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE3); // 負論理クロック 立ち上がりエッジサンプリング

  Serial.begin(19200);

  // ADT7310 ソフトウェアリセット 32bit
  SPI_CS_ON;
  SPI.transfer(0xFF);
  SPI.transfer(0xFF);
  SPI.transfer(0xFF);
  SPI.transfer(0xFF);
  SPI_CS_OFF;

  delay(100);
}

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

  // モード設定 (スタートトリガ)
  SPI_CS_ON;
  SPI.transfer(0x08);       // コマンドバイト 0 0 001 000
  SPI.transfer(0xA0);       // コンフィギュレーションレジスタ 1 01 00000 16bit 1-shot
  SPI_CS_OFF;

  delay(240);               // 変換待ち

  // 温度読み出し
  SPI_CS_ON;
  SPI.transfer(0x50);       // コマンドバイト 0 1 010 000 (read tmp value)
  val = (uint16_t)SPI.transfer(0) << 8;   // AD変換値 上位
  val |= SPI.transfer(0);                 // AD変換値 下位
  SPI_CS_OFF;

  // 摂氏温度換算
  ival = (long int)val;
  if(val & 0x8000) {         // 符号判定
    // 負数
    ival = ival - 65536;
  }

  tmp = (float)ival / 128.0;

  Serial.print(count);
  Serial.print(": ");
  Serial.println(tmp, 2);     // xx.xx

  count++;
  delay(260);
}

AD変換値を読み出した後の摂氏温度への換算やシリアル出力などは前回の16ビット読み出しの処理と同じです。

なお、コマンドの設定は1つずつしかできないため、コマンド発行のたびに/CS信号のアクティブ、非アクティブを切り替えています。

周期を約500msにするため、変換時間(240ms)を差し引いた時間を68行目で待たせています。

continuousモードのときと違い、変換を待ってから読み出しているため、読み出しミスはありません。


次回はSDカードI/FをSPIバスに接続して、読み出した温度値をマイクロSDカードへ記録するアプリを作ります。

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