高精度温湿度センサー SHT31-DISの使い方

SHT31-DIS 温湿度センサー センサー

高精度温湿度センサーSHT31-DISから温度データ湿度データを読み取る方法を紹介します。

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

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

センサーの主な仕様
温度測定
精度:±0.2℃(-40℃~+125℃)
長期安定度:0.03℃/年
分解能:0.015℃

湿度測定
精度:±2%(0%~100%)
長期安定度:0.25%RH/年
分解能:0.01%

準備

SHT31-DISの購入

SHT31-DISはDual Flat No Leadと呼ばれる形状です。
センサーを手ではんだ付けするのは不可能なのでモジュールの購入になると思います。

下の写真は秋月電子通商で購入したモジュールです。熱量や被測定空気の流通などが考慮されているのでお勧めです。今回は、このモジュールを使ったサンプルプログラムを紹介します。

SHT31-DIS モジュール写真

モジュールとRaspberry Piの接続

接続図

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

接続写真

ブレッドボードを使用したSHT31-DISの接続写真 1
ブレッドボードを使用したSHT31-DISの接続写真 2

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

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

I2C通信プログラミング

プログラムコード

Pythonプログラムです。

import smbus
import time

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

#センサー設定
ret = i2c.write_byte_data(address, 0x27, 0x37)

#一時停止
time.sleep(0.001)

while True:
    
    #データ読み込み
    dat = i2c.read_i2c_block_data(address, 0x00, 0x06)
    
    #データ変換
    tmp = dat[0] << 8 | dat[1]
    rhm = dat[3] << 8 | dat[4]
    
    #物理量(温湿度)変換
    tmp = -45 + 175 * tmp / 65535
    rhm = 100 * rhm / 65535
    
    #表示
    print('t= ' + str(tmp))
    print('r= ' + str(rhm))
    
    #一時停止
    time.sleep(1)

プログラムの説明

プログラムの流れです。

  1. I2C通信の設定
  2. センサーの設定
  3. センサーから温湿度データを取得
  4. データを物理量に変換し画面に表示
  5. 3.~4.を繰り返します

1.I2C通信の設定

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

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

address = 0x44
アドレス指定です。ADDRピンをGNDに接続すると0x44(16進数)になります。
通信時に指定します。

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

2.センサーの設定

#センサー設定
ret = i2c.write_byte_data(address, 0x27, 0x37)

1回だけ測定するモード(Single Shot Data Acquisition Mode)と、定期的に測定するモード(Periodic Data Acquisition Mode)の2種類のモードがあります。

Single Shot Data Acquisition Mode
測定する度に測定開始の命令を発行し、その後に読み込みをする必要があります。

Periodic Data Acquisition Mode
測定を開始するときに1回だけ開始命令を発行し、その後は読み込み命令だけで連続でデータを取得できます。サンプルプログラムは、こちらに設定しています。
(連続は消費電流と自己発熱に注意)

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

第1引数 adr:I2C通信のアドレス
第2引数 cmdMSB:コマンドMSB
第3引数 cmdLSB :コマンドLSB

i2c.write_byte_data(address, 0x27, 0x37)

Mode Periodic Data Acquisition Mode
mps 10
Repeatability High

設定の内容については、データシートの『4.5 Measurement Commands for Periodic Data Acquisition Mode』で詳細を確認できます。

Condition Hex.code
Repeatability mps MBS LSB
Heigh 10 0x27 0x37
Medium 0x21
Low 0x2A

Condition の Repeatability Highは、データシートで以下のように規定されています。

Humidity Sensor Specifications

Parameter Condition Value Units
Repeatability※ High. typ. 0.08 %RH

Temperature Sensor Specifications

Parameter Condition Value Units
Repeatability※ High. typ. 0.04

※Repeatabilityとは、一定の周囲条件での複数の連続測定の標準偏差(3σ)の3倍で、これはセンサー出力ノイズの測定値です。

time.sleep(0.001)

time.sleep(0.001)
コマンドとコマンド間に1ms以上の待機時間を設ける(データシートで指定されています)

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

#データ読み込み
tmp = i2c.read_i2c_block_data(address, 0x00, 0x06)

tmp = i2c.read_i2c_block_data(address, 0x00, 0x06)

温度データ16bit、CRC 8bit、湿度データ16bit、CRC 8bitの合計48bitを読み込みます。
CRCは、データ通信中にノイズなどで値が変化してしまった時に、間違いを発見するために使用します。

データの並びは以下の様になっています。

SHT31-DIS データシート【温度データ、湿度データ】

CRCの詳しい説明はこちら
巡回冗長検査」(2021年8月21日 (土) 20:49 UTCの版)『ウィキペディア日本語版』

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

#データ変換
tmp = dat[0] << 8 | dat[1]
rhm = dat[3] << 8 | dat[4]

tmp = dat[0] << 8 | dat[1]
rhm = dat[3] << 8 | dat[4]

データは8bitの入れ物2つに入っているので16bitのデータにします。

16bitデータ
#物理量(温湿度)変換
tmp = -45 + 175 * tmp / 65535
rhm = 100 * rhm / 65535

tmp = -45 + 175 * tmp / 65535
rhm = 100 * rhm / 65535

物理量に変換します。

Temperature conversion formula(result in ℃ & ℉)
T[℃] = -45 + 175 × ST / (216 – 1)

Relative humidity conversion formula(result in %RH)
RH = 100 × SRH / (216 – 1)

データシートの『4.13 Conversion of Signal Output』で詳細を確認できます。

#表示
print('t= ' + str(tmp))
print('r= ' + str(rhm))

print(‘t= ‘ + str(tmp))
print(‘r= ‘ + str(rhm))

測定した温度と湿度を画面に表示します。

5.3.~4.を繰り返します

#繰り返し
while True:

while True:
Stopボタンが押されるまで繰り返します。

※この『while True:』は、14行目のwhile文です。

プログラムの実行結果

プログラムを実行します。

①Runボタンを押します。
②温度データと湿度データを1秒間隔で画面に表示します。
③Stopボタンを押すとプログラムは終了します。

PythonのRunボタンとStopボタン
SHT31-DISのプログラムの実行結果

以上、SHT31-DISからI2C通信で温度データと湿度データを読み込んで表示するサンプルでした。

まとめ

SHT31-DISモジュールからRaspberry PiにI2C通信でデータを読み込んで表示するサンプルでした。如何でしたでしょうか。

うまくいかないときは、ひとつづつ配線やプログラムを再確認してみましょう。地味な作業で辛いですが、これが一番です。

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

コメント