温度センサー(ADT7410)の使い方3

〔LM61CIZ〕 〔Arduinoの動かせ方入門に戻る〕


以前に温度センサーのLM61CIZを使った記事は書きました、これはアナログ接続のセンサーでした。 *1)
今回はI2C接続の温度センサーADT7410の動作記事を書いて置きます。
ADT7410を使ったモジュールが秋月電子のこちらで販売されています。
(ADT7310のこちらは同じ物ですが接続がSPIとなります。)
このセンサーは電源2.7V-5.5Vで、精度±0.44℃(3.3V)、分解能0.0078℃(16bit)、温度-55-150℃と
高精度・高分解能と広い測定温度の様で、ちょっとぉ期待しちゃいますね。

尚、このセンサーは設定した温度に対してその温度以上や以下の監視を行いアラームを出力する
機能が有るのですが、このモジュールはアラーム出力ピン(INT/CT)が引き出されていません、
なのでここではこの機能については説明を省きます。

また、データシートは製造元のページを参照しましょう。

このADT7410には電源管理を目的とした4つの動作モードが有ります。

シャットダウンモード(Shutdown Mode)
 ここのページのスケッチでの初期化はこのモードから開始しています。
 このモード時はI2C回路以外は動作していない状態で約2uA(3.3V)の消費電流らしい。
 (レジスターへの読み書きは可能です)

連続測定モード(Continuous Mode):デフォルト
 連続で測定を行います、測定するのに240ms程掛かるようです。
 240ms毎に測定されるのでデータは常に最新の様ですが、測定時の消費電流は210uA(3.3V)。

ワンショット(単発)測定モード(One Shot Mode)
 1回づつ測定するモードで、測定が完了すればシャットダウンモードになります。
 測定完了後240ms程でシャットダウンモードに移行します。

1秒間隔測定モード(1 SPS Mode)
 1秒周期で測定するモードです、消費電流は46uA(3.3V)。

《配線図》

配線図  回路電源は5Vです。
 ですが、5Vは精度が±0.8℃(3.3V:±0.44℃)と
 落ちます注意しましょう。

 モジュールの"PU"に半田を盛ればモジュールで
 内蔵I2C用プルアップが出来ますが、ここでは
 外付け抵抗(10KΩ)にしています。

 "A0"・"A1"に半田を盛れば以下の表の様に
 センサーのI2Cアドレスが選択出来ます。
A0 A1 アドレス
0x48
0x49
0x4A
0x4B
"1"で半田盛です、デフォルトは0x48となります。

ADT7410の"INT"ピンは設定した温度を超えた
場合と下回った場合に出力されるピンです。

ADT7410の"CT"ピンは設定した温度を超えると
出力され、温度ヒステリシス値以下になるまで
出力は保持されます。

(INT/CTピンともモジュールには端子は有りません)

《ダウンロードスケッチについて》

↓ここからArduino用サンプルスケッチファイルをダウンロードして下さい。
skADT7410.zip

解凍すると下の様に展開されます。
[skADT7410]─┬─[examples]───[Temperature]--- Temperature.ino
       ├ skADT7410.cpp
       ├ skADT7410.h
       └ keywords.txt
ライブラリの登録方法は、ここのページの登録方法1を参照してインストールしましょう。

Temperature.ino  ・・・・本体のサンプルスケッチ
skADT7410.cpp ・・・・・温度センサー(ADT7410)用関数ライブラリソース
skADT7410.h ・・・・・・・ヘッダファイル
keywords.txt ・・・・・・・・キーワードファイル

Temperature.ino

Temperature.inoを開くには、
IDEを起動して、メニューバーの「ファイル」→「スケッチの例」→「skADT7410」→[Temperature]
をクリック操作すればファイルが開かれます。
次に、IDEツールバーの「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行います。

実行結果1  IDEの[シリアルモニタ]画面を表示させましょう。

 こんな感じ(左図)に1秒毎に表示されると成功です
 "Initialization abnormal ans=?"と表示されたら失敗
 です、配線などをよ〜くぅ確かめてみましょう。



skADT7410.h

温度センサー(ADT7410)用関数のインクルードファイルです。
関数ライブラリを利用する場合は、メニューバーの「スケッチ」→「ライブラリを使用」→「skADT7410」を
クリック操作すれば、"#include <skADT7410.h>"がスケッチに追加されます。
まぁ、手動でキー入力しても良いんですけどね。

skADT7410.cpp

まず利用する場合は下記2行をスケッチの最初に記述します。
#include <Wire.h>
#include <skADT7410.h>

setup( )関数内で下の様にI2Cを使用する為の初期化処理を記述します。("Temperature.ino"を参照)
Wire.begin() ;   // マスターとする

デバイスのI2C通信速度は最大400KHzまでの様ですがArduinoは100KHzで初期化されます。

温度センサー(ADT7410)用関数の使い方を説明します。

skADT7410
 温度センサー(ADT7410)用関数ライブラリを使用する為に必要な宣言(初期化)を行います。
 skADT7410 Temp(address) ;
  address :デバイス(スレーブ)のI2Cアドレスを指定します(0x48)
 "Temp"の名前は任意に変更可能です。
 例)
 #define SENSOR_ADRS 0x48 // デバイスのI2Cアドレス  skADT7410 Temp(SENSOR_ADRS) ; // 温度センサーライブラリの生成を行う

アドレス設定  アドレスは7ビットで表します、左図の1〜7ビットです。
 0ビット目はR/Wでこれはデバイスに対する読書き指示ビットです。
 R/W=0 : 書き込み要求です(デバイスは受信モード)
 R/W=1 : 読み込み要求です(デバイスは送信モード)

 このADT7410は4種類のアドレスから選択出来ますが、
 ここでは、「A0=0 A1=0」の設定なので("1001000":0x48)("1001000"+R/W)となりますから
 R/W=0書き込みなら"1001000"+"0"で0x90、R/W=1読み込みなら"1001000"+"1"で0x91となりますが
 ここでは7ビットで指定なので
 #define SENSOR_ADRS  0x48  // デバイスのI2Cアドレス
 となっています。

ans = Temp.Begin( )
 温度センサの初期値設定を行う処理です。
 設定のデータは、解像度16bit固定で、デバイスの初期動作モードは"シャットダウン"でスタートです。
 "INT/CT"機能は利用しないのでデフォルトのままです。
 この初期設定を変更する場合は、"skADT7410.h"の記述を書き換えて下さい。
 (設定値の詳しい内容はデータシートを参照して下さい)

  ans   :戻り値   0=正常終了、それ以外はI2C通信エラーです
             1=送ろうとしたデータが送信バッファのサイズを超えた(32バイトMAX)
             2=スレーブ・アドレスを送信し、NACKを受信した
             3=データ・バイトを送信し、NACKを受信した
             4=その他のエラー
             5=データ受信エラー

ans = Temp.ActionMode(mode)
 温度センサの動作モード(測定モード)を設定する処理です。
 測定モードに切り替えると測定を開始します。
  mode :動作モードを指定します
       ADT_MODE_SHUTDOWN   = シャットダウン状態にします。
       ADT_MODE_ONESHOT     = ワンショット(単発)測定モードにします。
       ADT_MODE_1SPS            = 1秒間隔モードにします。
       ADT_MODE_CONTINUE    = 連続測定モードにします。
  ans    :戻り値、0=正常終了 それ以外 Temp.Begin( )のans値を参照

  この関数を発行後、測定完了には240ms掛かります。

  ワンショットと1 SPSモードでは、ステータスレジスタの"RDY"ビットを見れば測定完了で"LOW"に
   なるのですが今回利用していません。

ans = Temp.Receive(reg_adrs,*data,kosu)
 デバイスから指定個数のデータを受信する処理です。
  reg_adrs:読出すデータのレジスターアドレスを指定する
           連続的に読出す場合は、読出すレジスターの先頭アドレスを指定
  *data    :読出したデータの格納先を指定する(格納先配列の個数はkosu分確保する事)
  kosu     :読出すデータのバイト数を指定する
  ans       :戻り値、0=正常終了 それ以外Temp.Begin( )のans値を参照

ans = Temp.Send(reg_adrs,*data,kosu)
 デバイスに指定個数のデータを送信する処理です。
  reg_adrs:書出すデータのレジスターアドレスを指定する
           連続的に書出す場合は、書出すレジスターの先頭アドレスを指定
  *data    :書出すデータの格納先を指定する
  kosu     :書出すデータのバイト数を指定する
  ans       :戻り値、0=正常終了 それ以外Temp.Begin( )のans値を参照

ans = Temp.Read(*temp)
 温度センサから読込みを行い温度値を返す処理です。
 温度センサより読み込んだデータは、摂氏温度に変換し"temp"にセットします。
  *temp  :摂氏温度を返すのでfloat変数のアドレスを指定
  ans      :戻り値、0=正常終了 それ以外 Temp.Begin( )のans値を参照

 連続モード読込み 例)
 skADT7410 Temp(0x48) ;
 setup(){
      Serial.begin(9600) ;
      Wire.begin() ;
      Temp.Begin() ;
      Temp.ActionMode(ADT_MODE_CONTINUE) ;
      delay(240) ;
 }
 loop(){
      float temp ;

      Temp.Read(&temp) ;
      Serial.print(temp,4) ;
      delay(500) ;
 }
 ワンショットモード読込み 例)
 skADT7410 Temp(0x48) ;
 setup(){
      Serial.begin(9600) ;
      Wire.begin() ;
      Temp.Begin() ;
 }
 loop(){
      float temp ;

      Temp.ActionMode(ADT_MODE_ONESHOT) ;
      delay(240) ;
      Temp.Read(&temp) ;
      Serial.print(temp,4) ;
      delay(500) ;
 }

《他のセンサーと比較して見る》

実験写真  左図の様に他のセンサーと比較してみました。
 センサー左から、LM61CIZHDC1000・ADT7410
 の順です。

 PS. *1)
 HDC1000は現在販売されていません、
 代替えがSHT31です。

 LM61CIZ(アナログ接続)
  測定範囲:-30〜100℃
  精度:±3℃(25℃時)
  この記事はこちらを参照下さい。
 HDC1000(湿度センサー)
  測定範囲:-40〜125℃
  精度:±0.2-0.4℃(5-60℃時)
  この記事はこちらを参照下さい。
 ADT7410(温度専用センサー)
  測定範囲:-55〜150℃
  精度:±0.8℃(5V時) ±0.44℃(3.3V時)

 下が実行結果図です。
実行結果2



リンクの見直し(*1) 2020/03/19


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.