湿度センサー(SHT31-DIS)を動作させて見ます

〔PICの動かせ方入門に戻る〕


以前MyHPで実験を行ったHDC1000ですが、”新規設計に用いることは推奨しません”らしく代替えが
HDC2010らしい、秋月電子通商でも取り扱いを止めたみたいでSHT31使用のこちらを販売しているが
操作方法は異なる。
なのでぇ、実験って言うかぁ、動作させてぇ、ライブラリを作成しておこうと思います。
このページでは、PIC16F18326を使用します。
コンパイルしたら約7.3KWord程なのでぇ、8KWord以上のPICを使用しましょう。

Arduinoの場合は現状割愛します。(>人<)
こちらspicemanさんの"Arduino-温度・湿度センサ「SHT31」の使い方"HPを参考にしましょう。
ライブラリを使いたい人は、GitHubに在る"Seeed-Studio/Grove_SHT31_Temp_Humi_Sensor"を
利用すれば良いでしょう。

HDC1000  SHT31-DISです、秋月電子通商のこちらで購入しています。
 電源は2.4V〜5.5Vで、I2C接続のモジュールです。
 このモジュールは、SDA/SCL/ADR端子に10KΩのプルアップ
 抵抗付きとなります。

 温度:-40℃~+125℃、±0.2℃(20%RH-80%RH)
 相対湿度:0%~100%、±2%(5℃-60℃)


ADRピン
I2Cアドレス選択用のピンです。
GNDに接続で0x44、無接続で0x45(今回はこれを使用しています)です。
因みにHDC1000では、この場所はRDY端子でデータの変換が終了するとLOWを出力する信号ピンでした
このピン使用していなかった場合時にSHT31とそのまま入れ替えた場合は無接続で0x45ですね。

データシートは、こちら、日本語です。
温湿度センサーはSHT30/SHT31/SHT35があるが、測定精度が異なるだけの様です。

《 配線図 》

ピンの構成図(PIC)
 左が今回使用するPIC16F18326ピンの構成図です。

 I2CピンはPPS機能でRC3をSDARC4をSCL
 割り当てています。


AQM0802ALCDピン構成図
 表示用は、左図のLCDで秋月電子通商の
 "I2C接続小型LCDモジュール"を使っています、
 LCDの詳しい記事はこちらを参照下さい。


配線図  左図がSHT31-DISと16F18326の実態配線図です

 電源は5Vで動作させていますが、
 3.3V(LCD_Init関数を要変更)でもOKです。

 LCDのRESET端子はLOWでリセットがかかる
 ので通常はVDDに接続です。

 I2C用のプルアップ抵抗はSHT31-DISモジュール
 に内蔵されているのでそれを使いました。

《ダウンロードプログラムについて》

↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
SHT3x.zip

プログラムソースをダウンロードしたら、MPLAB Xにてプロジェクトを作成します。
以下のファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
次にコンパイルPIC書き込みを実行して下さい。
MPLAB(R) XC8 C Compiler Version 2.00コンパイラを使用しています。

ダウンロードファイルを解凍すると下記の様なファイル構成です。
 SHT31_once.c・・・・ 本体のプログラムソースファイル(単発測定モード)
 SHT31_conti.c・・・・ 本体のプログラムソースファイル(連続測定モード)
 skSHT3x.c・・・・・・・・ 温湿度センサ(SHT3x-DIS)用関数ライブラリソースファイル
 skSHT3x.h・・・・・・・・ 温湿度センサ(SHT3x-DIS)用関数ライブラリのヘッダファイル
 skI2CLCDlib.c・・・・・ I2C接続LCDライブラリ関数ソースファイル
 skI2CLCDlib.h・・・・・ I2C接続LCDライブラリ用ヘッダファイル
 skI2Clib.c・・・・・・・・・ I2C通信を行う関数ソースファイル
 skI2Clib.h・・・・・・・・・ I2C通信を行う関数のヘッダファイル

 尚、CPUのクロックは32MHzを想定しています。
 なので通信速度等(I2C)はシステムクロック32MHzで計算されています。
  SHT31_once.c/SHT31_conti.cファイルの何れか一つでコンパイルしましょう。

SHT31_once.c

センサーの”単発測定モード”を使ったサンプルプログラムです。

動作結果図  上手く行けばLCDに"Init OK"が表示され、
 約3秒後位で左な感じに表示すると思います、
 1行目が湿度(%)で2行目が温度(℃)です。
 尚、"Init NG"が表示された場合は、
 デバイスが応答していません、配線等を見直して見ましょう。


SHT31_conti.c

センサーの”周期的連続測定モード”を使ったサンプルプログラムです。
動作は上記と同様です。

skSHT3x.h

SHT3x-DIS関数のヘッダファイルです。
"skSHT3x.c"を利用する場合に
#include "skSHT3x.h" をプログラムの先頭で記述して下さい。

今回は32MHzで利用しているので、
 #ifndef _XTAL_FREQ
  // Unless already defined assume 32MHz system frequency
  // This definition is required to calibrate __delay_us() and __delay_ms()
  #define _XTAL_FREQ 32000000    // 使用するPIC等により動作周波数値を設定する
 #endif
と記述しています、32MHz以外で利用する人は"32000000"を書き換えて下さい。

skSHT3x.c

このライブラリはSHT3x-DISから湿度と温度をI2C接続で読み出す関数集です。
ですので、この関数集にはskI2Clib.c / skI2Clib.hのファイルが必要です。

この関数集を利用する場合は、"skI2Clib.c"の"InitI2C_Master( )"関数を呼び出した後使います、
使い方の例は、"SHT31_once.c"を参照下さい。
また、この関数集自体は他のPICでも利用可能でしょう。

SHT3x-DIS用関数の使い方を説明します。
関数の戻り値に"-1=他のマスターとのバス衝突発生"がskI2Clibから得られますがぁ、
これを見て関数の再リトライとかは行っていません、必要な人はご自分で施しましょう。
又、センサーから読み出されるデータにはCRCチェックが付随するが未処理でチェックしていません。

ans = SHT3x_Init(address)
 デバイスの初期値設定を行う処理です。
 センサー自体では初期化の必要はないですが、センサーのソフトリセットを発行しています。
  address :デバイス(スレーブ)のI2Cアドレスを指定します(ADRS=0x45)
  ans       :戻り値   0=正常終了、それ以外はエラーです
             1=異常(相手からACKが返ってこない)
            -1=他のマスターとのバス衝突発生

ans = SHT3x_SoftRST( )
 デバイスへソフトリセットを送信する処理です。
  ans       :戻り値   0=正常終了、それ以外はエラーです
             1=異常(相手からACKが返ってこない)
            -1=他のマスターとのバス衝突発生

ans = SHT3x_Heater(onoff)
 デバイスのヒーターを起動/停止させる処理です。
 センサーに内蔵しているヒータを起動させますがぁ、当然ONさせれば温度は上昇するしぃ
 湿度は乾燥するしぃ、結露した時でも使うのかなぁ?、使い処が今一つわかりません。_(^^;)ゞ
  onoff     : 1=起動(SHT3X_HEATER_ON) 0=停止(SHT3X_HEATER_OFF)
  ans       :戻り値   0=正常終了、それ以外はエラーです
             1=異常(相手からACKが返ってこない)
            -1=他のマスターとのバス衝突発生
  例)
   SHT3x_Heater(SHT3X_HEATER_ON) ;  // ヒーター起動

ans = SHT3x_StatusRead(*sts)
 デバイスの情報を読み込む処理です。
 ヒーターの動作状態、アラートに関する状態、直前に受信したコマンドの
 実行状態及び直前に受信した書込みデータのチェックサム照合結果の情報を返します。(下記表参照)
  *sts       : デバイスの情報格納先を指定します
  ans       :戻り値   0=正常終了、それ以外はエラーです
             1=異常(相手からACKが返ってこない)
            -1=他のマスターとのバス衝突発生
  例)
   unsigned int sts ;
   SHT3x_StatusRead(&sts) ;

ステータスレジスタの内容
ビット
説明
デフォルト値
15
発信中のアラートの有無
‘0’:発信中アラート無し
‘1’:ひとつ以上の発信中アラート有り

14
予備
13
ヒーターの動作状態
‘0’:ヒーター停止中
‘1’:ヒーター稼働中

12
予備
11
相対湿度のアラート発信状態
‘0’:アラート発信無し
 ‘1’:アラート発信中

10
温度のアラート発信状態
‘0’:アラート発信無し
‘1’:アラート発信中


予備 00000





リセット履歴
‘0’:リセット履歴無し(ステータスレジスタの
  データ消去コマンドをその時点で最後に
  受信した以降)
‘1’:リセット履歴有り(ハードリセット、
  ソフトリセットコマンド又は電源電圧低下
  によるリセット)


予備 00


その時点で最後に受取ったコマンドの実行状態
‘0’:当該コマンドを正常に実行
‘1’:当該コマンドは未実行(コマンド自体が
  無効又はコマンドのチェックサムが
  異常な為


その時点で最後に受取った書込みデータのチェックサム照合結果
‘0’:当該データのチェックサムは正常
‘1’:当該データのチェックサムは異常


ans = SHT3x_MeasureRead(mode)
 デバイスの測定データを読み込み物理量値へ換算する処理です。
 温度値はTemperature、湿度はHumidity変数(float値)に其々変換して格納されます。
 単発測定モードは読み出されるまで20msの待ちが発生します、
 又、連続測定モードではこの関数を呼び出す前にSHT3x_ContiStart()を呼び出します。
  mode     : 0=単発測定(SHT3X_ONCE_MODE) 1=連続測定(SHT3X_CONTI_MODE)
  ans       :戻り値   0=正常終了、それ以外はエラーです
             1=異常(相手からACKが返ってこない)
            -1=他のマスターとのバス衝突発生
  例)
   char buf[12] ;
   SHT3x_MeasureRead(SHT3X_ONCE_MODE) ;  // 単発測定モードで読み込む
   sprintf(buf,"%.2f %.2f",Humidity,Temperature) ;

  測定データを読み出すとセンサーの持つデータ内容はクリアされます。
   クリア時に読み出せば"NACK"が返されます、注意しましょう。
  単発測定モード時はクロックストレッチを行わないで読み出しています。

ans = SHT3x_ContiStart(mps,accuracy)
 デバイスへ連続測定開始を送信する処理です。
  *mps       : 測定頻度を指定します(連続測定コマンドのMSB)
  *accuracy : 繰返し精度レベルを指定します(連続測定コマンドのLSB)
  ans          :戻り値   0=正常終了、それ以外はエラーです
              1=異常(相手からACKが返ってこない)
             -1=他のマスターとのバス衝突発生
  例)連続測定頻度は2回(1秒に2回=500ms毎)で、精度は高にて計測開始の場合
   int ans ;
   char buf[12] ;
   SHT3x_ContiStart(SHT3X_MPS_2,SHT3X_MPS2_H) ;
   while(1) {
     ans = SHT3x_MeasureRead(SHT3X_CONTI_MODE) ;  // 連続測定モードで読み込む
     if (ans == 0) {
       sprintf(buf,"%.2f %.2f",Humidity,Temperature) ;
     }
     __delay_ms(1000) ;
   }

  測定頻度を最多(1秒に10回)に設定すると、本センサーは自己発熱を起こす場合があります。らしい

ans = SHT3x_ContiStop( )
 デバイスへ連続測定中止を送信する処理です。
  ans       :戻り値   0=正常終了、それ以外はエラーです
             1=異常(相手からACKが返ってこない)
            -1=他のマスターとのバス衝突発生

ans = SHT3x_CMDsend(*command)
 デバイスへコマンドを送信する処理です。
  *command: 送信するコマンドの格納先を指定します(2byte書込む)
  ans          :戻り値   0=正常終了、それ以外はエラーです
              1=異常(相手からACKが返ってこない)
             -1=他のマスターとのバス衝突発生
  例)ステータスレジスタのデータ消去コマンドを発行する場合
   unsigned char data[2] ;
   data[0] = 0x30 ;      // コマンドのMSB
   data[1] = 0x41 ;      // コマンドのLSB
   SHT3x_CMDsend(data) ;

skI2CLCDlib.c
skI2CLCDlib.h
skI2Clib.c
skI2Clib.h

この内容は”秋月電子I2C接続小型LCDモジュールに表示を行う”を参照下さい。

尚、システムクロックを変えた人は"skI2CLCDlib.h"/"skI2Clib.h"のファイルを変更する必要が有ります。
又、SHT31-DISはI2C通信速度が最大1MHz対応ですが、LCDの速度は最大400KHzまでです。
だからぁ、ここでは400KHzで行っています。

《その他》

このセンサーは、電源が3.3/5.0V何方も利用出来てぇ、初期化等が必要ないのでぇ使いやすい
又、センサーにはフィルタ(カバー)付きが有る様なのでぇそれを使ってほしかった様なぁ気がするですぅ。




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.