AE-SHT31温湿度センサモジュールを購入してみました。

古いHDC1000センサとBME280センサの湿度表示の信頼性不明なので、そのために秋月電子で販売されている標記温湿度センサを購入してみました。
姿形はHDC1000と同じに見えますが、チップメーカーは違う様です。
この製品に使われているセンサチップは信頼度も高そうですし、日本語データシートがありますし、キャリブレートをチップ内で行う様なので、複雑な計算も不要の様です。
今回は当局の様なアマチュアでも楽にプログラムできそう (^_^)


↑ AE-SHT31センサモジュール
 付属の細ピンをはんだ付けしてます











SHT31温湿度センサモジュール概要

基板上にSHT31チップと10KΩプルアップ抵抗、電源パスコンが配線されている様です。
このままPICに直結できそうですが、I2Cのプルアップはユーザーの選択制にして欲しかった・・・ (-_-メ)
インターフェイスはI2Cで、I2Cアドレスは88Hと8AHが使用可能です。
7bitアドレスで言うならば、44Hと45Hと言う事になります。
ここでは基板のADRピンはオープンなので、I2Cアドレス8AHと言う事で話を進めていきたいと思います。

主な仕様
温度(摂氏)-40℃~+125℃ 計測精度±0.2℃(@0℃~90℃)
湿度0%~100% 計測精度±2%(@0℃~90℃)

ピン配置(②③④プルアップ抵抗配線済みでユーザは設定できない)
① +V 2.4V~5.5V(絶対最大定格6V)
② SDA
③ SCL
④ ADR(GNDに接続するとI2Cアドレス88H)
⑤ GND


センサとの通信概要
AE-HDC1000モジュールの様なRDYピンが無く、計測中で読み出しデータが無い時は、
①マスタにクロックストレッチを掛けてくるのを利用する。
②マスタは測定コマンド送信後、所定の計測時間を待ってからデータを読みに行く。
以上の、どちらかを選択する事になりそうです。
計測時間の最大値は15msと記してありますので、①の場合はMSSP関数内で待たされることになりますし、②の場合は結構な時間長なのでPICに何かひと仕事をさせる事が出来ます。

センサの計測は単発測定モードと連続測定モードがあるようです。
連続計測モードはBME280とは意味合いが違う様で、単発測定を自動で繰り返しているだけに見えます。
すると、マスタプロフラムからはセンサの計測によるデータ更新は何時やっているかの把握が面倒で、データ読み出しは、事実上上記①で行う事になり、自由度が無くなる上に、精度は変わらない様にも見えます。

すると、シンプルに処理関数を構成するには、単発測定モードを利用する事になりそうです。



SHT31センサー動作コマンド一覧(抜粋)

単発測定コマンド  繰り返しレベル  クロックストレッチ
 2C06H    高        有効
 2C0DH    中        有効
 2C10H    低        有効
 2400H    高        無効 15ms(最大測定時間)
 240BH    中        無効  6ms(最大測定時間)
 2416H    低        無効  4ms(最大測定時間)
 ※クロックストレッチ無効の場合、送信すべき測定データが無い時は、
  I2C読み出しヘッダに対してNACKビットを返信します。
  クロックストレッチに関しては、MSSPモジュールが対処してくれます。

連続測定コマンド  繰り返しレベル  測定頻度(回数/秒)
 2032H    高        0.5mps
 2024H    中        0.5mps
 202FH    低        0.5mps
 2130H    高          1mps
 2126H    中          1mps
 212DH    低          1mps
 2236H    高          2mps
 2220H    中          2mps
 222BH    低          2mps
 2334H    高          4mps
 2322H    中          4mps
 2329H    低          4mps
 2737H    高         10mps
 2721H    中         10mps
 272AH    低         10mps
 ※送信すべき測定データが無い時は、
  I2C読み出しヘッダに対してNACKビットを返信します。

連続測定中止コマンド
 2B32H

測定データの演算処理

湿度変換式(単位 %RH)

 RH(%)=100×SRH÷((2^16)-1)
  ※SRHはセンサから送られてきた湿度用16ビットデータ

温度変換式(単位 ℃)

 T(℃)=-45+175×ST÷((2^16)-1)
  ※STはセンサから送られてきた温度用16ビットデータ

↑ 2つのセンサを近くに配置




↑ BME280センサの測定表示




↑ SHT31センサの測定表示

SHT31とBME280の同時運転での表示データ比較

当局小道具のI2C実験基板を用いて、3.3VのI2Cバスに両センサをぶら下げて、交互にデータを読み出し、データ表示させる実験を行いました。
使用PICは16F18326で内部発振32MHZで動作させています。
割り込みは使用していません。

約2秒毎に各センサに交互アクセス・表示しています。
もちろん、BME280センサは最近購入したものを使用しています。
(当局の古いBME280は気圧値以外信用できない)

温度は良好な一致を示しています。
湿度も概ね一致しています。
XC8用SHT31制御関数

 SHT31v1.h

 SHT31v1.c
SHT31センサ制御関数

この関数はI2C関数を呼び出します。
「MSSP02b」以上をいっしょにインクルードして下さい。
プログラム詳細はソースファイルを見て頂きたく思います。

(1)unsigned long int SHT_MEAS(void)
  当局版標準アクセス関数で、通常こちらを使用します。
  精度レベル高で単発測定を行います。
  動作時間は最大約15msほど掛かります。
  センサからの測定データを32bit符号無し整数で返します。

   引数:無
   戻値:32bitの測定データ
      bit31-16 16bitの温度データ
      bit15- 0 16bitの湿度データ

(2)SHT_SEND(unsigned int 引数)
  SHT31センサへの動作コマンドを送信します。

   引数:16bitコマンドコード
   戻値:無


(3)unsigned long int SHT_RECV(void)
  センサからの測定データを32bit符号無し整数で返しますが、
  センサのバッファにデータが無い場合、戻し値は不定です。
  センサの動作を考慮した上での本関数使用が必須です。

   引数:無
   戻値:32bitの測定データ
      bit31-16 16bitの温度データ
      bit15-0  16bitの湿度データ



関数の使い方

1.単発測定の場合
 (1)のSHT_MEAS関数を呼び出して、その度ごとの測定

2.連続測定モードの場合
 (2)のSHT_SEND関数で連続測定モードを指定(2737H等)
 メイン関数では(3)のSHT_RECV関数のみで測定データを取得、
 と言った所でしょうか。
 双方とも動作を確認していますし、表示データに差異は無いと思います。



結果および感想

今の所、SHT31、BME280両センサ共に安定してデータ表示しています。
今回の実験目的である両センサの測定値差に関しては、温度は概ね±0.5℃以内、湿度は概ね±3%以内に収まっているようです。
測定数値に関しては、現在の所は信頼できそうです。
少し離れて見ている限り、表示もふらつかず安定しています。
当局が手を近づけると、急速に数値が変動します。

その他
やはりHD1000センサは、温度は大丈夫そうですが、2~3年程度で湿度測定の経年劣化が顕著に生じる様で、もはや使用価値は無いと思われます。
BME280センサも温湿度で経年劣化が発生する様ですが、どうしたもんででしょうか・・・
3つの環境をこの価格で測定できるのは捨てがたい物がありますけど・・・


戻る  実験・製作の記録TOPへ戻る