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のより詳細なコマンド内容を確認したい場合は、以下のリンク先にある取扱説明書と仕様書をご覧ください。
サンプルプログラム(サンプルスケッチ)
- SHT31使用 高精度温湿度センサモジュールキット
- Arduino Uno
- USBケーブル
- ブレッドボード
- ジャンパ線
- 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を実現したい方におすすめです。