温度センサー(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 |
アドレス |
0 |
0 |
0x48 |
0 |
1 |
0x49 |
1 |
0 |
0x4A |
1 |
1 |
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ボードに書込みを行います。
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) ;
}
《他のセンサーと比較して見る》
左図の様に他のセンサーと比較してみました。
センサー左から、LM61CIZ・
HDC1000・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時)
下が実行結果図です。
リンクの見直し(*1) 2020/03/19
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.