IC温度センサーADT7410の使い方

ADT7410 IC温度センサー センサー

IC温度センサーADT7410から温度データを読み取り、CSV形式でファイルに保存する方法を紹介します。

使用するマイコンはRaspberry Pi、プログラム言語はPythonです。

サンプルプログラムは、センサーからデータを読み取るだけでなく測定条件設定も行います。

センサーの主な仕様
測定範囲:-55℃~150℃
精度:±0.5℃
分解能:0.0625℃(13bit)/0.0078℃(16bit)

準備

ADT7410の購入

ADT7410はSOICと呼ばれる形状です。
センサー単体もしくはモジュールのどちらも購入出来ます。はんだ付けに自信がない人は、モジュールの購入がお勧めです。

下の写真は秋月電子通商で購入したADT7410モジュールです。今回はこのモジュールを使用したサンプルプログラムを紹介します。

ADT7410モジュール写真

Raspberry Piの通信設定とPythonの操作方法

Raspberry PiのI2C通信設定を有効にします。
下の記事でRaspberry PIのI2C通信設定とPythonの基本操作を説明しています。

I2C通信でデータを取得する

モジュールとRaspberry Piの接続

接続図

ブレッドボードを使用したADT7410モジュールとRaspberryPiの接続【I2C】

接続写真

ブレッドボードを使用したADT7410【I2C通信】モジュールの接続写真 1
ブレッドボードを使用したADT7410【I2C通信】モジュールの接続写真 2

I2C通信プログラミング

プログラムコード

Pythonのプログラムコードです。

import smbus
import time

#I2C設定
i2c = smbus.SMBus(1)
address = 0x48

#センサーの設定(ADCの分解能を16bitにする場合に有効にする)
#ret = i2c.write_byte_data(address, 0x03, 0x80)

#ファイルオープン(書き込みモード)
f = open("adt7410.csv", "w")

#10回繰り返す
for i in range(10):

    #データ取得
    data = i2c.read_word_data(address, 0x00)

    #データ変換
    data = (data & 0xFF00) >> 8 | (data & 0x00FF) << 8

    #ADCの分解能が16bitの場合は無効にする
    #data = data >> 3

    #データ変換(マイナス温度計算)
    if(data >= 4096):
        data -= 8192
    data *= 0.0625

    #表示
    print(data)

    #データのCSV変換とファイルへの書き込み
    f.write(str(i+1) + "," + str(data) + "\n")

    #一時停止(1秒間)
    time.sleep(1)

#ファイルクローズ
f.close()

プログラムの説明

プログラムの流れは、以下の通りです。

  1. I2C通信の初期設定
  2. センサーの設定
  3. 保存用ファイルをオープン
  4. センサーから温度データを取得
  5. データを物理量へ変換し画面に表示
  6. CSV形式でファイルにデータを書き込み
  7. 10回繰り返してファイルをクローズし終了

1.I2C通信の初期設定

#I2C設定
i2c = smbus.SMBus(1)
address = 0x48
register = 0x00

i2c = smbus.SMBus(1)
インスタンス生成です。使用するBus1を指定します。

address = 0x48
アドレス指定です。ADT7410のアドレスは0x48(16進数)で、通信時に指定します。

Raspberry PiにADT7410を接続した状態で、LXTerminalから「i2cdetect -y 1」コマンドを入力すると、アドレスが0x48であることを確認出来ます。

2.センサーの設定(ADCの分解能を16bitにする場合に有効にします)

#センサーの設定(ADCの分解能を16bitにする場合に有効にする)
ret = i2c.write_byte_data(address, 0x03, 0x80)

設定は write_byte_data(adr, reg, dat)関数を使用します。

第1引数 adr:I2C通信のアドレス
第2引数 reg:レジスタ(設定したい項目の記憶場所)
第3引数 dat:データ(レジスタに設定する内容)

Configurationレジスタで、ADCの分解能を16bitに設定します。デフォルトは13bitです。
レジスタの設定内容は以下の通りです。

i2c.write_byte_data(address, 0x03, 0x80)

0x03(Configuration Register)
D7(Resolution)
D6-D5(Operation mode)
D4(INT/CT mode)
D3(INT pin polarity)
D2(CT pin polarity)
D1-D0(Fault queue)

0x80
D7(1:16bit分解能)
D6-D5(00:デフォルト)
D4(0:デフォルト)
D3(0:デフォルト)
D2(0:デフォルト)
D1-D0(00:デフォルト)

D7 D6 D5 D4 D3 D2 D1 D0
1 00 0 0 0 00
8 0

データシートの『Table 11. Configuration Register(Register Address 0x03)』に、詳しい情報があります。

3.保存用ファイルをオープン

#ファイルオープン(書き込みモード)
f = open("adt7410.csv", "w")

f = open(“adt7410.csv”, “w”)

“adt7410.csv”ファイルを書き込みモードでオープンします。
ファイルが存在しない場合は新規に作成します。存在する場合は上書き保存します。

上書きせずに追記する場合は、2番目の引数を “w” から “a” にします。
ファイルは、/home/pi ディレクトリに保存されます。

4.センサーから温度データを取得

#データ取得
data = i2c.read_word_data(address, 0x00)

data = i2c.read_word_data(address, register)

温度データを読み込んで、変数dataに代入します。
address(0x048)と register(0x00)を指定します。

Register Description Power-on-default
0x00 Temperature value most significant byte 0x00
0x01 Temperature value least significant byte 0x00

5.データを物理量へ変換し画面に表示

#データ変換(13bit極性あり)
data = (data & 0xFF00) >> 8 | (data & 0x00FF) << 8

#ADCの分解能が16bitの場合は無効にする
data = data >> 3

data = (data & 0xFF00) >> 8 | (data & 0x00FF) << 8
dataの上位8bitと下位bitを入れ替えます。

data = data >> 3
ADCの分解能が13bitの場合は、16bitの入れ物に13bitのデータが左詰めで入っているので、右に3bitシフトします。分解能が16bitの場合は、この処理は無効です。

#データ変換(マイナス温度計算)
if(data >= 4096):
    data -= 8192

if(data >= 4096):
data -= 8192

2の補数表現を符号ありに変換します。

13bit データ 符号なし 符号あり
1000000000000 4096 -4096
1000000000001 4097 -4095
1111111111110 8190 -2
1111111111111 8191 -1
0000000000000 0
0000000000001 1 1
0000000000010 2 2
0111111111111 4094 4094
0111111111111 4095 4095

2の補数の詳しい説明はこちら
2の補数」(2021年10月12日 (火) 17:00 UTCの版)『ウィキペディア日本語版』

data *= 0.0625

#表示
print(data)

data *= 0.0625
0.0625を掛けて温度に変換します(0.0625℃/digit)

print(data)
結果を画面に表示します。

6.CSV形式でファイルにデータを書き込み

#データのCSV変換とファイルへの書き込み
f.write(str(i+1) + "," + str(data) + "\n")

f.write(str(i+1) + “,” + str(data) + “\n”)

f.write()のカッコの中をファイルに書き込みます。

カッコの中は、データをカンマ区切りのCSV形式にしています。
str(i+1) と str(out)をカンマで区切っています。最後に改行コード(\n)を追加します。

CSV形式の詳しい説明はこちら
Comma-Separated Value」(2021年10月25日 (月) 05:33 UTCの版)『ウィキペディア日本語版』

6.10回繰り返してファイルをクローズし終了

#10回繰り返す
for i in range(10):

for i in range(10):
繰り返し命令です。10回繰り返します。

※この『for i in range(10):』は、15行目のfor文です。

#ファイルクローズ
f.close()

f.close()
ファイルをクローズします。

プログラムの実行結果

以下の手順でプログラムを実行します。

①Runボタンを押します。
②温度データを0.5秒間隔で画面に10回表示します。
③CSV形式で10回分のデータが保存されています。

PythonのRunボタン
ADT7310のプログラムの実行結果

温度データ表示だけでなく、”/home/pi/” ディレクトリに adt7410.csvファイルを作成します。

adt7310.csvファイル

以上、ADT7410モジュールからI2C通信で温度データを読み込んでCSV形式で保存するサンプルでした。

まとめ

ADT7410には、予め設定した高温、低温の割り込み信号の発生などの機能があります。機会があれば確認したいと思います。
今回使用したモジュールは、これらの割り込み用の信号pinが出ていないので、ICの脚に直接はんだ付けして信号を引き出さねばならず、面倒だったので省略しました。

プログラミングやソフトウェアの記事す。

コメント