SHT31温湿度センサ
AE-SHT31温湿度センサモジュールを購入してみました。
古いHDC1000センサとBME280センサの湿度表示の信頼性不明なので、そのために秋月電子で販売されている標記温湿度センサを購入してみました。
姿形はHDC1000と同じに見えますが、チップメーカーは違う様です。
この製品に使われているセンサチップは信頼度も高そうですし、日本語データシートがありますし、キャリブレートをチップ内で行う様なので、複雑な計算も不要の様です。
今回は当局の様なアマチュアでも楽にプログラムできそう (^_^)
古いHDC1000センサとBME280センサの湿度表示の信頼性不明なので、そのために秋月電子で販売されている標記温湿度センサを購入してみました。
姿形はHDC1000と同じに見えますが、チップメーカーは違う様です。
この製品に使われているセンサチップは信頼度も高そうですし、日本語データシートがありますし、キャリブレートをチップ内で行う様なので、複雑な計算も不要の様です。
今回は当局の様なアマチュアでも楽にプログラムできそう (^_^)
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ビットデータ
基板上に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ビットデータ
SHT31とBME280の同時運転での表示データ比較
当局小道具のI2C実験基板を用いて、3.3VのI2Cバスに両センサをぶら下げて、交互にデータを読み出し、データ表示させる実験を行いました。
使用PICは16F18326で内部発振32MHZで動作させています。
割り込みは使用していません。
約2秒毎に各センサに交互アクセス・表示しています。
もちろん、BME280センサは最近購入したものを使用しています。
(当局の古いBME280は気圧値以外信用できない)
温度は良好な一致を示しています。
湿度も概ね一致しています。
当局小道具のI2C実験基板を用いて、3.3VのI2Cバスに両センサをぶら下げて、交互にデータを読み出し、データ表示させる実験を行いました。
使用PICは16F18326で内部発振32MHZで動作させています。
割り込みは使用していません。
約2秒毎に各センサに交互アクセス・表示しています。
もちろん、BME280センサは最近購入したものを使用しています。
(当局の古いBME280は気圧値以外信用できない)
温度は良好な一致を示しています。
湿度も概ね一致しています。
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関数のみで測定データを取得、
と言った所でしょうか。
双方とも動作を確認していますし、表示データに差異は無いと思います。
この関数は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つの環境をこの価格で測定できるのは捨てがたい物がありますけど・・・
今の所、SHT31、BME280両センサ共に安定してデータ表示しています。
今回の実験目的である両センサの測定値差に関しては、温度は概ね±0.5℃以内、湿度は概ね±3%以内に収まっているようです。
測定数値に関しては、現在の所は信頼できそうです。
少し離れて見ている限り、表示もふらつかず安定しています。
当局が手を近づけると、急速に数値が変動します。
その他
やはりHD1000センサは、温度は大丈夫そうですが、2~3年程度で湿度測定の経年劣化が顕著に生じる様で、もはや使用価値は無いと思われます。
BME280センサも温湿度で経年劣化が発生する様ですが、どうしたもんででしょうか・・・
3つの環境をこの価格で測定できるのは捨てがたい物がありますけど・・・