ホームホーム

温湿度センサ SHT31 を使ってみる

はじめに

SHT31 はセンシリオン製の高精度温湿度センサです。 精度は,温度が ±0.2℃,湿度が ±2% となっています。 今回は,STM32 マイコン(STM32F446RE)と接続して,温湿度を取得してみます。

SHT31
川内 康雄 (著)

接続

SHT31 そのものは極小の表面実装パッケージで扱いにくいので,SHT31 を搭載した秋月電子の「SHT31使用 高精度温湿度センサモジュールキット AE-SHT31」(通販コード K-12125)を使用しました。

マイコンボードは,STMicroelectronics の STM32F446RE を搭載した NUCLEO-F446RE を使用しました。

マイコンとセンサの接続は I2C なので,SCL と SDA の2本を接続します。プルアップ抵抗は AE-SHT31 に内蔵されているので外付け不要です。

電源は 3.3 V を供給します。

ADR 端子のレベルでスレーブアドレスが決まります。 今回は ADR 端子を開放としました。 AE-SHT31 上でプルアップされているので,SHT31 の入力としてはハイレベルとなります。 この場合,スレーブアドレスは,0x45 となります。

SHT31 接続

測定と読み出し

温湿度を測定するには I2C で,測定用のコマンドを送信し,測定完了後に値を読み出すという流れになります。 測定コマンドはクロックストレッチの有無と,繰り返し精度の高,中,低の組み合わせで 6 通りあります。 今回は,クロックストレッチは使わずに,精度は高で測定してみます。測定開始のコードは以下のようになります。

    uint8_t data[] = { 0x24, 0x00 };    // 測定コマンド,クロックストレッチ:無効,精度:高
    HAL_I2C_Master_Transmit(phi2c, 0x45 << 1, data, 2, 1000);

測定にかかる時間は繰り返し精度によって変わります。 精度:高の場合,最大 15 ms かかるので,15 ms 以上待ってから,測定結果を読み取ります。

読み出すデータは全部で 6 バイトで,温度の測定値 2 バイトと CRC 1 バイト,湿度の測定値 2 バイトと CRC 1 バイトの順で送られてきます。 生の測定値を読み出すコードは以下のようになります。CRC のチェック等は省略しています。

    uint8_t buf[6];
    
    HAL_I2C_Master_Receive(phi2c, 0x45 << 1, buf, 6, 1000);

    int ST = buf[0] << 8 | buf[1];   // 温度
    int SRH = buf[3] << 8 | buf[4];  // 湿度

測定値の換算

生の測定値を通常使われている単位(温度:℃,湿度:%RH) に換算するには次のようにします。

    double T = -45.0 + 175.0 * ST / 65535.0;
    double RH = 100.0 * SRH / 65535.0;

おまけ

この記事で使ったものと違いますが,SHT31 を搭載したモジュールはアマゾンでも買えます。プルアップ抵抗も内蔵しているので AE-SHT31 と同じように使えそうです。

川内 康雄 (著)