Arduinoのサンプルプログラム

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

当記事では、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 単発測定コマンド

設定条件 コマンド
繰り返し
精度レベル
クロック
ストレッチ
MSB LSB
有効 0x2C 06
0D
10
無効 0x24 00
0B
16

SHT31 連続測定コマンド

設定条件 コマンド
繰り返し
精度レベル
速度頻度
[測定回数/sec]
MSB LSB
0.5 0x20 32
24
2F
1 0x21 30
26
2D
2 0x22 36
20
2B
4 0x23 34
22
29
10 0x27 37
21
2A

SHT31 その他のコマンド

コマンド内容 コマンド
MSB LSB
測定データ取り込み 0xE0 00
ART機能付き
周期的連続測定
0x2B 32
測定中止 0x30 93
ソフトリセット 0x30 A2
ヒーター稼働 0x30 6D
ヒーター停止 0x30 66
ステータスレジスタの
読み出し
0xF3 2D
ステータスレジスタの
データ消去
0x30 41


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秒待機)
}

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

読み出した温度・湿度の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秒待機)
}

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

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

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

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

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

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

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

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

テキストのコピーはできません。