SHT40とは?Arduino・ESP32で温度・湿度を測定する方法を解説

センサ―

SHT40は、Sensirion(センシリオン)が開発したデジタル温湿度センサーです。

1つの小さなICで温度と相対湿度の両方を測定でき、マイコンとはI²Cで通信します。

ArduinoやESP32などから扱いやすく、室内環境の測定、IoT機器、データロガー、空調制御など、さまざまな用途に利用できます。

この記事では、SHT40の特徴やI²Cアドレス、SHT30との違いから、Arduino・ESP32で実際に温度と湿度を取得する方法まで解説します。

また、記事後半ではSHT40を搭載した「KUMITATE-SENSOR」を使用して、実際にセンサーの値を読み取ります。

SHT40とは?

SHT40は、スイスのSensirionが提供しているSHT4xシリーズのデジタル温湿度センサーです。

センサー内部には温度センサー、湿度センサー、信号処理回路、I²Cインターフェースなどが組み込まれており、マイコンから測定コマンドを送信することで温度と湿度をデジタル値として取得できます。

SHT40の代表的な特徴は次のとおりです。

  • 温度と湿度を1つのICで測定できる
  • I²C通信に対応
  • 小型パッケージ
  • 低消費電力
  • 工場出荷時に校正済み
  • ヒーター機能を搭載
  • ArduinoやESP32などから利用可能

SHT40の動作湿度範囲は0~100%RHで、標準的なSHT40では湿度精度±1.8%RH、温度精度±0.2℃とされています。

電源電圧は1.08~3.6Vのため、ESP32などの3.3V系マイコンと組み合わせやすいセンサーです。

SHT40の主な仕様

代表的なSHT40の仕様をまとめると次のようになります。

項目SHT40
測定対象温度・相対湿度
インターフェースI²C
湿度測定範囲0~100%RH
標準湿度精度±1.8%RH
標準温度精度±0.2℃
電源電圧1.08~3.6V
I²Cアドレス0x44 / 0x45 / 0x46(型番による)
ヒーター搭載

SHT40は非常に小型のICなので、単体ICをブレッドボードへ直接挿して使用するような部品ではありません。

電子工作では、SHT40が実装されたセンサーモジュールや評価基板を使用すると扱いやすくなります。

SHT40のI²Cアドレスは0x44だけではない

SHT40について調べると、I²Cアドレスとして「0x44」と書かれている例をよく見かけます。

しかし、SHT40にはI²Cアドレスの異なる製品が用意されています。

代表的な型番とアドレスの関係は次のとおりです。

型番I²Cアドレス
SHT40-AD1B0x44
SHT40-BD1B0x45
SHT40-CD1B0x46

つまり、SHT40だから必ず0x44というわけではありません。

SensirionのSHT4xデータシートでも、SHT40-xD1Bでは0x44、0x45、0x46のI²Cアドレスが用意されています。

使用するSHT40の正確な型番を確認してから、プログラム側のI²Cアドレスを設定しましょう。

A・B・Cでアドレスが異なる

型番を見ると、

  • SHT40-AD1B → 0x44
  • SHT40-BD1B → 0x45
  • SHT40-CD1B → 0x46

となっています。

この違いを利用すれば、異なるアドレスのSHT40を同じI²Cバスへ接続することもできます。

同じI²Cバスへ複数のデバイスを接続する場合、それぞれをI²Cアドレスによって識別するためです。

複数のI²Cデバイスを接続する方法については、以下の記事でも詳しく解説しています。

Arduino・ESP32で複数のI²Cセンサーを同時に使う方法|アドレス重複の対処も解説
ArduinoやESP32でI²Cセンサーを使っていると、「SDAとSCLに複数のセンサーを接続しても大丈夫?」と疑問に思うことがあります。結論からいうと、I²Cは複数のデバイスで同じSDA・SCLを共有できる通信方式です。例えば、温湿度セ…

SHT30とSHT40の違いは?

SHT40を検討していると、同じSensirion製の「SHT30」を見かけることがあります。

SHT30はSHT3xシリーズ、SHT40はより新しいSHT4xシリーズに属する温湿度センサーです。

どちらも温度・湿度を測定でき、I²Cに対応していますが、仕様やパッケージ、通信コマンドなどには違いがあります。

項目SHT30SHT40
シリーズSHT3xSHT4x
測定対象温度・湿度温度・湿度
通信方式I²CI²C
パッケージサイズ約2.5 × 2.5 × 0.9mm約1.5 × 1.5 × 0.5mm
電源電圧2.4~5.5V1.08~3.6V
I²Cアドレス0x44 / 0x450x44 / 0x45 / 0x46(製品による)
ヒーター搭載搭載

特に大きな違いの一つがサイズです。

SHT40はSHT30よりも小型化されています。

また電源条件も異なります。SHT30-DISは2.4~5.5Vで動作するのに対し、SHT40は1.08~3.6Vです。

そのため、SHT30を使用していた回路へSHT40をそのまま載せ替えればよい、というものではありません。

パッケージサイズやピン配置だけでなく、電源条件やI²Cコマンドも確認する必要があります。

I²Cアドレスの決まり方も違う

SHT30-DISではADDRピンの状態によってI²Cアドレスを選択でき、

  • ADDR = Low → 0x44
  • ADDR = High → 0x45

となります。

一方、SHT40では使用する製品バリエーションによってアドレスが決まります。

「どちらも0x44だから同じように使える」と判断せず、使用する型番のデータシートを確認することが重要です。

SHT40はI²Cで通信する

SHT40とマイコンの通信にはI²Cを使用します。

基本的に使用する信号は次の4本です。

信号内容
VDD電源
GNDGND
SDAI²Cデータ
SCLI²Cクロック

I²Cでは、SDAとSCLの2本の信号線を複数のデバイスで共有できます。

I²Cそのものの仕組みについては、以下の記事で詳しく解説しています。

I²Cとは?通信の仕組みを解説

※ここには既存のI²C解説記事へのリンクを設定してください。

I²CスキャナでSHT40を確認する

SHT40が正しく接続できているか分からない場合は、最初にI²Cスキャナを実行すると便利です。

I²Cスキャナは、I²Cバス上に存在するデバイスのアドレスを調べるプログラムです。

例えばSHT40-AD1Bが正常に認識されていれば、

0x44

が検出されます。

SHT40-BD1Bなら0x45、SHT40-CD1Bなら0x46です。

I²Cスキャナの使い方については、こちらの記事で解説しています。

Arduino・ESP32でI²Cスキャナを使う方法|I²Cアドレスを調べるサンプルコード
I²CセンサーをArduinoやESP32へ接続したものの、「センサーが認識されない」「I²Cアドレスが分からない」ということはありませんか?そんなときに便利なのがI²Cスキャナ(I2C Scanner)です。I²Cスキャナを実行すると、S…

SHT40から温度・湿度を取得する仕組み

ここからは、SHT40がどのように温度と湿度を返しているのか見てみましょう。

今回はライブラリにすべて任せるのではなく、ArduinoのWireを使って直接SHT40と通信します。

この方法を知っておくと、I²C通信そのものの理解にもつながります。

SHT40には複数の測定コマンドがあります。

高精度測定を行う場合は、

0xFD

を送信します。

SHT40は測定後、6バイトのデータを返します。

内容は次のようになっています。

バイト内容
0温度データ上位8bit
1温度データ下位8bit
2温度CRC
3湿度データ上位8bit
4湿度データ下位8bit
5湿度CRC

つまり、

測定コマンド0xFDを送信 → 測定を待つ → 6バイト読み取る

という流れです。

RAWデータを温度・湿度へ変換する

SHT40から取得した値は、そのまま℃や%RHを表しているわけではありません。

16bitのRAWデータを実際の温度と湿度へ変換します。

温度は次の式で求められます。

温度[℃] = -45 + 175 × RAW温度 / 65535

湿度は次の式です。

湿度[%RH] = -6 + 125 × RAW湿度 / 65535

この変換式もSensirionのデータシートで定義されています。

ライブラリを使う場合は内部でこうした処理が行われますが、自分でI²C通信を行うことで「センサーから取得したデータがどのように温度や湿度になるのか」まで確認できます。

Arduino・ESP32でSHT40を読み取るサンプルプログラム

ここではESP32系マイコンからSHT40を読み取ってみます。

以下はSHT40-AD1B(I²Cアドレス0x44)を想定した例です。

#include <Wire.h>

#define SHT40_ADDR 0x44

void setup() {
  Serial.begin(115200);

  Wire.begin();

  delay(100);

  Serial.println("SHT40 start");
}

void loop() {

  // 高精度測定コマンドを送信
  Wire.beginTransmission(SHT40_ADDR);
  Wire.write(0xFD);

  if (Wire.endTransmission() != 0) {
    Serial.println("SHT40 communication error");
    delay(1000);
    return;
  }

  // 測定完了を待つ
  delay(10);

  // 6バイト読み取る
  Wire.requestFrom(SHT40_ADDR, 6);

  if (Wire.available() == 6) {

    uint16_t rawTemp =
      ((uint16_t)Wire.read() << 8) |
      Wire.read();

    Wire.read(); // Temperature CRC

    uint16_t rawHumidity =
      ((uint16_t)Wire.read() << 8) |
      Wire.read();

    Wire.read(); // Humidity CRC

    float temperature =
      -45.0 + 175.0 * rawTemp / 65535.0;

    float humidity =
      -6.0 + 125.0 * rawHumidity / 65535.0;

    // 0~100%RHへ制限
    if (humidity > 100.0) humidity = 100.0;
    if (humidity < 0.0) humidity = 0.0;

    Serial.print("Temperature: ");
    Serial.print(temperature, 2);
    Serial.println(" C");

    Serial.print("Humidity: ");
    Serial.print(humidity, 2);
    Serial.println(" %RH");

    Serial.println();
  }

  delay(1000);
}

使用するマイコンボードによってSDA・SCLピンが異なる場合は、Wire.begin()の設定を使用するボードに合わせて変更してください。

なお、この簡易サンプルではCRC値を読み捨てています。

製品開発など、通信データの信頼性を重視する用途では、データシートに記載されているCRC-8を使って受信データを検証する実装を推奨します。

KUMITATE-C3でSHT40を使用する場合

KUMITATE-C3では、今回製作したKUMITATE-SENSORを接続してSHT40を使用できます。

KUMITATE-SENSORにはSHT40だけでなく、

  • SHT40-A:温度・湿度
  • BH1750:照度
  • MSA3S02:3軸加速度

の3種類のセンサーを搭載しています。

すべてI²Cで制御できるため、1組のSDA/SCLを使って複数種類のセンサーデータを取得できます。

BH1750についてはこちらの記事で詳しく解説します。

BH1750とは?Arduino・ESP32で照度(lux)を測定する方法を解説
BH1750は、周囲の明るさを測定できるデジタル照度センサーです。測定した明るさを「lux(ルクス)」として取得でき、ArduinoやESP32などのマイコンとはI²Cで通信します。明るさに応じて照明を制御したり、室内環境を記録したり、ディ…

MSA3S02についてはこちらです。

3軸加速度センサのMSA3S02をArduino・ESP32で測定する方法を解説
MSA3S02は、X・Y・Zの3方向の加速度を測定できるデジタル3軸加速度センサーです。ArduinoやESP32などのマイコンとはI²Cで通信でき、基板の傾きや動き、振動などを検出できます。加速度センサーというとMPU6050などがよく知…

SHT40を実際に試すならKUMITATE-SENSOR

SHT40を単体ICから基板へ実装するには、小型パッケージのはんだ付けや周辺回路の設計が必要になります。

「まずSHT40を動かしてみたい」「I²C通信を勉強したい」という場合は、SHT40を実装済みのセンサーボードを使用すると簡単です。

KUMITATE-SENSORは、SHT40による温度・湿度測定に加えて、BH1750による照度測定、MSA3S02による3軸加速度測定を1枚で試せるセンサーボードです。

KUMITATE-C3だけでなく、3.3V系I²Cに対応した各種マイコンから利用できます。

さらにHY2.0-4Pコネクタを搭載しているため、M5StackのI²Cセンサーなどを同じI²Cバスへ追加して実験することもできます。

KUMITATE-SENSORの詳細はこちら

KUMITATE-SENSOR
/* KUMITATE-SENSOR商品詳細専用。既存の追加CSSより後ろへ貼り付け */body:has(.kd-product) .content-item-wrap,body:has(.kd-product) .entry-conte…

サンプルプログラムとREADMEもGitHubで公開しています。

KUMITATE-C3/KUMITATE_SENSOR.ino/readme.md at main · tateprohime/KUMITATE-C3
KUMITATE-C3に使用するプログラムレシピ集. Contribute to tateprohime/KUMITATE-C3 development by creating an account on GitHub.

まとめ

SHT40は、温度と湿度をI²Cで取得できる小型のデジタル温湿度センサーです。

ArduinoやESP32などから扱いやすく、温湿度ロガーやIoT機器、室内環境モニターなど幅広い用途に利用できます。

SHT40を使用するときに覚えておきたいポイントは次のとおりです。

  • SHT40は温度と湿度を測定できる
  • I²Cでマイコンと通信する
  • SHT40-AD1Bは0x44
  • SHT40-BD1Bは0x45
  • SHT40-CD1Bは0x46
  • 高精度測定コマンドは0xFD
  • 6バイトの測定データから温度・湿度を計算できる
  • SHT30とはサイズ、電源条件、アドレス設定方法、通信コマンドなどが異なる
  • ESP32などの3.3V系マイコンから利用しやすい

ライブラリを利用すれば簡単に値を取得できますが、SHT40はI²C通信の仕組みそのものを学ぶ題材としても適しています。

KUMITATE-SENSORではSHT40・BH1750・MSA3S02を同じI²Cバス上で使用できるので、1つのセンサーを動かした後は、複数デバイスを同時に制御する実験にも発展させることができます。

関連記事

KUMITATE

読むだけでなく、
実際に動かして学びませんか?

クミタテは、組み込み開発や電子工作を 実践しながら学べる学習プラットフォームです。 ESP32を使ったプログラミングから、電子回路、センサー、 通信、基板設計まで、自分のペースで学習できます。

  • 無料で学べる実践的な教材を掲載
  • すぐに試せるサンプルプログラム付き
  • Googleアカウントですぐに登録可能
クミタテに無料登録する
センサ―
スポンサーリンク