IC温度センサーADT7410から温度データを読み取り、CSV形式でファイルに保存する方法を紹介します。
使用するマイコンはRaspberry Pi、プログラム言語はPythonです。
サンプルプログラムは、センサーからデータを読み取るだけでなく測定条件設定も行います。
センサーの主な仕様
測定範囲:-55℃~150℃
精度:±0.5℃
分解能:0.0625℃(13bit)/0.0078℃(16bit)
準備
ADT7410の購入
ADT7410はSOICと呼ばれる形状です。
センサー単体もしくはモジュールのどちらも購入出来ます。はんだ付けに自信がない人は、モジュールの購入がお勧めです。
下の写真は秋月電子通商で購入したADT7410モジュールです。今回はこのモジュールを使用したサンプルプログラムを紹介します。
Raspberry Piの通信設定とPythonの操作方法
Raspberry PiのI2C通信設定を有効にします。
下の記事でRaspberry PIのI2C通信設定とPythonの基本操作を説明しています。
I2C通信でデータを取得する
モジュールとRaspberry Piの接続
接続図
接続写真
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()
プログラムの説明
プログラムの流れは、以下の通りです。
- I2C通信の初期設定
- センサーの設定
- 保存用ファイルをオープン
- センサーから温度データを取得
- データを物理量へ変換し画面に表示
- CSV形式でファイルにデータを書き込み
- 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 | 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回分のデータが保存されています。
温度データ表示だけでなく、”/home/pi/” ディレクトリに adt7410.csvファイルを作成します。
以上、ADT7410モジュールからI2C通信で温度データを読み込んでCSV形式で保存するサンプルでした。
まとめ
ADT7410には、予め設定した高温、低温の割り込み信号の発生などの機能があります。機会があれば確認したいと思います。
今回使用したモジュールは、これらの割り込み用の信号pinが出ていないので、ICの脚に直接はんだ付けして信号を引き出さねばならず、面倒だったので省略しました。
プログラミングやソフトウェアの記事です。
コメント