2ワイヤデジタル温度センサー S-5851Aの使い方

S-5851A 温度センサー センサー

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モジュールです。今回はこのモジュールを使ってデータを読み込む方法を紹介します。

S-5851A モジュール写真

モジュールとRaspberry Piの接続

接続図

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

接続写真

ブレッドボードを使用したS-5851Aの接続写真 1
ブレッドボードを使用したS-5851Aの接続写真 2

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)

プログラムの説明

プログラムの流れです。

  1. I2C通信の初期設定
  2. センサーから温度データを取得
  3. データを物理量に変換し画面に表示
  4. 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シフトします。

16bitデータ
#極性判断
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ボタンを押すとプログラムは終了します。

PythonのRunボタンとStopボタン
S-5851Aのプログラムの実行結果

以上、S-5851AモジュールからI2C通信で温度データを読み込んで連続で表示するサンプルでした。

まとめ

S-5851Aのサンプルプログラムと、その動作について紹介しました。如何でしたでしょうか。
シンプルなセンサーほど、うまく動かなかった場合に解決まで非常に苦労したりするので、注意してください。

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

コメント