2ワイヤデジタル温度センサーS-5851Aから温度データを読み取る方法を紹介します。
使用するマイコンはRaspberry Pi、プログラム言語はPythonです。
センサーの主な仕様は以下の通りです。
測定精度:±2.0℃(-25℃~+85℃)/±3.0℃(-40℃~+125℃)
分解能:0.0625℃
センサーの準備
S-5851Aの購入
S-5851Aは、SOT-23とSNT-6Aと呼ばれる2種類の形状があります。
SOT-23は手ではんだ付けが可能ですが、SNT-6Aは端子が底面なので不可能です。
STN-6Aの形状を使用する場合はモジュールの購入になると思います。
下の写真は秋月電子通商で購入したS-5851Aモジュールです。今回はこのモジュールを使ってデータを読み込む方法を紹介します。
モジュールとRaspberry Piの接続
接続図
接続写真
Raspberry Piの通信設定とPythonの操作方法
Raspberry PiのI2C通信設定を有効にします。
下の記事でRaspberry Piの通信設定と、Pythonの基本操作を説明しています。
I2C通信プログラミング
プログラムコード
Pythonプログラムです。
import smbus
import time
#I2C設定
i2c = smbus.SMBus(1)
address = 0x48
while True:
#データ読み込み
tmp = i2c.read_i2c_block_data(address, 0x00, 0x02)
#データ変換
out_t = tmp[0] << 8 | tmp[1]
out_t = out_t >> 4
#極性判断
if out_t >= 2048:
out_t = out_x - 4096
#物理量(温度)に変換
out_t = out_t * 0.0625
#表示
print('tmp = ' + str(out_t))
#一時停止
time.sleep(1)
プログラムの説明
プログラムの流れです。
- I2C通信の初期設定
- センサーから温度データを取得
- データを物理量に変換し画面に表示
- 2.~3.を繰り返します
1.I2C通信の設定
#I2C設定
i2c = smbus.SMBus(1)
address = 0x48
i2c = smbus.SMBus(1)
インスタンス生成です。使用するBus1を指定します。
address = 0x48
アドレス指定です。 AD0ピンとAD1ピンをGNDに接続すると0x48(16進数)になります。
通信時に指定します。
Raspberry PiにS-5851Aモジュールを接続した状態で、LXTerminalから「i2cdetect -y 1」コマンドを入力すると、アドレスが0x48であることを確認出来ます。
2.センサーから温度データを取得
#データ読み込み
tmp = i2c.read_i2c_block_data(address, 0x00, 0x02)
i2c.read_i2c_block_data(address, 0x00, 0x02)
0x00
0x00を書き込むと温度レジスタを読み込みます。
(0x01を書き込むとコンフィグレーションレジスタです)
0x02
2byte(16bit)のデータを読み込みます。
読み込みは16bitですが、温度データは12bitです。
2バイト目が左詰めで下位4bitが0です。
データシートの『レジスタ説明』で詳細を確認できます。
3.データを物理量に変換し画面に表示
#データ変換
out_t = tmp[0] << 8 | tmp[1]
out_t = out_t >> 4
温度データは12bitで、8bitの入れ物2つに入っています。
tmp[0]を左へ8bitシフトし、tmp[1]と or します。
下位4bitが0で埋まっているので、右に4bitシフトします。
#極性判断
if out_t >= 2048:
out_t = out_x - 4096
if(out_x >= 2048):
out_x = out_x – 4096
2の補数表現を符号ありに変換します。
12bitデータ | 符号なし | 符号あり |
100000000000 | 2048 | -2048 |
100000000001 | 2049 | -2047 |
: | : | : |
111111111110 | 4094 | -2 |
111111111111 | 4095 | -1 |
000000000000 | 0 | 0 |
000000000001 | 1 | 1 |
000000000010 | 2 | 2 |
: | : | : |
011111111110 | 2046 | 2046 |
011111111111 | 2047 | 2047 |
2の補数の詳しい説明はこちら
「2の補数」(2021年10月12日 (火) 17:00 UTCの版)『ウィキペディア日本語版』
#物理量(温度)に変換
out_t = out_t * 0.0625
out_t = out_t * 0.0625
最小分解能あたりの温度は、0.0625℃ / LSBです。
0.0625を掛けて物理量(温度)に変換します。
#表示
print('tmp = ' + str(out_t))
print(‘tmp = ‘ + str(out_t))
測定した温度を画面に表示します。
4.2.~3.を繰り返します
#繰り返し
while True:
while True:
Stopボタンが押されるまで繰り返します。
※この『while True:』は、8行目のwhile文です。
プログラムの実行結果
プログラムを実行します。
①Runボタンを押します。
②温度データを1秒間隔で画面に表示します。
③Stopボタンを押すとプログラムは終了します。
以上、S-5851AモジュールからI2C通信で温度データを読み込んで連続で表示するサンプルでした。
まとめ
S-5851Aのサンプルプログラムと、その動作について紹介しました。如何でしたでしょうか。
シンプルなセンサーほど、うまく動かなかった場合に解決まで非常に苦労したりするので、注意してください。
プログラミングやソフトウェアの記事です。
コメント