Arduino-温度・湿度センサ「SHT31」の使い方

  • URLをコピーしました!

当記事では、Arduinoで温度・湿度センサ「SHT31」を使う方法を詳しく解説します。

温度・湿度センサ「SHT31」はI2Cで制御するため、ArduinoのWireライブラリを使ったプログラムで動作させます。

なお、その他のArduino関数・ライブラリについては、以下の記事をご覧ください。

目次

温度・湿度センサ「SHT31」の基本スペック

「SHT31」はI2C制御で、温度・湿度を測定できるセンサです。

当記事では、基板にモジュール化された秋月電子通商の「SHT31使用 高精度温湿度センサモジュールキット」を使用して、サンプルプログラムを解説していきます。

基本スペックSHT31
電源電圧DC2.4~5.5V
通信方式I2C(最大1MHz)
測定レンジ/
測定精度
温度:-40~+125℃/±0.2℃(@0~90℃)
相対湿度:0~100%/±2%(@0~90℃)
反応時間(τ63%)温度:2sec
湿度:8sec
データビット数温度/湿度:16bit
消費電流単発測定待機時:0.2uA
連続測定待機時:45uA
測定時:800uA

SHT31のより詳細なスペックを確認したい場合は、以下のリンク先にある取扱説明書と仕様書をご覧ください。

温度・湿度センサ「SHT31」のコマンド

SHT31 単発測定コマンド

設定条件コマンド
繰り返し
精度レベル
クロック
ストレッチ
MSBLSB
有効0x2C06
0D
10
無効0x2400
0B
16

SHT31 連続測定コマンド

設定条件コマンド
繰り返し
精度レベル
速度頻度
[測定回数/sec]
MSBLSB
0.50x2032
24
2F
10x2130
26
2D
20x2236
20
2B
40x2334
22
29
100x2737
21
2A

SHT31 その他のコマンド

コマンド内容コマンド
MSBLSB
測定データ取り込み0xE000
ART機能付き
周期的連続測定
0x2B32
測定中止0x3093
ソフトリセット0x30A2
ヒーター稼働0x306D
ヒーター停止0x3066
ステータスレジスタの
読み出し
0xF32D
ステータスレジスタの
データ消去
0x3041

SHT31のより詳細なコマンド内容を確認したい場合は、以下のリンク先にある取扱説明書と仕様書をご覧ください。

サンプルプログラム(サンプルスケッチ)

Arduino Uno 温度・湿度センサ SHT31 配線図
用意するもの
  1. SHT31使用 高精度温湿度センサモジュールキット
  2. Arduino Uno
  3. USBケーブル
  4. ブレッドボード
  5. ジャンパ線
  6. PC(プログラム書き込み・シリアルモニタ表示)

サンプルプログラム(サンプルスケッチ)で、ブレッドボードを使います。ブレッドボードの詳しい使い方は、以下の記事をご覧ください。

温度・湿度センサ「SHT31」の単発測定

#include <Wire.h>

//アドレス指定
#define SHT31_ADDR 0x45
#define SOFT_RESET_MSB 0x30
#define SOFT_RESET_LSB 0xA2
#define CLEAR_STATUS_REGISTER_MSB 0x30
#define CLEAR_STATUS_REGISTER_LSB 0x41
#define SINGLE_SHOT_HIGH_MSB 0x24
#define SINGLE_SHOT_HIGH_LSB 0x00

void setup()
{
  Serial.begin(9600);//シリアル通信を9600bpsで初期化
  Wire.begin();//I2Cを初期化

  Wire.beginTransmission(SHT31_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(SOFT_RESET_MSB);//ソフトリセットMSB
  Wire.write(SOFT_RESET_LSB);//ソフトリセットLSB
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
  delay(500);//500msec待機(0.5秒待機)

  Wire.beginTransmission(SHT31_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始 
  Wire.write(CLEAR_STATUS_REGISTER_MSB);//ステータスレジスタ消去MSB
  Wire.write(CLEAR_STATUS_REGISTER_LSB);//ステータスレジスタ消去LSB
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
  delay(500);//500msec待機(0.5秒待機)
}

void loop() {
  //変数宣言
  unsigned int dac[6];
  unsigned int i, t ,h;
  float temperature, humidity;

  Wire.beginTransmission(SHT31_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(SINGLE_SHOT_HIGH_MSB);//単発測定・繰り返し精度レベル高・クロックストレッチ無効 MSB
  Wire.write(SINGLE_SHOT_HIGH_LSB);//単発測定・繰り返し精度レベル高・クロックストレッチ無効 LSB
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
  delay(300);//300msec待機(0.3秒待機)

  Wire.requestFrom(SHT31_ADDR, 6);//dI2Cデバイス「SHT31」に6Byteのデータ要求
  for (i=0; i<6; i++){
      dac[i] = Wire.read();//dacにI2Cデバイス「SHT31」のデータ読み込み
  }
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  t = (dac[0] << 8) | dac[1];//1Byte目のデータを8bit左にシフト、OR演算子で2Byte目のデータを結合して、tに代入
  temperature = (float)(t) * 175 / 65535.0 - 45.0;//温度の計算、temperatureに代入
  h = (dac[3] << 8) | dac[4];////4Byte目のデータを8bit左にシフト、OR演算子で5Byte目のデータを結合して、hに代入
  humidity = (float)(h) / 65535.0 * 100.0;//湿度の計算、humidityに代入
  
  Serial.print("温度:");//文字列「温度:」をシリアルモニタに送信
  Serial.print(temperature);//「temperature」をシリアルモニタに送信
  Serial.println("℃");//文字列「℃」をシリアルモニタに送信、改行
  Serial.print("湿度:");//文字列「湿度:」をシリアルモニタに送信
  Serial.print(humidity);//「humidity」をシリアルモニタに送信
  Serial.println("%");//文字列「%」をシリアルモニタに送信、改行

  delay(1000);//1000msec待機(1秒待機)
}
シリアルモニタ例

温度:25.77℃
湿度:62.38%
温度:25.88℃
湿度:62.05%
温度:25.91℃
湿度:61.75%
温度:25.98℃
湿度:61.52%
温度:26.05℃
湿度:61.25%

サンプルプログラムでは、セットアップでソフトリセット、ステータスレジスタ消去を行い、ループで単発の温度・湿度測定を行います。

読み出した温度・湿度の16bitデータは、それぞれ温度と湿度の値に換算して、シリアルモニタに表示させます。

温度・湿度センサ「SHT31」の連続測定

#include <Wire.h>

//アドレス指定
#define SHT31_ADDR 0x45
#define SOFT_RESET_MSB 0x30
#define SOFT_RESET_LSB 0xA2
#define CLEAR_STATUS_REGISTER_MSB 0x30
#define CLEAR_STATUS_REGISTER_LSB 0x41
#define PERIODIC_HIGH_1_MSB 0x21
#define PERIODIC_HIGH_1_LSB 0x30

void setup()
{
  Serial.begin(9600);//シリアル通信を9600bpsで初期化
  Wire.begin();//I2Cを初期化

  Wire.beginTransmission(SHT31_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(SOFT_RESET_MSB);//ソフトリセットMSB
  Wire.write(SOFT_RESET_LSB);//ソフトリセットLSB
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
  delay(500);//500msec待機(0.5秒待機)

  Wire.beginTransmission(SHT31_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始 
  Wire.write(CLEAR_STATUS_REGISTER_MSB);//ステータスレジスタ消去MSB
  Wire.write(CLEAR_STATUS_REGISTER_LSB);//ステータスレジスタ消去LSB
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
  delay(500);//500msec待機(0.5秒待機)

  Wire.beginTransmission(SHT31_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
  Wire.write(PERIODIC_HIGH_1_MSB);//連続測定・繰り返し精度レベル高・測定頻度1mps MSB
  Wire.write(PERIODIC_HIGH_1_LSB);//連続測定・繰り返し精度レベル高・測定頻度1mps LSB
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
  delay(300);//300msec待機(0.3秒待機)
}

void loop() {
  //変数宣言
  unsigned int dac[6];
  unsigned int i, t ,h;
  float temperature, humidity;

  Wire.requestFrom(SHT31_ADDR, 6);//dI2Cデバイス「SHT31」に6Byteのデータ要求
  for (i=0; i<6; i++){
      dac[i] = Wire.read();//dacにI2Cデバイス「SHT31」のデータ読み込み
  }
  Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了

  t = (dac[0] << 8) | dac[1];//1Byte目のデータを8bit左にシフト、OR演算子で2Byte目のデータを結合して、tに代入
  temperature = (float)(t) * 175 / 65535.0 - 45.0;//温度の計算、temperatureに代入
  h = (dac[3] << 8) | dac[4];////4Byte目のデータを8bit左にシフト、OR演算子で5Byte目のデータを結合して、hに代入
  humidity = (float)(h) / 65535.0 * 100.0;//湿度の計算、humidityに代入
  
  Serial.print("温度:");//文字列「温度:」をシリアルモニタに送信
  Serial.print(temperature);//「temperature」をシリアルモニタに送信
  Serial.println("℃");//文字列「℃」をシリアルモニタに送信、改行
  Serial.print("湿度:");//文字列「湿度:」をシリアルモニタに送信
  Serial.print(humidity);//「humidity」をシリアルモニタに送信
  Serial.println("%");//文字列「%」をシリアルモニタに送信、改行

  delay(1000);//1000msec待機(1秒待機)
}
シリアルモニタ例

温度:29.70℃
湿度:50.53%
温度:29.77℃
湿度:50.13%
温度:29.77℃
湿度:49.79%
温度:29.75℃
湿度:49.73%
温度:29.76℃
湿度:49.67%

サンプルプログラムでは、セットアップでソフトリセット、ステータスレジスタ消去、温度・湿度の連続測定設定を行います。

ループで、読み出した温度・湿度の16bitデータは、それぞれ温度と湿度の値に換算して、シリアルモニタに表示させます。

おすすめのArduinoボードはどれ?

当記事『Arduino-温度・湿度センサ「SHT31」の使い方』では、Arduino Unoを使用したサンプルプログラムを解説してきました。

やはり、たくさんの種類のあるArduinoボードの中でも、最も基本的なエディションのArduino Unoがおすすめなのですが、Arduino Unoと電子部品を組み合わせたキットも存在します。

電子工作初心者にとっては、いちいち電子部品を別途購入する必要がないので非常に有用です。以下の記事で初心者でもわかりやすいように、ランキング形式でおすすめのArduino Unoを紹介しているので、ぜひご覧ください。

また、以下の記事で、安価でWi-Fi/Bluetoothに対応している「ESP32開発ボード」についてもまとめてみました。

このボードは、Arduinoボードではありませんが、Arduino IDEでソフト開発ができるため、電子工作でIoTを実現したい方におすすめです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次