温湿度センサーSHT31を使う場合の注意点(まとめ)

Part1Part2Part3で得られた知見を元に、センシリオン製温湿度センサーSHT31を使って温湿度を測定してCOMに表示するスケッチを書いてみました。ご参考になれば幸いです。また、このスケッチで得られるCOMの表示を図1に示します。

 

// SHT31から温湿度データを読み出し、COMに表示する。

#include <Wire.h>

int SHT31_Address = 0x45;// SHT31のI2Cアドレス(7ビット)
int Ta_MSB,Ta_LSB,Ta_CRC,RH_MSB,RH_LSB,RH_CRC;
float Ta, RH;
// Taは温度データ変数、RHは、相対湿度データ変数

void setup()
{
Wire.begin(); //Wireライブラリを使って、I2Cの有効化
Serial.begin(9600); //シリアル通信スピードを9600bpsに設定

//ソフトウエアリセットコマンド送信
Wire.beginTransmission(SHT31_Address);
Wire.write(0x30);
Wire.write(0xA2);
Wire.endTransmission();
delay(1);

//ステータスレジスタクリア
Wire.beginTransmission(SHT31_Address);
Wire.write(0x30);
Wire.write(0x41);
Wire.endTransmission();
delay(1);

//内部ヒーターOFF
Wire.beginTransmission(SHT31_Address);
Wire.write(0x30);
Wire.write(0x66);
//コマンド送信終了
Wire.endTransmission();
delay(1);
}

void loop()
{
//SHT31にI2C経由でコマンド送信開始
Wire.beginTransmission(SHT31_Address);
//シングルショットモードで測定
//MSB部のコマンド。0x24はクロック・ストレッチ無効とする
Wire.write(0x24);
//LSB部のコマンド。0x00は繰り返し精度「高」
Wire.write(0x00);
//コマンド送信終了
Wire.endTransmission();
delay(20);

//SHTー31に対して、I2C経由で6バイト分のデータを読むようにリクエスト
Wire.requestFrom(SHT31_Address,6);
//6バイト準備されるまで待つ
while (Wire.available()<6){
}
//読み込み開始
Ta_MSB=Wire.read();
Ta_LSB=Wire.read();
Ta_CRC=Wire.read();
RH_MSB=Wire.read();
RH_LSB=Wire.read();
RH_CRC=Wire.read();

//得られたデータから、温度と湿度を計算する

//温度は、Ta=-45+175*(Ta_MSB+Ta_LSB)/(2^16-1) 単位は摂氏
Ta = -45 + 175 * ((Ta_MSB * 256.0) + Ta_LSB)/(pow(2,16)-1);

Serial.print(“Temperature :”);
Serial.print(Ta,1);
Serial.println(” *C”);

//湿度は、RH=100*(RH_MSB+RH_LSB)/(2^16-1) 単位は%
RH = 100 * ((RH_MSB * 256.0) + RH_LSB)/(pow(2,16)-1);

Serial.print(“Relative Humidity :”);
Serial.print(RH,0);
Serial.println(” %”);
Serial.println(” “);

delay(1000);
}

図1 上記スケッチを走らせた時に得られるCOMの表示

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください