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-AD1B | 0x44 |
| SHT40-BD1B | 0x45 |
| SHT40-CD1B | 0x46 |
つまり、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デバイスを接続する方法については、以下の記事でも詳しく解説しています。

SHT30とSHT40の違いは?
SHT40を検討していると、同じSensirion製の「SHT30」を見かけることがあります。
SHT30はSHT3xシリーズ、SHT40はより新しいSHT4xシリーズに属する温湿度センサーです。
どちらも温度・湿度を測定でき、I²Cに対応していますが、仕様やパッケージ、通信コマンドなどには違いがあります。
| 項目 | SHT30 | SHT40 |
|---|---|---|
| シリーズ | SHT3x | SHT4x |
| 測定対象 | 温度・湿度 | 温度・湿度 |
| 通信方式 | I²C | I²C |
| パッケージサイズ | 約2.5 × 2.5 × 0.9mm | 約1.5 × 1.5 × 0.5mm |
| 電源電圧 | 2.4~5.5V | 1.08~3.6V |
| I²Cアドレス | 0x44 / 0x45 | 0x44 / 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 | 電源 |
| GND | GND |
| SDA | I²Cデータ |
| SCL | I²Cクロック |
I²Cでは、SDAとSCLの2本の信号線を複数のデバイスで共有できます。
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スキャナの使い方については、こちらの記事で解説しています。

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についてはこちらの記事で詳しく解説します。

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

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の詳細はこちら

サンプルプログラムとREADMEも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つのセンサーを動かした後は、複数デバイスを同時に制御する実験にも発展させることができます。

