ADT7410 温度測定器 (for Arduino)

今回は、秋月電子さんで売っている、”ADT7410使用 高精度・高分解能 I2C・16Bit 温度センサモジュール”の説明です。

秋月電子さんのHPに、マニュアルPDFが有ります。基本的操作はこれで十分なのですが詳細をHPにある、使用半導体資料 を元に調べて見ました。

レジスタの概要

ADT7410の各レジスタと電源投入時の値は下記の様になっています。

  • 0x00 上位温度レジスタ
    • 最上位ビットが負号をその他は温度データ
  • 0x01 下位温度レジスタ
    • データ長を13ビットとした場合
      • ビット0: TLOW より測定値が小さい場合1。
      • ビット1: THIGH より測定値が大きい場合1。
      • ビット2: TCRIT より測定値が大きい場合1。
  • 0x02 ステータスレジスタ
    • ビット0から3は未使用
    • ビット4:TLOWビット。 設定最低温度より測定値が低い場合1。
    • ビット5:THIGHビット。設定最高温度より測定値が高い場合1。
    • ビット6:TCRITビット。設定危険温度より測定温度が高い場合1。
    • ビット7:RDYビット。測定値が温度ジスタに保管されたら0。
  • 0x03 コンフィグレーションレジスタ
    • ビット0から4 
      • 割り込みモード等の設定に使用する様ですが、秋月のモジュールはこれ関係の端子が出ていないので使えません。
    • ビット5,6 測定モードの設定
      • 00:連続モード。デフォルト。測定が終わると直ぐ次の準備
      • 01:ワンショット測定。
      • 10:SPSモード。繰り返し測定するモード。
      • 11:シャットダウン。通信以外の電源オフ
  • 0x04,0x05  THIGH SETPOINT レジスタ
    • ユーザーが指定する測定最高温度。
    • この温度より測定値が高くなると、THIGHビットが1。
  • 0x06,0x07 TLOW SETPOINT レジスタ
    • ユーザーが指定する測定最低温度。
    • この温度より測定値が低くなると、TLOWビットが1。
  • 0x08,0x09 TCRIT SETPOINT レジスタ
    • ユーザーが指定する設定危険温度
    • この温度より測定値が高くなると、TCRIT ビットが1。
  • 0x0a ヒステリシス調整レジスタ
  • 0x0b IDレジスタ
  • 0x2f ソフトウエアリセット

この中でよく使用するのは、

  • コンフィグレーションレジスタ
    • ビット6,5: 測定モードの設定
    • ビット7  : 分解能の設定
  • 温度レジスタ ー> 測定データ読み取り

くらいです。ただ気になるのが、”TLOW SETPOINT レジスタ”。設定値が10℃になっています。つまり測定が10℃より低い場合、TLOWビットが1になります。このモジュールの場合、このビットを使用していないので、1になって困る事は無いと思いますが、設定値を変えたい所です。

ADT7410へのアクセス

説明書によると読み書きは以下の手順で行う様です

  • 書き込み
    • I2Cのアドレスを書き込みモードで送る。
    • アクセスしたいレジスタ番号を送ってアクセスポインターをセットする。
    • データを送る。
    • アクセスポインターは自動でインクリメントされる為、データが連続する場合続けて送信可能。
    • 書き込み終了後、Stopコンディションを送って終了
  • 読み込み
    • I2Cのアドレスを書き込みモードで送る。
    • アクセスしたいレジスタ番号を送ってアクセスポインターをセットする。
    • 2Cのアドレスを書き込みモードで送る。
    • データを読み込む
    • アクセスポインターは自動でインクリメントされる為、データが連続する場合続けて読み込み可能
    • 読み込み終了後、Stopコンディションを送って終了

例えば、ADT7410の、”ステータスレジスタ”を読み込みたい場合。

  1. I2Cのアドレス(読み込み)+ ”ステータスレジスタ”の番号、”0x02”を書き込む。
  2. アドレスポインターが2に設定される
  3. 続いてADT7410からデータを読み込む。

また、測定データを読み込む場合、

  1. I2Cのアドレス(読み込み)+ ”温度レジスタ上位レジスタ”の番号、”0x00”を書き込む。
  2. アドレスポインターが0に設定される
  3. ADT7410から、1バイト読み込む。(測定値の上位バイト)
  4. アドレスポインターが自動でインクリメントされ1になる。これによりポインターは”温度レジスタ下位レジスタ”をさしている。
  5. ADT7410から、1バイト読み込む。(測定値の下位バイト)

Webでよく下記の様なスケッチで値を読み込んでいるのを見ます。


   Wire.begin();
   Wire.requestFrom(addr, 2);
   data = Wire.read() << 8;  
   data  |= Wire.read();                 

温度の読み取りですが、アドレスポインターの設定を行っていません。ADT7410は、電源投入で

  • 測定長は13ビット。
  • 測定モードは連続モード。
  • アドレスポインターは0。

となっているます。アドレスポインターが既に読みたいレジスターに有る場合、ポインターを設定すること無く、レジスタの値を読む事が出来る様です。

ちょっと疑問

上記のスケッチでWire.requestFrom(Addr, 2);で2バイト読み込んだ後、もう一度2バイト読み込んだら読み込んだ値はどうなるのか。予想は、

  1. 最初の1回目は、レジスタ、”0x00,0x01”。
  2. 次は、レジスタ、”0x02,0x03”

と思います。下記のスケッチで確認しました。


    Wire.requestFrom(Addr, 2);
    Serial.println("1st=" + String(Wire.read(),HEX));
    Serial.println("2nd=" + String(Wire.read(),HEX));

    Wire.requestFrom(Addr, 2);
    Serial.println("3rd=" + String(Wire.read(),HEX));
    Serial.println("4th=" + String(Wire.read(),HEX));

結果は、2回とも、レジスタ、”0x00,0x01”の値を返して来ました。Wire.requestFrom(Addr, 2);は処理に最後にStopコンディションを送信します。多分Stopコンディションが送信されるとアドレスポインターレジスタは0になると思われます。

確認の為に

このスケッチは、

  1. アドレスを0x04に設定して4バイト読み込む。
  2. 続けて、アドレスを指定しないで4バイト読み込む。

    a=0x04;
    Wire.beginTransmission(ADT);
    Wire.write(a);
    Wire.endTransmission(false);

    Wire.requestFrom(ADT, 4);
    Serial.println(String(a,HEX) + "=" + String(Wire.read(),HEX));
    Serial.println(String(a+1,HEX) + "=" + String(Wire.read(),HEX));
    Serial.println(String(a+2,HEX) + "=" + String(Wire.read(),HEX));
    Serial.println(String(a+3,HEX) + "=" + String(Wire.read(),HEX));

    Wire.requestFrom(ADT, 4);
    Serial.println(String(a,HEX) + "=" + String(Wire.read(),HEX));
    Serial.println(String(a+1,HEX) + "=" + String(Wire.read(),HEX));
    Serial.println(String(a+2,HEX) + "=" + String(Wire.read(),HEX));
    Serial.println(String(a+3,HEX) + "=" + String(Wire.read(),HEX));

結果は、0x20,0x00,0x05,0x00 / 0x0b,0x5b,0x80,0x00 となりました。最初の4つは予想通り。次の4つはアドレス0x00からの4つです。つまり、Wire.requestFrom()でデータを読み込む時、1回の処理が終わるとポインターは0x00に戻るが正しい様です。

最後に今回使用した回路と、温度を読み出すプログラムは下記の通りです。

ADT7410.ino

#include <Wire.h>
#define ADR 0x48

void setup() {
  Wire.begin();
  Serial.begin(115200);
}

void loop() {
 float tp;
 short int data;

  Wire.beginTransmission(ADR);
  Wire.write(0);
  Wire.endTransmission(false);
  
   Wire.requestFrom(ADR,2);
   data = Wire.read() << 8;  
   data |= Wire.read();      

    data >>= 3;                          
    tp = (float)data  / 16.0;          
   Serial.println("T=" + String(tp) + "'C ");

  delay(1000);               
  • 2行:define ADR 0x48
    • 今回使用したモジュールのI2Cアドレス
  • 13から15行:
    • ここで、I2Cアドレスとアドレスポインターの値を送信しています。
  • 17行:Wire.requestFrom(ADR,2);
    • 2バイト読み込む事をデバイスに送信
  • 18,19行:温度データの読み込み
  • 21,22行:温度データの換算
  • 23行:データの表示。

ちなみに温度データは13から15行のコードが無くても読み込む事が可能です。

追加

PIC版はここに有りますー>ADT7410 温度測定モジュール (for PIC)