高精度温湿度センサー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と呼ばれる形状です。
センサーを手ではんだ付けするのは不可能なのでモジュールの購入になると思います。
下の写真は秋月電子通商で購入したモジュールです。熱量や被測定空気の流通などが考慮されているのでお勧めです。今回は、このモジュールを使ったサンプルプログラムを紹介します。
モジュールとRaspberry Piの接続
接続図
接続写真
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)
プログラムの説明
プログラムの流れです。
- I2C通信の設定
- センサーの設定
- センサーから温湿度データを取得
- データを物理量に変換し画面に表示
- 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は、データ通信中にノイズなどで値が変化してしまった時に、間違いを発見するために使用します。
データの並びは以下の様になっています。
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のデータにします。
#物理量(温湿度)変換
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ボタンを押すとプログラムは終了します。
以上、SHT31-DISからI2C通信で温度データと湿度データを読み込んで表示するサンプルでした。
まとめ
SHT31-DISモジュールからRaspberry PiにI2C通信でデータを読み込んで表示するサンプルでした。如何でしたでしょうか。
うまくいかないときは、ひとつづつ配線やプログラムを再確認してみましょう。地味な作業で辛いですが、これが一番です。
プログラミングやソフトウェアの記事です。
コメント