今回は、秋月電子さんで売っている、”ADT7410使用 高精度・高分解能 I2C・16Bit 温度センサモジュール”の説明です。
秋月電子さんのHPに、マニュアルPDFが有ります。これで殆どの事は説明されています。基本的は操作はこれで良いのですがただ、この資料だけでは分からない点があり、同じく秋月さんのHPにある、使用半導体資料 を元に調べて見ました。
レジスタの概要
ADT7410の各レジスタと電源投入時の値は下記の様になっています。

- 0x00 温度レジスタ上位レジスタ
- 最上位ビットが負号をその他は温度データ
- 0x01 温度レジスタ下位レジスタ
- データ長を13ビットとした場合
- ビット0: TLOW より測定値が小さい場合1。
- ビット1: THIGH より測定値が大きい場合1。
- ビット2: TCRIT より測定値が大きい場合1。
- データ長を13ビットとした場合
- 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へのアクセス
説明書によると
- アクセスしたいレジスタ番号をアドレスポインターレジスタに入れてADT7410に書き込む。
- アドレスポインターレジスタは、ADT7410に書き込まれ最初の値
- アクセスが終了すると、アドレスポインターレジスタの値が1増える。
- アドレスポインターレジスタ、”0”にアクセスし終わるとポインターの値は、”1”となる。
- 続けて連続したアドレスにアクセスする場合、アドレスポインターレジスタを毎回設定する必要はない。
- アドレスポインターレジスタのデフォルトは0。
と有ります。例えば、ADT7410の、”ステータスレジスタ”を読み込みたい場合。
- ADT7410に、”ステータスレジスタ”の番号、”0x02”を書き込む。
- アドレスポインターが2に設定される
- 続いてADT7410からデータを読み込む。
また、測定データを読み込む場合、
- ADT7410に、”温度レジスタ上位レジスタ”の番号、”0x00”を書き込む。
- アドレスポインターが0に設定される
- ADT7410から、1バイト読み込む。(測定値の上位バイト)
- アドレスポインターが自動でインクリメントされ1になる。これによりポインターは”温度レジスタ下位レジスタ”をさしている。
- ADT7410から、1バイト読み込む。(測定値の下位バイト)
となる。
Webでよく下記の様なスケッチで値を読み込んでいるのを見ます。
Wire.begin();
Wire.requestFrom(addr, 2);
data = Wire.read() << 8;
data |= Wire.read();
やっと状況が理解出来ました。ADT7410は、電源投入で
- 測定長は13ビット。
- 測定モードは連続モード。
- アドレスポインターは0。
となっている為、何の設定をしなくても温度は測定出るということです。
ちょっと疑問
上記のスケッチ、2,3,4行をもう一回繰り返したらどのレジスタの値を呼んで来るのでしょうか。予想は、
- 最初の1回目は、レジスタ、”0x00,0x01”。
- 次は、レジスタ、”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”の値を返して来ました。一回の処理で、ポインターが加算されても、次の処理ではまた、オリジナルのアドレスポインターレジスタの値から始まる様です。意図的に変更しない限りアドレスポインターレジスタの値は変わらない様です。
念の為にもう一つ
このスケッチは、
- アドレスを0x04に設定して4バイト読み込む。
- 続けて、アドレスを指定しないで4バイト読み込む。
前回の結果から予想される結果は、0x20,0x00,0x05,0x00の4バイトが2回表示されるはず。
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に戻るが正しい様です。